Flutter分布式追踪插件opentracing的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter分布式追踪插件opentracing的使用

此库是用Dart编写的OpenTracing API。它既可用于服务器端,也可用于浏览器端。

必读材料

要完全理解此平台API,最好熟悉OpenTracing项目及其通用术语。

快速入门

在您的pubspec.yaml文件中添加依赖项:

dependencies:
  opentracing: ^1.0.0

在您的Dart代码中,为要跟踪的操作添加仪器。这主要通过在感兴趣的操作周围使用“span”(跨度)来实现,并添加日志语句以捕获与这些操作相关的有用数据。

var tracer = globalTracer();

Span span = tracer.startSpan('http_request');

HttpRequest.getString('http://httpstat.us/200').then((String result) {
  span.log('data_received', payload: result);
}).catchError((error) {
  span.log('request_error', payload: error);
}).whenComplete(() {
  span.log('request_end');
  span.finish();
});

opentracing包的默认行为是作为“no-op”实现。

要捕获并使跟踪数据具有可操作性,应该使用您选择的OpenTracing实现初始化Tracer对象,如以下示例代码所示:

initGlobalTracer(new CustomTracer());

注意:基础实现对象在所有包含的opentracing包之间共享,因此initGlobalTracer只需要在初始化期间调用一次。

开发信息

有关向OpenTracing贡献的更多信息,请参见OpenTracing网站

项目示例由webdev_proxy运行。运行:

pub global activate webdev
pub global activate webdev_proxy
webdev_proxy serve -- example:8080

Dart OpenTracing实现

OpenTracing追踪器实现

本节面向希望实现自己的追踪器的开发人员。仅想使用OpenTracing的开发人员可以忽略此信息。

自定义追踪器实现

实现者可以实现Tracer,扩展Span,并实现或扩展其他API类来构建一个OpenTracing追踪器。

有关示例,请参阅basictracer-dart

API兼容性测试

即将推出/待办事项


以下是完整的示例代码:

// Copyright 2016 Workiva Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import 'dart:html';

import 'package:opentracing/opentracing.dart';
import 'package:opentracing/src/global_tracer.dart';

import 'json_serializable_span.dart';

/// 全局追踪器
AbstractTracer tracer = globalTracer();

/// Span完成时的处理程序
void onFinished(Span span) {
  print(JsonSerializableSpan(span).toJson());
}

/// 运行成功案例
void runSuccessCase() {
  Span span = tracer.startSpan('http_request')!;
  span.whenFinished.then(onFinished);

  HttpRequest.getString('http://httpstat.us/200').then((String result) {
    span.log('data_received', payload: result);
  }).catchError((dynamic error) {
    span.log('request_error', payload: error);
  }).whenComplete(() {
    span
      ..log('request_end')
      ..finish();
  });
}

/// 运行失败案例
void runFailureCase() {
  Span span = tracer.startSpan('http_request')!;
  span.whenFinished.then(onFinished);

  HttpRequest.getString('http://httpstat.us/500').then((String result) {
    span.log('data_received', payload: result);
  }).catchError((error) {
    span.log('request_error', payload: error);
  }).whenComplete(() {
    span
      ..log('request_end')
      ..finish();
  });
}

void main() {
  runSuccessCase();
  runFailureCase();
}

更多关于Flutter分布式追踪插件opentracing的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分布式追踪插件opentracing的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中使用Opentracing进行分布式追踪,可以帮助你监控和诊断跨多个服务的请求流程。虽然Flutter本身是一个用于构建跨平台移动应用的UI框架,并不直接支持Opentracing,但你可以通过集成支持Opentracing的后端服务和插件来实现这一功能。

以下是一个在Flutter中集成Opentracing插件的示例,这里假设你有一个后端服务已经配置了Opentracing(例如使用Jaeger),并且你希望从Flutter应用发送追踪信息到这个后端服务。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加必要的依赖。由于Flutter原生不支持Opentracing,你可能需要使用HTTP客户端库来发送追踪数据。这里我们使用dio库作为HTTP客户端。

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 确保使用最新版本

步骤 2: 发送追踪数据

接下来,你需要编写代码来发送追踪数据到你的Jaeger或其他Opentracing兼容的后端服务。这里是一个简单的例子,展示如何使用dio库发送HTTP POST请求来发送追踪数据。

import 'package:dio/dio.dart';
import 'dart:convert';

void main() async {
  // 创建Dio实例
  final dio = Dio();

  // 追踪数据(示例)
  Map<String, dynamic> traceData = {
    "traceId": "1234567890abcdef",
    "spanId": "abcdef1234567890",
    "parentId": "0987654321fedcba",
    "operationName": "flutter.request",
    "startTime": DateTime.now().toIso8601String(),
    "duration": 1234567,  // 微秒
    "tags": {
      "http.method": "GET",
      "http.url": "https://example.com/api/resource",
      "error": false,
    },
  };

  // 将追踪数据转换为JSON字符串
  String jsonData = jsonEncode(traceData);

  // 发送POST请求到Jaeger或其他追踪服务
  try {
    Response response = await dio.post(
      "http://your-jaeger-collector-url/api/traces",
      data: jsonData,
      options: Options(
        contentType: Headers.formUrlEncodedContentType,
        headers: {
          'Content-Type': 'application/json',
        },
      ),
    );

    print("追踪数据发送成功: ${response.data}");
  } catch (e) {
    print("发送追踪数据时出错: $e");
  }
}

注意

  1. Jaeger Collector URL: 替换http://your-jaeger-collector-url/api/traces为你的Jaeger或其他追踪服务的实际URL。
  2. 追踪数据格式: 确保你发送的追踪数据格式与你的追踪服务兼容。上面的示例是一个简单的JSON格式,但具体字段可能需要根据你的服务进行调整。
  3. 安全性: 在生产环境中,确保你的HTTP请求是安全的(例如使用HTTPS),并考虑添加适当的认证和授权机制。
  4. 错误处理: 在实际应用中,添加更详细的错误处理逻辑,以便在发送追踪数据时出现问题时能够优雅地处理。

这个示例展示了如何在Flutter应用中发送追踪数据到Opentracing兼容的后端服务。然而,对于更复杂的分布式追踪需求,你可能需要在后端服务中实现更详细的追踪逻辑,并在Flutter应用中与这些服务进行集成。

回到顶部