博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
引入Jaeger——扩展
阅读量:4034 次
发布时间:2019-05-24

本文共 4931 字,大约阅读时间需要 16 分钟。

Jaeger是收集全链路跟踪的信息,在Jaeger收集的信息中,有请求的url信息,有每个请求的时间间隔,借助这些信息可以进行报警,比如一次较长的请求,或者是某些请求的次数和先后等。不管报警的业务规则是什么,首先得收集Jaeger中的信息。

Jaeger有api可以提供这些信息,比如

/api/services,获取所有服务

/api/traces?service={servicename}获取该服务下的所有跟踪

/api/traces/{traceid}获取某个跟踪的信息等

/api/traces?end={endtime}&limit={20}&lookback={1h}&service={servicename}&start={starttime}按条件查询跟踪信息等api

下面代码定义Jaeger中的实体类,类中的属性可以根据自己的型业务规则收集,这里定义不完整

using System.Collections.Generic;namespace JaegerAlert{    ///     /// 服务报警    ///     public class AlertList    {        public string ServiceName { get; set; }        public List
Alerts { get; set; } } ///
/// 报警条目 /// public class AlertItem { public string TraceID { get; set; } public long StartTime { get; set; } public long Duration { get; set; } public string Method { get; set; } public string Operation { get; set; } } ///
/// 服务数据 /// public class ServicesData { public string[] Data { get; set; } public int Total { get; set; } public int Limit { get; set; } public int Offset { get; set; } } ///
/// 跟踪数据 /// public class TracesData { public TracesItem[] Data { get; set; } public int Total { get; set; } public int Limit { get; set; } public int Offset { get; set; } } ///
/// 跟踪条目 /// public class TracesItem { public string TraceID { get; set; } public Span[] Spans { get; set; } } ///
/// Span /// public class Span { public string TraceID { get; set; } public string SpanID { get; set; } public bool IsAlertMark => TraceID == SpanID; public int Flags { get; set; } public string OperationName { get; set; } public long StartTime { get; set; } public long Duration { get; set; } public Tag[] Tags { get; set; } } ///
/// Tag /// public class Tag { public string Key { get; set; } public string Type { get; set; } public string Value { get; set; } }}

这里简单进行了收集,转换成了自己的数据集合,方便对接自己的报警平台:

using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Logging;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.Threading.Tasks;namespace JaegerAlert.Controllers{    [ApiController]    [Route("[controller]")]    public class HomeController : ControllerBase    {        private readonly IHttpClientFactory _clientFactory;        private readonly ILogger
_logger; public HomeController(ILogger
logger, IHttpClientFactory clientFactory) { _clientFactory = clientFactory; _logger = logger; } [HttpGet] public async Task
> Get() { _logger.LogInformation("获取警报列表"); return await GetServices(); } ///
/// 获取所有服务 /// ///
async Task
> GetServices() { var service = await GetJaegerServices(); var services = new List
(); foreach (var serviceName in service.Data) { if (serviceName == "jaeger-query") { continue; } var alerts = new List
(); var tracesModels = await GetJaegerTraces(serviceName); foreach (var traces in tracesModels.Data) { foreach (var span in traces.Spans) { if (span.IsAlertMark) { var method = span.Tags.SingleOrDefault(s => s.Key == "http.method")?.Value; var operation = span.Tags.SingleOrDefault(s => s.Key == "http.url")?.Value; alerts.Add(new AlertItem { TraceID = traces.TraceID, Duration = span.Duration, Method = method, Operation = operation, StartTime = span.StartTime }); } } } services.Add(new AlertList() { ServiceName = serviceName, Alerts = alerts }); } return services; } ///
/// 获取服务下的跟踪条目 /// ///
///
async Task
GetJaegerTraces(string serviceName) { using var client = _clientFactory.CreateClient("Jaeger"); var request = new HttpRequestMessage(HttpMethod.Get, $"/api/traces?service={serviceName}"); using var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); var traces = Newtonsoft.Json.JsonConvert.DeserializeObject
(jsonString); return traces; } else { return new TracesData(); } } ///
/// 获取服务 /// ///
async Task
GetJaegerServices() { using var client = _clientFactory.CreateClient("Jaeger"); var request = new HttpRequestMessage(HttpMethod.Get, "/api/services"); using var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); var service = Newtonsoft.Json.JsonConvert.DeserializeObject
(jsonString); return service; } else { return new ServicesData(); } } } }

请求结果:

收集到数据后,就可以应用到报警平台上,如果报警平台有api,可以进行调用处理;还可以把这些数据推送到时序数据库中,如InfluxDB,再通过Grafana展示出来,进行实时展时跟踪,关于跟踪的细节和业务规则有关系,如果以后工作中遇到这类处理,到时再追加一篇博文进行细说。

转载地址:http://byudi.baihongyu.com/

你可能感兴趣的文章
WAV文件解析
查看>>
DAC输出音乐2-解决pu pu 声
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>