Rust OpenTelemetry OTLP 带 Honeycomb

2023-12-01

我正在尝试使用opentelemetry and open telemetry-otlp通过 OTLP 向 Honeycomb 提供可观测性数据。

我使用这样的东西作为概念证明(如果你想运行它,可以将其提取到此存储库中:https://github.com/timfpark/honeycomb-rust-poc)

fn init_tracer(metadata: &MetadataMap) -> Result<sdktrace::Tracer, TraceError> {
    let opentelemetry_endpoint =
        env::var("OTEL_ENDPOINT").unwrap_or_else(|_| "https://api.honeycomb.io".to_owned());
    let opentelemetry_endpoint =
        Url::parse(&opentelemetry_endpoint).expect("OTEL_ENDPOINT is not a valid url");

    opentelemetry_otlp::new_pipeline()
        .tracing()
        .with_exporter(
            opentelemetry_otlp::new_exporter()
                .tonic()
                .with_endpoint(opentelemetry_endpoint.as_str())
                .with_metadata(metadata.clone())
                .with_tls_config(
                    ClientTlsConfig::new().domain_name(
                        opentelemetry_endpoint
                            .host_str()
                            .expect("OTEL_ENDPOINTshould have a valid host"),
                    ),
                ),
        )
        .install_batch(opentelemetry::runtime::Tokio)
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {

    let mut metadata = MetadataMap::with_capacity(2);

    metadata.insert(
        "x-honeycomb-team",
        "...honeycomb api key...".parse().unwrap(),
    );

    metadata.insert("x-honeycomb-dataset", "my-api".parse().unwrap());

    let tracer = init_tracer(&metadata).expect("failed to instantiate opentelemetry tracing");

    tracing_subscriber::registry()
        .with(tracing_subscriber::EnvFilter::from_default_env())
        .with(tracing_opentelemetry::layer().with_tracer(tracer))
        .with(tracing_subscriber::fmt::layer())
        .try_init()
        .expect("failed to register tracer with registry");

    let tracer = global::tracer("ex.com/basic");

但我得到:

2022-11-02T17:01:01.088429Z DEBUG hyper::client::connect::http: connecting to 52.5.162.226:443
2022-11-02T17:01:01.170767Z DEBUG hyper::client::connect::http: connected to 52.5.162.226:443
2022-11-02T17:01:01.171870Z DEBUG rustls::client::hs: No cached session for DnsName(DnsName(DnsName("api.honeycomb.io")))
2022-11-02T17:01:01.172555Z DEBUG rustls::client::hs: Not resuming any session
2022-11-02T17:01:01.269218Z DEBUG rustls::client::hs: ALPN protocol is Some(b"h2")
2022-11-02T17:01:01.269398Z DEBUG rustls::client::hs: Using ciphersuite TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
2022-11-02T17:01:01.269504Z DEBUG rustls::client::tls12::server_hello: Server supports tickets
2022-11-02T17:01:01.269766Z DEBUG rustls::client::tls12: ECDHE curve is ECParameters { curve_type: NamedCurve, named_group: secp256r1 }
2022-11-02T17:01:01.269843Z DEBUG rustls::client::tls12: Server DNS name is DnsName(DnsName(DnsName("api.honeycomb.io")))
2022-11-02T17:01:01.271123Z  WARN rustls::conn: Sending fatal alert BadCertificate
2022-11-02T17:01:01.271861Z DEBUG tonic::transport::service::reconnect: reconnect::poll_ready: hyper::Error(Connect, Custom { kind: InvalidData, error: InvalidCertificateData("invalid peer certificate: UnknownIssuer") })
2022-11-02T17:01:01.271967Z DEBUG tower::buffer::worker: service.ready=true processing request
2022-11-02T17:01:01.272169Z DEBUG tonic::transport::service::reconnect: error: error trying to connect: invalid peer certificate contents: invalid peer certificate: UnknownIssuer
OpenTelemetry trace error occurred. Exporter otlp encountered the following error(s): the grpc server returns error (The service is currently unavailable): , detailed error message: error trying to connect: invalid peer certificate contents: invalid peer certificate: UnknownIssuer

这似乎表明我的 TLS 设置不正确...有人有片段吗opentelemetryRust 中的代码可以与 Honeycomb 一起使用吗?


问题是:您需要为 ClientTlsConfig 提供一个根证书,目标站点 (api.honeycomb.io) 会链接回该根证书。

我在我的容器中找到了合适的根证书,然后让程序加载它。

这是代码:

let pem = tokio::fs::read("/etc/ssl/certs/Starfield_Services_Root_Certificate_Authority_-_G2.pem").await.expect("read the cert file");
let cert = Certificate::from_pem(pem);

let mut metadata = MetadataMap::with_capacity(1);
metadata.insert("x-honeycomb-team", honeycomb_api_key.parse().unwrap());

let opentelemetry_endpoint =
        env::var("OTEL_ENDPOINT").unwrap_or_else(|_| "https://api.honeycomb.io".to_owned());

let opentelemetry_endpoint =
        Url::parse(&opentelemetry_endpoint).expect("OTEL_ENDPOINT is not a valid url");

opentelemetry_otlp::new_pipeline()
    .tracing()
    .with_exporter(
        opentelemetry_otlp::new_exporter()
            .tonic()
            .with_endpoint(opentelemetry_endpoint.as_str())
            .with_metadata(metadata.clone())
            .with_tls_config(
                ClientTlsConfig::new().ca_certificate(cert)
            ),
    )
    .install_batch(opentelemetry::runtime::Tokio)
}

前两行是新的;他们从文件系统加载根证书。 然后使用它来配置客户端 Tls 配置。

我根据证书详细信息的输出选择了根证书文件:openssl s_client -connect api.honeycomb.io:443 -servername localhost

证书链中的最后一个条目类似于文件名。它包括:/CN=Starfield Services Root Certificate Authority - G2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust OpenTelemetry OTLP 带 Honeycomb 的相关文章

随机推荐

  • 如何在 HL7 消息中使用转义字符

    我在用ca uhn hl7v2 util Terser创建 HL7 消息 对于 HL7 字段之一 我需要设置以下值 家 一 二 HL7消息类型为MDM T02 版本为2 3 1 因为 是 hl7 消息中的转义字符 如果我尝试使用 publi
  • PHP 中的 URL 转换

    我在 html 页面中有以下 url delete Release 1 但是当我尝试打印它时 它会以以下方式出现 delete Release 201 任何人都可以建议如何在 PHP 中将这个十六进制值 20 转换为空格 urldecode
  • 在函数内使用“粘贴”名称

    我有一个函数可以计算一些东西 然后将其分配给一个矩阵 该矩阵从粘贴语句接收其名称 基于一些其他当前值 然后我想将暗名称分配给矩阵 但不知道如何使粘贴的名称被理解 这是正在发生的事情 function lt someComputations
  • 当覆盖范围减少时,SonarQube 质量门将失败

    我正在使用 SonarQube 4 3 并尝试让质量门 以前称为警报 工作 但当集成测试覆盖率自上次分析以来减少时 该质量门就会失败 有谁知道如何做到这一点 好的 就是这样 设置 覆盖范围 自上次分析以来的增量 小于 0 如果这会导致错误
  • 最近发布的 GAE PHP 运行时可以访问本机 GAE 数据存储吗?

    Google 刚刚宣布支持 App Engine 的 PHP 运行时 我有一个使用 Java 运行时开发的应用程序 它利用本机 App Engine 数据存储区 它目前充当移动客户端的后端 我们正在考虑开发一个单独的 Web 前端 它需要与
  • Python 2 中的整数数组输入

    我是Python新手 我想获取 2 个大小为 4 的整数数组 a 和 b 的用户输入并打印它们 输入应该以空格分隔 第一个用户应该像这样输入数组 a 1 2 3 4 他应该像这样输入数组 b 2 3 4 6 程序应该将 a 和 b 显示为输
  • 优化我的模拟数据库的代码

    我一直在写一个程序 模拟一个小型数据库 可以在其中进行查询 写完代码后 我已经执行了它 但性能相当糟糕 它的工作速度真的很慢 我尝试过改进它 但几个月前我就开始自学C 所以我的知识还很低 所以我想找到一种解决方案来提高性能 让我解释一下我的
  • 选择 pandas 列时出现 KeyError

    我正在尝试将 CSV 文件读入 pandas 数据帧并选择一列 但不断出现关键错误 文件读入成功 我可以在 iPython 笔记本中查看数据帧 但是当我想选择第一列以外的任何列时 它会引发关键错误 我正在使用这段代码 import pand
  • JPA ManyToMany Join Table 的所有属性均为 PK

    我正在使用 Hibernate 3 3 1 并遵循建模这个示例表结构 但我在创建具有额外属性的连接表时遇到问题 这是多对多的关系Order and Product桌子 连接表是Order Detail桌子 我遵循了提到的方法here 现在我
  • 以编程方式导航到另一个视图控制器/场景

    从第一个视图控制器导航到第二个视图控制器时收到错误消息 我的编码是这样的 let vc LoginViewController nibName LoginViewController bundle nil self navigationCo
  • “惯用的”哈斯克尔型不等式

    从上一个问题编辑 我认为下面的代码不起作用 我希望实现一个 haskell 函数 f 它有一个限制 即它的 2 个参数不能具有相同的类型 我使用了以下代码 LANGUAGE MultiParamTypeClasses FunctionalD
  • 使用 contains 的 Linq 查询不起作用

    我想在 LINQ 中使用查询并使用类似于 TSQL 中 LIKE 的函数 例如 SELECT salary FROM employees WHERE last name LIKE R 我正在尝试在 LINQ to Oracle DB 中进行
  • 如何让android模拟器访问我的电脑文件?

    谁能告诉我如何让 android 模拟器访问我电脑的媒体文件 我不知道如何在两者之间建立连接 请帮助我 提前致谢 您可以查看这篇文章 了解有关将文件从 PC 推送到 Android 模拟器的信息 如何将文件导入Android模拟器上的SD卡
  • 让 FEST 等待应用程序加载

    我是基于 FEST 的 GUI 测试的新手 MyFrame 是我的应用程序的根类 Before public void onSetUp MyFrame frame GuiActionRunner execute new GuiQuery
  • “./”(点斜线)在 HTML 文件路径位置中指什么?

    I know 意思是走上一条路 但是什么意思 确切的意思是 我最近正在浏览一个教程 它似乎只是指同一位置的一个文件 所以有必要吗 如果这就是它所做的一切 我可以不使用它吗 表示当前驱动器的根目录 表示当前目录 表示当前目录的父目录
  • tabbar-mode 使编辑变得缓慢停止

    我今天尝试了 tabbar mode 版本 2 0 1 可以通过 marmelade elpa 存储库获得 版本 2 0 来自多尔姆斯 github 存储库 当标签栏模式被激活时 击键明显滞后 我想说 gt 1 秒 我使用 emacs 24
  • 在 ReduxReducer 中执行 Ajax 获取?

    我正在尝试访问 Redux actionCreators 内的状态 相反 执行了以下操作 在减速器中执行ajax操作 为什么我需要为此访问状态 因为我想使用存储在状态中的 CSRF 令牌来执行 ajax 有人可以告诉我以下是否被认为是不好的
  • 如何在java中将UTF-16转换为UTF-32?

    我一直在寻找解决方案 但似乎没有太多关于这个主题的内容 我找到了建议的解决方案 String unicodeString new String utf8 here byte bytes String getBytes UTF8 String
  • beforeRequest事件jqGrid:在调用url之前设置jqGrid页面

    我试图在对 URL 的 GET 请求之前设置 jqGrid 中的页面变量 jQuery frTable jqGrid cmTemplate sortable false caption TempData POPNAME Population
  • Rust OpenTelemetry OTLP 带 Honeycomb

    我正在尝试使用opentelemetry and open telemetry otlp通过 OTLP 向 Honeycomb 提供可观测性数据 我使用这样的东西作为概念证明 如果你想运行它 可以将其提取到此存储库中 https githu