/// <summary> /// Snapshot cache metrics /// </summary> /// <param name="pagesLoaded"></param> public static void RecordCacheMetric(int pagesLoaded) { SampledMetricDefinition pageMetricDefinition; //since sampled metrics have only one value per metric, we have to create multiple metrics (one for every value) if (SampledMetricDefinition.TryGetValue("GibraltarSample", "Database.Engine", "Cache Pages", out pageMetricDefinition) == false) { //doesn't exist yet - add it in all of its glory. This call is MT safe - we get back the object in cache even if registered on another thread. pageMetricDefinition = SampledMetricDefinition.Register("GibraltarSample", "Database.Engine", "cachePages", SamplingType.RawCount, "Pages", "Cache Pages", "The number of pages in the cache"); } //now that we know we have the definitions, make sure we've defined the metric instances. SampledMetric pageMetric = SampledMetric.Register(pageMetricDefinition, null); //now go ahead and write those samples.... pageMetric.WriteSample(pagesLoaded); //Continue for our second metric. SampledMetricDefinition sizeMetricDefinition; if (SampledMetricDefinition.TryGetValue("GibraltarSample", "Database.Engine", "Cache Size", out sizeMetricDefinition) == false) { //doesn't exist yet - add it in all of its glory This call is MT safe - we get back the object in cache even if registered on another thread. sizeMetricDefinition = SampledMetricDefinition.Register("GibraltarSample", "Database.Engine", "cacheSize", SamplingType.RawCount, "Bytes", "Cache Size", "The number of bytes used by pages in the cache"); } SampledMetric sizeMetric = SampledMetric.Register(sizeMetricDefinition, null); sizeMetric.WriteSample(pagesLoaded * 8196); }
public void SampledMetricsByMethodsPerformanceTest() { Log.TraceVerbose("Registering new sampled metric definitions"); //go ahead and register a few metrics //int curMetricDefinitionCount = Log.MetricDefinitions.Count; SampledMetricDefinition incrementalCountDefinition = SampledMetricDefinition.Register("PerformanceTestsMetrics", "Performance.SampledMetrics.Methods", "IncrementalCount", SamplingType.IncrementalCount, null, "Incremental Count", "Unit test sampled metric using the incremental count calculation routine."); SampledMetricDefinition incrementalFractionDefinition = SampledMetricDefinition.Register("PerformanceTestsMetrics", "Performance.SampledMetrics.Methods", "IncrementalFraction", SamplingType.IncrementalFraction, null, "Incremental Fraction", "Unit test sampled metric using the incremental fraction calculation routine. Rare, but fun."); SampledMetricDefinition totalCountDefinition = SampledMetricDefinition.Register("PerformanceTestsMetrics", "Performance.SampledMetrics.Methods", "TotalCount", SamplingType.TotalCount, null, "Total Count", "Unit test sampled metric using the Total Count calculation routine. Very common."); SampledMetricDefinition totalFractionDefinition = SampledMetricDefinition.Register("PerformanceTestsMetrics", "Performance.SampledMetrics.Methods", "TotalFraction", SamplingType.TotalFraction, null, "Total Fraction", "Unit test sampled metric using the Total Fraction calculation routine. Rare, but rounds us out."); SampledMetricDefinition rawCountDefinition = SampledMetricDefinition.Register("PerformanceTestsMetrics", "Performance.SampledMetrics.Methods", "RawCount", SamplingType.RawCount, null, "Raw Count", "Unit test sampled metric using the Raw Count calculation routine, which we will then average to create sample intervals."); SampledMetricDefinition rawFractionDefinition = SampledMetricDefinition.Register("PerformanceTestsMetrics", "Performance.SampledMetrics.Methods", "RawFraction", SamplingType.RawFraction, null, "Raw Fraction", "Unit test sampled metric using the Raw Fraction calculation routine. Fraction types aren't common."); //we should have added six new metric definitions //Assert.AreEqual(curMetricDefinitionCount + 6, Log.MetricDefinitions.Count, "The number of registered metric definitions hasn't increased by the right amount, tending to mean that one or more metrics didn't register."); // These should never be null, but let's check to confirm. Assert.IsNotNull(incrementalCountDefinition); Assert.IsNotNull(incrementalFractionDefinition); Assert.IsNotNull(totalCountDefinition); Assert.IsNotNull(totalFractionDefinition); Assert.IsNotNull(rawCountDefinition); Assert.IsNotNull(rawFractionDefinition); Trace.TraceInformation("Sampled metric definitions registered by methods."); // These should never be null, but let's check to confirm. Assert.IsNotNull(incrementalCountDefinition); Assert.IsNotNull(incrementalFractionDefinition); Assert.IsNotNull(totalCountDefinition); Assert.IsNotNull(totalFractionDefinition); Assert.IsNotNull(rawCountDefinition); Assert.IsNotNull(rawFractionDefinition); //and lets go ahead and create new metrics for each definition Log.TraceVerbose("Obtaining default metric instances from each definition"); SampledMetric incrementalCountMetric = SampledMetric.Register(incrementalCountDefinition, null); SampledMetric incrementalFractionMetric = SampledMetric.Register(incrementalFractionDefinition, null); SampledMetric totalCountMetric = SampledMetric.Register(totalCountDefinition, null); SampledMetric totalFractionMetric = SampledMetric.Register(totalFractionDefinition, null); SampledMetric rawCountMetric = SampledMetric.Register(rawCountDefinition, null); SampledMetric rawFractionMetric = SampledMetric.Register(rawFractionDefinition, null); // These should never be null, either, but let's check to confirm. Assert.IsNotNull(incrementalCountMetric); Assert.IsNotNull(incrementalFractionMetric); Assert.IsNotNull(totalCountMetric); Assert.IsNotNull(totalFractionMetric); Assert.IsNotNull(rawCountMetric); Assert.IsNotNull(rawFractionMetric); // Now, lets get everything to flush so we have our best initial state. Log.Information(LogWriteMode.WaitForCommit, "Test.Agent.Metrics.Performance", "Preparing for Test", "Flushing queue"); //now that we know it's flushed everything, lets do our timed loop. DateTimeOffset startTime = DateTimeOffset.UtcNow; for (int curMessage = 0; curMessage < LoopsPerSampledTest; curMessage++) { //We're putting in fairly bogus data, but it will produce a consistent output. incrementalCountMetric.WriteSample(20); incrementalFractionMetric.WriteSample(20, 30); totalCountMetric.WriteSample(20); totalFractionMetric.WriteSample(20, 30); rawCountMetric.WriteSample(20); rawFractionMetric.WriteSample(20, 30); } DateTimeOffset messageEndTime = DateTimeOffset.UtcNow; //one wait for commit message to force the buffer to flush. Log.Information(LogWriteMode.WaitForCommit, "Test.Agent.Metrics.Performance", "Waiting for Samples to Commit", null); //and store off our time DateTimeOffset endTime = DateTimeOffset.UtcNow; TimeSpan testDuration = endTime - startTime; TimeSpan loopDuration = messageEndTime - startTime; const int messagesPerTest = LoopsPerSampledTest * MessagesPerSampledLoop; Trace.TraceInformation("Sampled Metrics by Methods Test committed {0:N0} samples in {1:F3} ms (average {2:F4} ms per message). Average loop time {3:F4} ms ({4} samples per loop) and final flush time {5:F3} ms.", messagesPerTest, testDuration.TotalMilliseconds, (testDuration.TotalMilliseconds / messagesPerTest), (loopDuration.TotalMilliseconds / LoopsPerSampledTest), MessagesPerSampledLoop, (endTime - messageEndTime).TotalMilliseconds); }
public void SimpleMetricUsage() { Log.TraceVerbose("Registering new sampled metric definition"); //create one sampled metric definition using the "make a definition for the current log set" override SampledMetricDefinition temperatureTracking = SampledMetricDefinition.Register("SimpleMetricUsage", "Methods.Temperature", "Experiment Temperature", SamplingType.RawCount, null, "Temperature", "This is an example from iControl where we want to track the temperature of a reaction or some such thing."); //create a set of METRICS (definition + metric) using the static add metric capability Log.TraceVerbose("Registering metric instances directly"); SampledMetric incrementalCountMetric = SampledMetric.Register("SimpleMetricUsage", "Methods.Unit Test Data.Direct", "IncrementalCount", SamplingType.IncrementalCount, null, "Incremental Count", "Unit test sampled metric using the incremental count calculation routine.", null); SampledMetric incrementalFractionMetric = SampledMetric.Register("SimpleMetricUsage", "Methods.Unit Test Data.Direct", "IncrementalFraction", SamplingType.IncrementalFraction, null, "Incremental Fraction", "Unit test sampled metric using the incremental fraction calculation routine. Rare, but fun.", null); SampledMetric totalCountMetric = SampledMetric.Register("SimpleMetricUsage", "Methods.Unit Test Data.Direct", "TotalCount", SamplingType.TotalCount, null, "Total Count", "Unit test sampled metric using the Total Count calculation routine. Very common.", null); SampledMetric totalFractionMetric = SampledMetric.Register("SimpleMetricUsage", "Methods.Unit Test Data.Direct", "TotalFraction", SamplingType.TotalFraction, null, "Total Fraction", "Unit test sampled metric using the Total Fraction calculation routine. Rare, but rounds us out.", null); SampledMetric rawCountMetric = SampledMetric.Register("SimpleMetricUsage", "Methods.Unit Test Data.Direct", "RawCount", SamplingType.RawCount, null, "Raw Count", "Unit test sampled metric using the Raw Count calculation routine, which we will then average to create sample intervals.", null); SampledMetric rawFractionMetric = SampledMetric.Register("SimpleMetricUsage", "Methods.Unit Test Data.Direct", "RawFraction", SamplingType.RawFraction, null, "Raw Fraction", "Unit test sampled metric using the Raw Fraction calculation routine. Fraction types aren't common.", null); // These should never be null, but let's check to confirm. Assert.IsNotNull(incrementalCountMetric); Assert.IsNotNull(incrementalFractionMetric); Assert.IsNotNull(totalCountMetric); Assert.IsNotNull(totalFractionMetric); Assert.IsNotNull(rawCountMetric); Assert.IsNotNull(rawFractionMetric); Log.TraceVerbose("And now lets log data"); //lets add 10 values, a few milliseconds apart int curSamplePass = 0; while (curSamplePass < 10) { //the temperature tracking one is set up so we can write to instances directly from a definition. temperatureTracking.WriteSample(string.Format(CultureInfo.CurrentCulture, "Experiment {0}", 1), curSamplePass); temperatureTracking.WriteSample(string.Format(CultureInfo.CurrentCulture, "Experiment {0}", 2), curSamplePass); temperatureTracking.WriteSample(string.Format(CultureInfo.CurrentCulture, "Experiment {0}", 3), curSamplePass); temperatureTracking.WriteSample(string.Format(CultureInfo.CurrentCulture, "Experiment {0}", 4), curSamplePass); temperatureTracking.WriteSample(string.Format(CultureInfo.CurrentCulture, "Experiment {0}", 5), curSamplePass); temperatureTracking.WriteSample(string.Format(CultureInfo.CurrentCulture, "Experiment {0}", 6), curSamplePass); incrementalCountMetric.WriteSample(curSamplePass * 20); incrementalFractionMetric.WriteSample(curSamplePass * 20, curSamplePass * 30); totalCountMetric.WriteSample(curSamplePass * 20); totalFractionMetric.WriteSample(curSamplePass * 20, curSamplePass * 30); rawCountMetric.WriteSample(curSamplePass); rawFractionMetric.WriteSample(curSamplePass, 10.0); curSamplePass++; Thread.Sleep(100); } Log.TraceVerbose("Completed logging metric samples."); }
public void BasicMetricUsage() { Log.TraceVerbose("Registering new sampled metric definitions"); //go ahead and register a few metrics //int curMetricDefinitionCount = Log.MetricDefinitions.Count; SampledMetricDefinition incrementalCountDefinition = SampledMetricDefinition.Register("BasicMetricUsage", "Methods.Unit Test Data.Long", "IncrementalCount", SamplingType.IncrementalCount, null, "Incremental Count", "Unit test sampled metric using the incremental count calculation routine."); SampledMetricDefinition incrementalFractionDefinition = SampledMetricDefinition.Register("BasicMetricUsage", "Methods.Unit Test Data.Long", "IncrementalFraction", SamplingType.IncrementalFraction, null, "Incremental Fraction", "Unit test sampled metric using the incremental fraction calculation routine. Rare, but fun."); SampledMetricDefinition totalCountDefinition = SampledMetricDefinition.Register("BasicMetricUsage", "Methods.Unit Test Data.Long", "TotalCount", SamplingType.TotalCount, null, "Total Count", "Unit test sampled metric using the Total Count calculation routine. Very common."); SampledMetricDefinition totalFractionDefinition = SampledMetricDefinition.Register("BasicMetricUsage", "Methods.Unit Test Data.Long", "TotalFraction", SamplingType.TotalFraction, null, "Total Fraction", "Unit test sampled metric using the Total Fraction calculation routine. Rare, but rounds us out."); SampledMetricDefinition rawCountDefinition = SampledMetricDefinition.Register("BasicMetricUsage", "Methods.Unit Test Data.Long", "RawCount", SamplingType.RawCount, null, "Raw Count", "Unit test sampled metric using the Raw Count calculation routine, which we will then average to create sample intervals."); SampledMetricDefinition rawFractionDefinition = SampledMetricDefinition.Register("BasicMetricUsage", "Methods.Unit Test Data.Long", "RawFraction", SamplingType.RawFraction, null, "Raw Fraction", "Unit test sampled metric using the Raw Fraction calculation routine. Fraction types aren't common."); //we should have added six new metric definitions //Assert.AreEqual(curMetricDefinitionCount + 6, Log.MetricDefinitions.Count, "The number of registered metric definitions hasn't increased by the right amount, tending to mean that one or more metrics didn't register."); // These should never be null, but let's check to confirm. Assert.IsNotNull(incrementalCountDefinition); Assert.IsNotNull(incrementalFractionDefinition); Assert.IsNotNull(totalCountDefinition); Assert.IsNotNull(totalFractionDefinition); Assert.IsNotNull(rawCountDefinition); Assert.IsNotNull(rawFractionDefinition); //and lets go ahead and create new metrics for each definition Log.TraceVerbose("Obtaining default metric instances from each definition"); SampledMetric incrementalCountMetric = SampledMetric.Register(incrementalCountDefinition, null); SampledMetric incrementalFractionMetric = SampledMetric.Register(incrementalFractionDefinition, null); SampledMetric totalCountMetric = SampledMetric.Register(totalCountDefinition, null); SampledMetric totalFractionMetric = SampledMetric.Register(totalFractionDefinition, null); SampledMetric rawCountMetric = SampledMetric.Register(rawCountDefinition, null); SampledMetric rawFractionMetric = SampledMetric.Register(rawFractionDefinition, null); // These should never be null, either, but let's check to confirm. Assert.IsNotNull(incrementalCountMetric); Assert.IsNotNull(incrementalFractionMetric); Assert.IsNotNull(totalCountMetric); Assert.IsNotNull(totalFractionMetric); Assert.IsNotNull(rawCountMetric); Assert.IsNotNull(rawFractionMetric); //and finally, lets go log some data! Log.TraceVerbose("And now lets log data"); //lets add 10 values, a few milliseconds apart int curSamplePass = 0; while (curSamplePass < 10) { //We're putting in fairly bogus data, but it will produce a consistent output. incrementalCountMetric.WriteSample(curSamplePass * 20); incrementalFractionMetric.WriteSample(curSamplePass * 20, curSamplePass * 30); totalCountMetric.WriteSample(curSamplePass * 20); totalFractionMetric.WriteSample(curSamplePass * 20, curSamplePass * 30); rawCountMetric.WriteSample(curSamplePass); rawFractionMetric.WriteSample(curSamplePass, 10.0); curSamplePass++; Thread.Sleep(100); } Log.TraceVerbose("Completed logging metric samples."); }