可观测性

功能还在继续完善中。请参考 ActivitySourceApi 、OpenTelemetryConsole示例。

部署环境

为了快速部署可观测性平台,可以使用 OpenTelemetry 官方提供的示例包快速部署相关的服务,里面包含了 Prometheus、Grafana、Jaeger 等中间件。

下载示例仓库源码:

git clone https://github.com/open-telemetry/opentelemetry-demo.git

由于示例中会包含大量的 demo 微服务,因此我们需要打开 docker-compose.yml 文件,将 services 节点的 Core Demo ServicesDependent Services 服务直接删除,只保留可观测性组件。或者直接点击下载笔者已经修改好的版本: docker-compose.yml

image-20240612200711787

执行命令部署可观测性服务:

docker-compose up -d

image-20240612201100976

opentelemetry-collector-contrib 用于收集链路追踪的可观测性信息,有 grpc 和 http 两种,监听端口如下:

Port Protocol Endpoint Function
4317 gRPC n/a Accepts traces in OpenTelemetry OTLP format  (Protobuf).
4318 HTTP /v1/traces Accepts traces in OpenTelemetry OTLP format  (Protobuf and JSON).

经过容器端口映射后,对外端口可能不是 4317、4318 了。

1718196602032.png

引入 Maomi.MQ.Instrumentation 包,以及其它相关 OpenTelemetry 包。

<PackageReference Include="Maomi.MQ.Instrumentation " Version="1.1.0" />
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />

引入命名空间:

using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Maomi.MQ;
using OpenTelemetry.Exporter;
using RabbitMQ.Client;
using System.Reflection;
using OpenTelemetry;

链路追踪

使用链路追踪时,如下代码注入服务:

const string serviceName = "myapp";

builder.Services.AddMaomiMQ((MqOptionsBuilder options) =>
{
    options.WorkId = 1;
    options.AutoQueueDeclare = true;
    options.AppName = serviceName;
    options.Rabbit = (ConnectionFactory options) =>
    {
        options.HostName = "192.168.3.248";
        options.ClientProvidedName = Assembly.GetExecutingAssembly().GetName().Name;
    };
}, [typeof(Program).Assembly]);

builder.Services.AddOpenTelemetry()
      .ConfigureResource(resource => resource.AddService(serviceName))
      .WithTracing(tracing =>
      {
          tracing.AddMaomiMQInstrumentation(options =>
          {
              options.Sources.AddRange(MaomiMQDiagnostic.Sources);
              options.RecordException = true;
          })
          .AddAspNetCoreInstrumentation()
          .AddOtlpExporter(options =>
          {
              options.Endpoint = new Uri("http://127.0.0.1:32772/v1/traces");
              options.Protocol = OtlpExportProtocol.HttpProtobuf;
          });
      });

启动服务后,进行发布、消费,链路追踪信息会被自动推送到 OpenTelemetry Collector 中,通过 Jaeger 、Skywalking 等组件可以读取出来。

打开映射了 16686 端口的 Jaejer ui 面板:

image-20240612205140595

由于 publish、consumer 属于兄弟 trace 而不是同一个 trace,因此需要通过 Tags 查询相关联的 trace,格式 event.id=xxx

1718196773292

3662d0c35aaac72c77046a430988e87

监控

目前由于最新版本的 C# 库可能跟 opentelemetry-demo 仓库中部署的 opentelemetry-collector-contrib 不兼容,目前只有链路追踪可以推送。所以这里我们手动引入 Prometheus 导出。

添加对 OpenTelemetry.Exporter.Prometheus.AspNetCore 包的引用,目前该包处于预览状态,

image-20240629012107668

在代码中按如下图所示配置:

builder.Services.AddOpenTelemetry()
      .ConfigureResource(resource => resource.AddService(serviceName))
      .WithTracing(tracing =>
      {
          tracing.AddMaomiMQInstrumentation(options =>
          {
              options.Sources.AddRange(MaomiMQDiagnostic.Sources);
              options.RecordException = true;
          })
          .AddAspNetCoreInstrumentation()
          .AddOtlpExporter("trace", options =>
          {
              options.Endpoint = new Uri("http://10.1.0.6:32774/v1/traces");
              options.Protocol = OtlpExportProtocol.HttpProtobuf;
          });
      })
      .WithMetrics(metrices =>
      {
          metrices.AddAspNetCoreInstrumentation()
          .AddMaomiMQInstrumentation()
              // 这里用不了,可能 opentelemetry-demo 的服务跟当前 C# 库的 metrics 协议不兼容
          .AddOtlpExporter("metrics", options =>
          {
              options.Endpoint = new Uri("http://10.1.0.6:32774/metrics");
              options.Protocol = OtlpExportProtocol.HttpProtobuf;
          })
              // 这里可以用
          .AddPrometheusExporter();
      });

添加中间件,以便能够被 Prometheus 采集信息。

app.UseAuthorization();

// 添加这里
app.MapPrometheusScrapingEndpoint();

app.MapControllers();

打开 opentelemetry-demo 仓库的 src/prometheus/prometheus-config.yaml 文件,修改为以下内容:

global:
  evaluation_interval: 30s
  scrape_interval: 5s
scrape_configs:
- job_name: otel-collector
  static_configs:
  - targets:
    - 'otelcol:8888'
- job_name: maomimq
  static_configs:
  - targets:
    - '10.1.0.5:5257'

请将 10.1.0.5:5257 替换为自己的 web 服务 ip 和端口地址。

使用 docker 重启 Prometheus 服务。

启动程序,代码 /metrics,即可看到相关的 metrics。

image-20240628122115115

接着,要将数据显示到 Grafana 中。

下载模板文件: MaomiMQ-1719623624308.json

然后在 Grafana 面板的 Dashboards 中导入文件,可以在面板中查看当前所有服务的消息队列监控。

image-20240629011543582

image-20240629011505686

开源项目代码引用

OpenTelemetry.Instrumentation.MaomiMQ 项目的 Includes 代码来源于 https://github.com/open-telemetry/opentelemetry-dotnet-contrib/tree/main/src/Shared

Copyright © 痴者工良 2024 all right reserved,powered by Gitbook文档最后更新时间: 2024-07-26 20:13:09

results matching ""

    No results matching ""