Edison's Studio.

opnetelemetry-jaeger

Word count: 379Reading time: 1 min
2022/12/03
loading

在调研中,持续更新本篇 …

架构


Tracing

核心概念

此处只介绍使用中会遇到的概念,具体细节请查阅文档

API

  • TracerProvider 提供访问 Tracer 的入口。作为一个池子放置和管理 Tracers

  • Span Exporter 定义一系列接口,执行 telemetry data 的序列化与反序列化,以将数据提交到不同的 backend。

应用


Tracing

根据其架构设计,所有的应用都可以实现为:

  1. 定义 Resource
  2. 创建 Provider
  3. 设置全局 Provider (option)
  4. 设置 Exporter (option)
  5. server 中使用 Tracing

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

from opentelemetry.propagate import set_global_textmap
from opentelemetry.propagators.jaeger import JaegerPropagator

APP_NAME = "app"

def init():
init_provider()

set_global_textmap(JaegerPropagator())

def init_provider():

trace.set_tracer_provider(
TracerProvider(
resource=Resource.create({SERVICE_NAME: APP_NAME})
)
)

jaeger_exporter = JaegerExporter()
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(jaeger_exporter)
)

常用的 package 如 Flask, Django, FastAPI, psycopg2 等都有提供 instrument, 实现基于AOP的注入。

Golang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
jaegerpropagator "go.opentelemetry.io/contrib/propagators/jaeger"
)

const APP_NAME := "app"

func InitGlobalProvider() *sdktrace.TracerProvider {
p, e := tracerProvider()
if e != nil {
return nil
}

otel.SetTracerProvider(p)

return p
}

func tracerProvider(url string) (*sdktrace.TracerProvider, error) {
serviceName := APP_NAME

exp, err := jaeger.New(jaeger.WithAgentEndpoint())
if err != nil {
return nil, err
}

tp := sdktrace.NewTracerProvider(
// Always be sure to batch in production.
sdktrace.WithBatcher(exp),
// Record information about this application in a Resource.
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(serviceName),
)),
)
return tp, nil
}

func InitGlobalPropagator() propagation.TextMapPropagator {
otel.SetTextMapPropagator(jaegerpropagator.Jaeger{})
}

参考


Metrics, tracing, and logging

CATALOG
  1. 1. 架构
    1. 1.1. Tracing
      1. 1.1.1. 核心概念
        1. 1.1.1.1. API
  2. 2. 应用
    1. 2.1. Tracing
      1. 2.1.1. Python
  3. 3. 参考