garnet
180 строк · 6.3 Кб
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT license.
3
4using System;5using System.Collections.Generic;6using System.Linq;7using System.Net;8using System.Threading;9using StackExchange.Redis;10
11namespace MetricsMonitor12{
13public class ClientMonitor14{15IConnectionMultiplexer connectionMultiplexer;16Options opts;17ClusterConfiguration clusterConfig;18
19public ClientMonitor(Options opts)20{21this.opts = opts;22connectionMultiplexer = ConnectionMultiplexer.Connect(23Configuration.GetConfig(opts.Address, opts.Port, useTLS: opts.EnableTLS, tlsHost: opts.TlsHost, allowAdmin: true));24if (opts.Cluster)25clusterConfig = GetClusterConfig();26}27
28private ClusterConfiguration GetClusterConfig()29{30var clusterConfig = connectionMultiplexer.GetServer(opts.Address + ":" + opts.Port).ClusterNodes();31return clusterConfig;32}33
34public void StartMonitor()35{36if (opts.Cluster)37{38if (opts.MetricsType == Metric.LATENCY)39MonitorClusterLatencyMetrics();40else if (opts.MetricsType == Metric.INFO)41MonitorClusterServerSideMetrics();42}43else44{45if (opts.MetricsType == Metric.LATENCY)46MonitorServerSideLatency();47else if (opts.MetricsType == Metric.INFO)48MonitorServerSideMetrics();49}50}51
52public void MonitorServerSideLatency()53{54var db = connectionMultiplexer.GetDatabase(0);55string eventStr = opts.LatencyEvent.ToString();56Console.WriteLine("Reseting histogram..");57var reset = db.Execute("latency", "reset", "command");58//Wait for async reset59Thread.Sleep(1000);60List<object> cmdArgs = new List<object>()61{62"histogram",63eventStr
64};65int iter = 0;66Console.WriteLine($"[Capturing server side latency metrics for event ({opts.LatencyEvent}) using client]");67while (true)68{69RedisResult[] resp = (RedisResult[])db.Execute("latency", cmdArgs);70ProcessLatencyHistogram(resp, ref iter);71Thread.Sleep(TimeSpan.FromSeconds(opts.Poll));72}73}74
75private static bool ProcessLatencyHistogram(RedisResult[] resp, ref int iter)76{77if (resp.Length != 2)78return false;79
80string name = (string)resp[0];81RedisResult[] info = (RedisResult[])resp[1];82
83if (info.Length != 6)84return false;85
86int calls = Int32.Parse((string)info[1]);87string units = (string)info[2];88RedisResult[] latency = (RedisResult[])info[5];89
90if (latency.Length != 14)91return false;92
93if (iter++ == 0)94Console.WriteLine($"{latency[0]} (us); {latency[2]} (us); {latency[4]} (us); {latency[6]} (us); {latency[8]} (us); {latency[10]} (us); {latency[12]} (us); cnt");95
96Console.WriteLine("{0:0.0}; {1:0.0}; {2:0.0}; {3:0.0}; {4:0.0}; {5:0.0}; {6:0.0}; {7}",97latency[1],98latency[3],99latency[5],100latency[7],101latency[9],102latency[11],103latency[13],104calls);105
106return true;107}108
109public void MonitorServerSideMetrics()110{111var db = connectionMultiplexer.GetDatabase(0);112var infoType = opts.infoType;113Console.WriteLine($"[Capturing server side metrics for event ({infoType}) using client]");114while (true)115{116var resp = db.Execute("info", infoType.ToString());117connectionMultiplexer.GetEndPoints();118Console.WriteLine((string)resp);119Thread.Sleep(TimeSpan.FromSeconds(opts.Poll));120}121}122
123public void MonitorClusterServerSideMetrics()124{125var nodes = clusterConfig?.Nodes.ToArray();126var infoType = opts.infoType;127Console.WriteLine($"[Capturing server side metrics for event ({infoType}) using client]");128
129while (true)130{131for (int i = 0; i < nodes.Length; i++)132{133var endpoint = (IPEndPoint)nodes[i].EndPoint;134Console.WriteLine($"<<< {endpoint.Address}:{endpoint.Port} >>>");135var server = connectionMultiplexer.GetServer(endpoint);136var info = server.Info(infoType.ToString());137foreach (var group in info)138{139var key = group.Key;140foreach (var pair in group)141{142Console.WriteLine($"{pair.Key}:{pair.Value}");143}144}145Console.WriteLine();146}147Thread.Sleep(TimeSpan.FromSeconds(opts.Poll));148}149}150
151public void MonitorClusterLatencyMetrics()152{153var nodes = clusterConfig?.Nodes.ToArray();154var latencyType = opts.LatencyEvent;155Console.WriteLine($"[Capturing server side latency metrics for event ({latencyType}) using client]");156
157List<object> cmdArgs = new List<object>()158{159"histogram",160latencyType.ToString(),161};162int iter = 1;163while (true)164{165for (int i = 0; i < nodes.Length; i++)166{167var endpoint = (IPEndPoint)nodes[i].EndPoint;168Console.WriteLine($"<<< {endpoint.Address}:{endpoint.Port} >>>");169var server = connectionMultiplexer.GetServer(endpoint);170RedisResult[] resp = (RedisResult[])server.Execute("latency", cmdArgs);171ProcessLatencyHistogram(resp, ref iter);172Console.WriteLine();173}174Thread.Sleep(TimeSpan.FromSeconds(opts.Poll));175}176}177
178
179}180}