Browse Source

Metric writers now disposable

Nick Babcock 5 năm trước cách đây
mục cha
commit
1df05b74f2

+ 26 - 20
OhmGraphite.Test/GraphiteTest.cs

@@ -10,18 +10,21 @@ namespace OhmGraphite.Test
         [Fact, Trait("Category", "integration")]
         public async void InsertGraphiteTest()
         {
-            var writer = new GraphiteWriter("graphite", 2003, "my-pc", tags: false);
-            await writer.ReportMetrics(DateTime.Now, TestSensorCreator.Values());
-
-            // wait for carbon to sync to disk
-            Thread.Sleep(TimeSpan.FromSeconds(4));
-
+            using (var writer = new GraphiteWriter("graphite", 2003, "my-pc", tags: false))
             using (var client = new HttpClient())
             {
-                var resp = await client.GetAsync("http://graphite/render?format=csv&target=ohm.my-pc.intelcpu.0.temperature.cpucore.1");
-                var content = await resp.Content.ReadAsStringAsync();
-                Assert.Contains("ohm.my-pc.intelcpu.0.temperature.cpucore.1", content);
+                await writer.ReportMetrics(DateTime.Now, TestSensorCreator.Values());
+
+                // wait for carbon to sync to disk
+                Thread.Sleep(TimeSpan.FromSeconds(4));
+
+                {
+                    var resp = await client.GetAsync("http://graphite/render?format=csv&target=ohm.my-pc.intelcpu.0.temperature.cpucore.1");
+                    var content = await resp.Content.ReadAsStringAsync();
+                    Assert.Contains("ohm.my-pc.intelcpu.0.temperature.cpucore.1", content);
+                }
             }
+
         }
 
         [Fact, Trait("Category", "integration")]
@@ -30,19 +33,22 @@ namespace OhmGraphite.Test
             // Let the tag engine time to breathe
             Thread.Sleep(TimeSpan.FromSeconds(2));
 
-            var writer = new GraphiteWriter("graphite", 2003, "my-pc", tags: true);
-            await writer.ReportMetrics(DateTime.Now, TestSensorCreator.Values());
-
-            // wait for carbon to sync to disk
-            Thread.Sleep(TimeSpan.FromSeconds(4));
-
+            using (var writer = new GraphiteWriter("graphite", 2003, "my-pc", tags: true))
             using (var client = new HttpClient())
+
             {
-                var resp = await client.GetAsync("http://graphite/render?format=csv&target=seriesByTag('sensor_type=Temperature','hardware_type=CPU')");
-                var content = await resp.Content.ReadAsStringAsync();
-                Assert.Contains("host=my-pc", content);
-                Assert.Contains("app=ohm", content);
-                Assert.Contains("sensor_type=Temperature", content);
+                await writer.ReportMetrics(DateTime.Now, TestSensorCreator.Values());
+
+                // wait for carbon to sync to disk
+                Thread.Sleep(TimeSpan.FromSeconds(4));
+
+                {
+                    var resp = await client.GetAsync("http://graphite/render?format=csv&target=seriesByTag('sensor_type=Temperature','hardware_type=CPU')");
+                    var content = await resp.Content.ReadAsStringAsync();
+                    Assert.Contains("host=my-pc", content);
+                    Assert.Contains("app=ohm", content);
+                    Assert.Contains("sensor_type=Temperature", content);
+                }
             }
         }
     }

+ 4 - 4
OhmGraphite.Test/InfluxTest.cs

@@ -11,12 +11,12 @@ namespace OhmGraphite.Test
         public async void CanInsertIntoInflux()
         {
             var config = new InfluxConfig(new Uri("http://influx:8086"), "mydb", "my_user", "my_pass");
-            var writer = new InfluxWriter(config, "my-pc");
-            await writer.ReportMetrics(DateTime.Now, TestSensorCreator.Values());
-
-            Thread.Sleep(TimeSpan.FromSeconds(1));
+            using (var writer = new InfluxWriter(config, "my-pc"))
             using (var client = new HttpClient())
             {
+                await writer.ReportMetrics(DateTime.Now, TestSensorCreator.Values());
+                Thread.Sleep(TimeSpan.FromSeconds(1));
+
                 var resp = await client.GetAsync("http://influx:8086/query?pretty=true&db=mydb&q=SELECT%20*%20FROM%20Temperature");
                 Assert.True(resp.IsSuccessStatusCode);
                 var content = await resp.Content.ReadAsStringAsync();

+ 8 - 5
OhmGraphite.Test/TimescaleTest.cs

@@ -10,11 +10,13 @@ namespace OhmGraphite.Test
         public async void CanSetupTimescale()
         {
             const string connStr = "Host=timescale;Username=postgres;Password=123456";
-            var writer = new TimescaleWriter(connStr, true, "my-pc");
             var epoch = new DateTime(2001, 1, 13);
-            await writer.ReportMetrics(epoch, TestSensorCreator.Values());
+
+            using (var writer = new TimescaleWriter(connStr, true, "my-pc"))
             using (var conn = new NpgsqlConnection(connStr))
             {
+                await writer.ReportMetrics(epoch, TestSensorCreator.Values());
+
                 conn.Open();
                 using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM ohm_stats", conn))
                 {
@@ -27,13 +29,14 @@ namespace OhmGraphite.Test
         public async void InsertOnlyTimescale()
         {
             const string selectStr = "Host=timescale;Username=postgres;Password=123456;Database=timescale_built";
+            var epoch = new DateTime(2001, 1, 13);
 
             const string connStr = "Host=timescale;Username=ohm;Password=itsohm;Database=timescale_built";
-            var writer = new TimescaleWriter(connStr, false, "my-pc");
-            var epoch = new DateTime(2001, 1, 13);
-            await writer.ReportMetrics(epoch, TestSensorCreator.Values());
+            using (var writer = new TimescaleWriter(connStr, false, "my-pc"))
             using (var conn = new NpgsqlConnection(selectStr))
             {
+                await writer.ReportMetrics(epoch, TestSensorCreator.Values());
+
                 conn.Open();
                 using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM ohm_stats", conn))
                 {

+ 5 - 0
OhmGraphite/GraphiteWriter.cs

@@ -127,5 +127,10 @@ namespace OhmGraphite
                    $"raw_name={GraphiteEscape(data.Sensor)} " +
                    Invariant($"{data.Value} {epoch:d}");
         }
+
+        public void Dispose()
+        {
+            _client?.Dispose();
+        }
     }
 }

+ 1 - 1
OhmGraphite/IWriteMetrics.cs

@@ -4,7 +4,7 @@ using System.Threading.Tasks;
 
 namespace OhmGraphite
 {
-    public interface IWriteMetrics
+    public interface IWriteMetrics : IDisposable
     {
         Task ReportMetrics(DateTime reportTime, IEnumerable<ReportedValue> sensors);
     }

+ 4 - 0
OhmGraphite/InfluxWriter.cs

@@ -60,5 +60,9 @@ namespace OhmGraphite
 
             return new LineProtocolPoint(sensorType, fields, tags, reportTime.ToUniversalTime());
         }
+
+        public void Dispose()
+        {
+        }
     }
 }

+ 1 - 0
OhmGraphite/MetricTimer.cs

@@ -56,6 +56,7 @@ namespace OhmGraphite
         {
             Logger.LogAction("stopping metric timer", () =>
             {
+                _writer?.Dispose();
                 _collector?.Dispose();
                 _timer?.Dispose();
             });

+ 5 - 0
OhmGraphite/TimescaleWriter.cs

@@ -153,5 +153,10 @@ namespace OhmGraphite
                    "(time, host, hardware, hardware_type, identifier, sensor, sensor_type, sensor_index, value) VALUES " +
                    columns;
         }
+
+        public void Dispose()
+        {
+            NpgsqlConnection.ClearPool(new NpgsqlConnection(_connStr));
+        }
     }
 }