Flutter分布式追踪插件opentelemetry_sls的使用
Flutter分布式追踪插件opentelemetry_sls的使用
OpenTelemetry for Dart
本仓库旨在成为OpenTelemetry项目的Dart实现,长期目标是开源。
所有贡献和设计应遵循 OpenTelemetry规范 ,以与所有其他语言保持一致。
开始使用
首先,你需要配置至少一个导出器。导出器决定了你收集到的跨度会发生什么。 当前选项包括:
导出器 | 描述 |
---|---|
CollectorExporter | 将跨度发送到配置好的opentelemetry-collector。 |
ConsoleExporter | 将跨度打印到控制台。 |
跨度导出器
CollectorExporter
CollectorExporter
需要opentelemetry-collector实例的跟踪收集器的Uri。
import 'package:opentelemetry_sls/sdk.dart' as otel_sdk;
final exporter = otel_sdk.CollectorExporter(Uri.parse('https://my-collector.com/v1/traces'));
ConsoleExporter
ConsoleExporter
没有要求,也没有配置选项。
import 'package:opentelemetry_sls/sdk.dart' as otel_sdk;
final exporter = otel_sdk.ConsoleExporter();
跨度处理器
接下来,你需要至少一个跨度处理器。跨度处理器负责收集你创建的跨度并将它们传递给导出器。 当前选项包括:
跨度处理器 | 描述 |
---|---|
BatchSpanProcessor | 在配置的时间间隔内批量导出跨度。 |
SimpleSpanProcessor | 在关闭跨度时立即执行提供的导出器。 |
BatchSpanProcessor
BatchSpanProcessor
每个区间最多收集2048个跨度,并在定时器上执行提供的导出器。
选项 | 描述 | 默认值 |
---|---|---|
maxExportBatchSize | 每批最多处理多少个跨度。 | 512 |
scheduledDelayMillis | 收集跨度后多久开始处理它们。 | 5000毫秒 |
import 'package:opentelemetry_sls/sdk.dart' as otel_sdk;
final exporter = otel_sdk.ConsoleExporter();
final processor = otel_sdk.BatchSpanProcessor(exporter, scheduledDelayMillis: 10000);
SimpleSpanProcessor
SimpleSpanProcessor
没有配置选项,并在每个跨度关闭时执行导出器。
import 'package:opentelemetry_sls/sdk.dart' as otel_sdk;
final exporter = otel_sdk.ConsoleExporter();
final processor = otel_sdk.SimpleSpanProcessor(exporter);
跟踪提供者
跟踪提供者注册你的跨度处理器,并负责管理任何跟踪器。
选项 | 描述 | 默认值 |
---|---|---|
processors | 要注册的跨度处理器列表。 | 一个带有ConsoleExporter 的SimpleSpanProcessor 。 |
import 'package:opentelemetry_sls/sdk.dart' as otel_sdk;
import 'package:opentelemetry_sls/api.dart';
final exporter = otel_sdk.CollectorExporter(Uri.parse('https://my-collector.com/v1/traces'));
final processor = otel_sdk.BatchSpanProcessor(exporter);
// 每5秒向收集器发送跨度
final provider = otel_sdk.TracerProviderBase(processors: [processor]);
// 可选地,可以注册多个处理器
final provider = otel_sdk.TracerProviderBase(processors: [
otel_sdk.BatchSpanProcessor(otel_sdk.CollectorExporter(Uri.parse('https://my-collector.com/v1/traces'))),
otel_sdk.SimpleSpanProcessor(otel_sdk.ConsoleExporter())
]);
// 注册跟踪提供者作为全局,以便MSDK中间件可以访问它。
registerGlobalTracerProvider(provider);
final tracer = provider.getTracer('instrumentation-name');
// 或
final tracer = globalTracerProvider.getTracer('instrumentation-name');
带有浏览器性能特性的跟踪提供者
还提供了一个特定于Web的跟踪提供者。此跟踪提供者可使用浏览器的性能API配置可选选项。
import 'package:opentelemetry_sls/sdk.dart' as otel_sdk;
import 'package:opentelemetry_sls/web_sdk.dart' as web_sdk;
import 'package:opentelemetry_sls/api.dart';
final exporter = otel_sdk.CollectorExporter(Uri.parse('https://my-collector.com/v1/traces'));
final processor = otel_sdk.BatchSpanProcessor(exporter);
// 此提供者配置为创建使用浏览器性能API而不是Dart的DateTime类来确定任何跨度的时间戳的跟踪器。
final provider = web_sdk.WebTracerProvider(
processors: [processor],
timeProvider: web_sdk.WebTimeProvider()
);
// 此跟踪器已配置为使用浏览器的性能API来确定任何跨度的时间戳。
final tracer = provider.getTracer('instrumentation-name');
// 或者,这些跟踪提供者也可以注册为全局。
registerGlobalTracerProvider(provider);
final tracer = globalTracerProvider.getTracer('instrumentation-name');
重要提示:如果执行系统因休眠而暂停,则使用此跟踪提供者的跨度时间戳可能不准确。 更多信息见此处。
收集跨度
要启动跨度,请在跟踪器上调用startSpan
并传入你要跟踪的名称。完成后,调用跨度上的end
方法。
final span = tracer.startSpan('doingWork');
...
span.end();
要创建子跨度,必须将父跨度设置为“当前”,并在withContext
中执行工作。
final checkoutSpan = tracer.startSpan('checkout');
withContext(setSpan(Context.current, checkoutSpan), () {
final ringUpSpan = tracer.startSpan('ringUp');
...
ringUpSpan.end();
final receiveSpan = tracer.startSpan('receiveCash');
...
receiveSpan.end();
final returnSpan = tracer.startSpan('returnChange');
...
returnSpan.end();
});
checkoutSpan.end();
为了避免需要将跨度作为参数传递给其他函数,你可以通过Context.current.span
获取当前跨度。
doWork() {
Span parentSpan = Context.current.span;
Context.current.withSpan(parentSpan).execute(() {
Span span = tracer.startSpan('doWork');
...
span.end();
});
}
更多关于Flutter分布式追踪插件opentelemetry_sls的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分布式追踪插件opentelemetry_sls的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 应用中使用 OpenTelemetry 进行分布式追踪时,opentelemetry_sls
是一个用于将追踪数据发送到阿里云日志服务(SLS)的插件。以下是如何在 Flutter 项目中集成和使用 opentelemetry_sls
的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 opentelemetry_sls
以及其他必要的 OpenTelemetry 依赖。
dependencies:
flutter:
sdk: flutter
opentelemetry_sls: ^0.1.0 # 请检查最新版本
opentelemetry: ^0.1.0 # 请检查最新版本
opentelemetry_api: ^0.1.0 # 请检查最新版本
然后运行 flutter pub get
来获取依赖。
2. 初始化 OpenTelemetry 和 SLS Exporter
在你的 Flutter 应用启动时,初始化 OpenTelemetry 并配置 SLSExporter
。
import 'package:opentelemetry/opentelemetry.dart';
import 'package:opentelemetry_sls/opentelemetry_sls.dart';
void main() {
// 初始化 OpenTelemetry
final tracerProvider = TracerProvider(
resource: Resource(attributes: {
'service.name': 'my-flutter-app',
}),
);
// 配置 SLS Exporter
final slsExporter = SLSExporter(
endpoint: 'https://your-sls-endpoint.log.aliyuncs.com', // 替换为你的 SLS 端点
project: 'your-sls-project', // 替换为你的 SLS 项目名
logstore: 'your-sls-logstore', // 替换为你的 SLS Logstore
accessKeyId: 'your-access-key-id', // 替换为你的阿里云 Access Key ID
accessKeySecret: 'your-access-key-secret', // 替换为你的阿里云 Access Key Secret
);
// 添加 SLS Exporter 到 TracerProvider
tracerProvider.addSpanProcessor(SimpleSpanProcessor(slsExporter));
// 设置全局 TracerProvider
OpenTelemetry().setTracerProvider(tracerProvider);
// 启动 Flutter 应用
runApp(MyApp());
}
3. 创建和记录 Span
在你的应用代码中,你可以使用 OpenTelemetry 的 API 来创建和记录 Span。
import 'package:opentelemetry/opentelemetry.dart';
void performSomeOperation() {
final tracer = OpenTelemetry().tracerProvider.getTracer('my-flutter-app');
final span = tracer.startSpan('performSomeOperation');
span.setAttribute('operation', 'example');
try {
// 执行一些操作
// ...
span.addEvent('Operation completed');
} catch (e) {
span.setStatus(StatusCode.error, 'Operation failed');
span.recordException(e);
} finally {
span.end();
}
}