基本內(nèi)容
官方文檔:https://www.app-metrics.io/
一猜扮、配置
App Metrics提供MetricsBuilder進(jìn)行配置,這些配置項為:
屬性 | 說明 |
---|---|
DefaultContextLabel | 通過IMetrics接口度量內(nèi)容被分組記錄在“上下文”中办斑,例如一個數(shù)據(jù)庫上下文或程序上下文。度量名稱在每一個下下文中應(yīng)該是唯一的谨垃。如果記錄度量內(nèi)容時沒有提供一個上下文標(biāo)簽叠荠。這個值可以通過DefaultContextLabel配置進(jìn)行修改, 默認(rèn)是“Application”。這里建議采用項目的簡寫名稱龄章,保證項目之間不存在沖突即可。 |
GlobalTags | 所有的度量類型都能被標(biāo)記, 例如當(dāng)我們記錄度量數(shù)據(jù)的時候乞封,就能標(biāo)記所有度量的環(huán)境為“測試”或“生產(chǎn)”做裙,這樣我們就知道數(shù)據(jù)的來源。 |
Enabled | 允許所有度量記錄被啟用/禁用, 默認(rèn)是true肃晚。 |
ReportingEnabled | 允許所有已配置的記錄器被啟用/禁用, 默認(rèn)是true锚贱。 |
1.1 代碼實現(xiàn)
var metrics = new MetricsBuilder()
.Configuration.Configure(
options =>
{
options.DefaultContextLabel = "MyContext";
options.GlobalTags.Add("myTagKey", "myTagValue");
options.Enabled = true;
options.ReportingEnabled = true;
})
... //其它配置項
.Build();
二、度量類型
2.1 度量單位
在講度量定義之前关串,先了解MeasurementUnit(度量單位)拧廊,既測量的內(nèi)容的描述,這個是輸出結(jié)果的輔助信息晋修。
枚舉 | 說明 |
---|---|
Unit.Bits | |
Unit.Warnings | |
Unit.Threads | |
Unit.Results | |
Unit.Percent | |
Unit.None | |
Unit.PetaBytes | |
Unit.TeraBytes | |
Unit.GigaBytes | |
Unit.Requests | |
Unit.KiloBytes | |
Unit.Items | |
Unit.Events | |
Unit.Errors | |
Unit.Connections | |
Unit.MegaBytes | |
Unit.Commands | |
Unit.Calls | |
Unit.Bytes |
2.2 度量定義
App Metrics提供默認(rèn)的度量配置和度量類型吧碾。
2.2.1 GaugeOptions(儀表盤)
主要用于直接反應(yīng)當(dāng)前的度量情況,例如CPU和內(nèi)存的使用情況墓卦,直觀看到當(dāng)前實際的狀況倦春。如:
//定義一個表示當(dāng)前發(fā)生錯誤次數(shù)的度量
public static class MyMetricsRegistry
{
... //其它定義
public static GaugeOptions Errors => new GaugeOptions
{
Name = "Errors"
};
}
//在需要使用的地方進(jìn)行度量數(shù)據(jù)的修改,如將錯誤數(shù)量設(shè)置為1:
metrics.Measure.Gauge.SetValue(MyMetricsRegistry.Errors, 1);
//如果想?yún)^(qū)分具體在哪個層面發(fā)生的Error趴拧,則需要使用Tag。在設(shè)置值的同時山叮,給度量打上指定標(biāo)記
var tags = new MetricTags(“fromt”, “db”);
metrics.Measure.Gauge.SetValue(MyMetricsRegistry.Errors, tags, 1);
2.2.2 CounterOptions(計數(shù)器)
對于一些需要觀察某些特別數(shù)據(jù)數(shù)量統(tǒng)計的時候著榴,比如api的請求量等,可以通過CounterOptions來實現(xiàn)用途屁倔。如:
//定義一個表示當(dāng)前發(fā)生錯誤次數(shù)的度量
public static class MyMetricsRegistry
{
... //其它定義
public static CounterOptions SampleCounter => new CounterOptions
{
Name = "Sample Counter",
MeasurementUnit = Unit.Calls
};
}
//累加
metrics.Measure.Counter.Increment(MyMetricsRegistry.SampleCounter);
2.2.3 MeterOptions(計量器)
對于一些需要觀察某些特別數(shù)據(jù)增長率的時候脑又,例如每隔一段時間用戶的增長率等,可以通過MeterOptions來實現(xiàn)用途锐借。如:
//定義一個表示當(dāng)前不同狀態(tài)碼發(fā)生情況的度量
public static class MyMetricsRegistry
{
... //其它定義
public static MeterOptions SampleMeter => new MeterOptions
{
Name = "Sample Meter",
MeasurementUnit = Unit.Calls
};
}
//定義不同狀態(tài)發(fā)生的情況
metrics.Measure.Meter.Mark(MyMetricsRegistry.SampleMeter, 1);
metrics.Measure.Meter.Mark(MyMetricsRegistry.SampleMeter, 2;
metrics.Measure.Meter.Mark(MyMetricsRegistry.SampleMeter, 3);
2.2.4 HistogramOptions(柱狀圖)
主要反應(yīng)數(shù)據(jù)的分布情況问麸,例如Post和Put請求的數(shù)據(jù)尺寸。如:
//定義一個表示當(dāng)前數(shù)據(jù)分布情況的度量
public static class MyMetricsRegistry
{
... //其它定義
public static HistogramOptions SampleHistogram => new HistogramOptions
{
Name = "Sample Histogram",
Reservoir = () => new DefaultAlgorithmRReservoir(),
MeasurementUnit = Unit.MegaBytes
};
}
//利用隨機數(shù)模擬數(shù)據(jù)填充
var rnd = new Random();
foreach (var i in Enumerable.Range(0, 50))
{
var t = rnd.Next(0, 10);
metrics.Measure.Histogram.Update(MyMetricsRegistry.SampleHistogram, t);
}
2.2.5 TimerOptions(時間線)
主要以響應(yīng)時間的情況作為度量進(jìn)行監(jiān)控钞翔。如:
//定義一個表示當(dāng)前數(shù)據(jù)分布情況的度量
public static class MyMetricsRegistry
{
... //其它定義
public static TimerOptions SampleTimer => new TimerOptions
{
Name = "Sample Timer",
MeasurementUnit = Unit.Items,
DurationUnit = TimeUnit.Milliseconds,
RateUnit = TimeUnit.Milliseconds,
Reservoir = () => new DefaultForwardDecayingReservoir(sampleSize: 1028, alpha: 0.015)
};
}
//使用using進(jìn)行涵括严卖,并將需要記錄耗時的請求操作放入其中
using (metrics.Measure.Timer.Time(MyMetricsRegistry.SampleTimer))
{
// Do something
}
2.2.6 ApdexOptions(性能度量)
主要以標(biāo)準(zhǔn)的性能度量計算方。如:
//定義一個表示當(dāng)前數(shù)據(jù)分布情況的度量
public static class MyMetricsRegistry
{
... //其它定義
public static ApdexOptions SampleApdex => new ApdexOptions
{
Name = "Sample Apdex"
};
}
//使用using進(jìn)行涵括布轿,并將需要記錄耗時的請求操作放入其中
using (metrics.Measure.Apdex.Track(MyMetricsRegistry.SampleApdex))
{
// Do something
}
三哮笆、格式化度量
App Metrics支持格式化為Plain Text(純文本)和JSON来颤,以及格式化為如:InfluxDB, Prometheus, Elasticsearch 和 Graphite 這類時序數(shù)據(jù)的儲存格式。
3.1 基本
MetricsBuilder可以配置一到多個格式化器稠肘,如使用Plain Text 和 Json
安裝App.Metrics Nuget包
nuget install App.Metrics
var builder = new MetricsBuilder()
.OutputMetrics.AsPlainText()
.OutputMetrics.AsJson();
通過獲取快照福铅,將格式化后的內(nèi)容打印出來
var metrics = builder.Build();
// TODO: Record some metrics
var snapshot = metrics.Snapshot.Get();
foreach(var formatter in metrics.OutputMetricsFormatters)
{
using (var stream = new MemoryStream())
{
await formatter.WriteAsync(stream, snapshot);
var result = Encoding.UTF8.GetString(stream.ToArray());
System.Console.WriteLine(result);
}
}
3.2 自定義格式器
實現(xiàn)自定義格式器
安裝App.Metrics.Abstractions Nuget包
nuget install App.Metrics.Abstractions
繼承IMetricsOutputFormatter接口,實現(xiàn)自定義格式器
public class CustomOutputFormatter : IMetricsOutputFormatter
{
public MetricsMediaTypeValue MediaType => new MetricsMediaTypeValue("text", "vnd.custom.metrics", "v1", "plain");
public Task WriteAsync(Stream output,
MetricsDataValueSource snapshot,
CancellationToken cancellationToken = default)
{
// TODO: Serialize the snapshot
return Task.CompletedTask;
}
}
var metrics = new MetricsBuilder()
.OutputMetrics.Using<CustomOutputFormatter>()
// OR
// .OutputMetrics.Using(new CustomOutputFormatter())
.Builder();
四项阴、過濾器
4.1 全局過濾器
可以在IMetricsBuilder上使用過濾器滑黔,在檢索快照時,默認(rèn)使用該過濾器环揽。
4.1.1 字段過濾
度量類型
var metrics = new MetricsBuilder()
.MetricFields.Configure(
fields =>
{
fields.Counter.Exclude(CounterFields.Total, CounterFields.SetItem, CounterFields.SetItemPercent);
fields.Meter.OnlyInclude(MeterFields.Rate1M);
fields.Histogram.OnlyInclude(HistogramFields.P95, HistogramFields.P99);
})
.Build();
未完待續(xù)