Created
June 25, 2019 07:29
-
-
Save Muscipular/08b97f69e682a8874ccc0d77d35c5652 to your computer and use it in GitHub Desktop.
RedisMonitor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"host": "127.0.0.1", | |
"port": 6379, | |
"password": "111111" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.IO; | |
using System.IO.Compression; | |
using System.Linq; | |
using System.Text.Json; | |
using System.Text.Json.Serialization; | |
using System.Text.RegularExpressions; | |
using System.Threading; | |
using System.Threading.Tasks; | |
using StackExchange.Redis; | |
namespace Redis_Monitor | |
{ | |
class Program | |
{ | |
static async Task Main(string[] args) | |
{ | |
var config = JsonDocument.Parse(File.ReadAllText("config.json")); | |
var options = new ConfigurationOptions(); | |
options.AllowAdmin = true; | |
options.Password = config.RootElement.GetProperty("password").GetString(); | |
options.EndPoints.Add(config.RootElement.GetProperty("host").GetString(), config.RootElement.GetProperty("port").GetInt32()); | |
var multiplexer = await StackExchange.Redis.ConnectionMultiplexer.ConnectAsync(options); | |
var server = multiplexer.GetServer(multiplexer.GetEndPoints()[0]); | |
Console.WriteLine("Start Monitor!"); | |
int count = 0; | |
var fileStream = File.AppendText($"log-{DateTime.Now:yyyyMMddHHmm}.csv"); | |
var headers = new[] { "connected_clients", "used_memory", "instantaneous_ops_per_sec", "instantaneous_input_kbps", "instantaneous_output_kbps" }; | |
fileStream.Write("date,"); | |
fileStream.Write(string.Join(',', headers)); | |
fileStream.WriteLine(","); | |
while (true) | |
{ | |
try | |
{ | |
string info; | |
try | |
{ | |
info = server.InfoRaw(); | |
} | |
catch (Exception e) | |
{ | |
Console.WriteLine(e); | |
continue; | |
} | |
fileStream.Write(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); | |
fileStream.Write(','); | |
var matches = Regex.Matches(info, @"^(.*):\s*(.+)\s$", RegexOptions.Multiline); | |
foreach (var header in headers) | |
{ | |
foreach (Match match in matches) | |
{ | |
if (match.Success) | |
{ | |
if (match.Groups[1].Value == header) | |
{ | |
Console.WriteLine($"{match.Groups[1].Value} : {match.Groups[2].Value}"); | |
fileStream.Write(match.Groups[2].Value); | |
fileStream.Write(','); | |
} | |
} | |
} | |
} | |
fileStream.WriteLine(); | |
fileStream.Flush(); | |
count++; | |
if (count >= 3600) | |
{ | |
var path = (fileStream.BaseStream as FileStream).Name; | |
fileStream.Close(); | |
var zipArchive = ZipFile.Open(path + ".zip", ZipArchiveMode.Create); | |
var entry = zipArchive.CreateEntry(Path.GetFileName(path)); | |
var zStream = entry.Open(); | |
var openRead = File.OpenRead(path); | |
await openRead.CopyToAsync(zStream); | |
await zStream.FlushAsync(); | |
openRead.Dispose(); | |
zStream.Flush(); | |
zStream.Close(); | |
zStream.Dispose(); | |
zipArchive.Dispose(); | |
File.Delete(path); | |
fileStream = File.AppendText($"log-{DateTime.Now:yyyyMMddHHmm}.csv"); | |
count = 0; | |
} | |
} | |
catch (Exception e) | |
{ | |
Console.WriteLine(e); | |
fileStream.Close(); | |
break; | |
} | |
Thread.Sleep(1000); | |
} | |
Console.ReadKey(true); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment