OpenTelemetry(3): Collector Contrib 配置接入 Aliyun SLS Trace 服务

Opentelmetry(2): 【内部分享】 从入门到精通 中提到, 应用通过 OpenTelemetry Collector Contrib 将采集到的数据转发到 任意后端程序。

阿里云提供了一个 SLS Trace 服务 , 类似于 Jaeger, 可以提供服务的观测性。

1. 创建 SLS Trace 服务

创建新实例之后, 可以看到如下图

sls-trace-service

其中标记的 1,2,3 之后 授权访问 需要用到的。

除了这几个参数之外, 还需要 logstore 名称, 可以理解为这个就是数据的真实位置。

sls-trace-service-logstore.png

1.1. 创建 RAM 账号授权策略

经过测试 SLS Trace 服务接入的时候, 并不支持 STS Token 授权。 必须要单独创建 RAM 账户, 并拿到编程的 Access IDAccess Key

在创建 RAM 账户的时候, 可以直接使用 阿里云最小化权限模版

sls-trace-service-ram-policy

在文档中可以看到, 权限按照功能分成了几个模块。 合并后的最终结果如下。

其中, ${project_name} 图1 中的 k8s-xxxxxxx${logstore_name} 就是 图2 中的 sls-trace-devops-traces

 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "log:Post*"
      ],
      "Resource": "acs:log:*:*:project/${project_name}/*",
      "Effect": "Allow"
    },
    {
      "Effect": "Allow",
      "Action": [
        "log:PostLogStoreLogs"
      ],
      "Resource": [
        "acs:log:*:*:project/${project_name}/logstore/${logstore_name}"
      ]
    },
    {
      "Action": [
        "log:ListShards",
        "log:GetCursorOrData",
        "log:GetConsumerGroupCheckPoint",
        "log:UpdateConsumerGroup",
        "log:ConsumerGroupHeartBeat",
        "log:ConsumerGroupUpdateCheckPoint",
        "log:ListConsumerGroup",
        "log:CreateConsumerGroup"
      ],
      "Resource": "acs:log:*:*:project/${project_name}/*",
      "Effect": "Allow"
    },
    {
      "Action": [
        "log:ListShards",
        "log:GetCursorOrData",
        "log:GetConsumerGroupCheckPoint",
        "log:UpdateConsumerGroup",
        "log:ConsumerGroupHeartBeat",
        "log:ConsumerGroupUpdateCheckPoint",
        "log:ListConsumerGroup",
        "log:CreateConsumerGroup"
      ],
      "Resource": [
        "acs:log:*:*:project/${project_name}/logstore/${logstore_name}",
        "acs:log:*:*:project/${project_name}/logstore/${logstore_name}/*"
      ],
      "Effect": "Allow"
    },
    {
      "Effect": "Allow",
      "Action": [
        "log:CreateLogStore",
        "log:UpdateLogStore"
      ],
      "Resource": [
        "acs:log:*:*:project/${project_name}/logstore/${logstore_name}",
        "acs:log:*:*:project/${project_name}/logstore/*"
      ],
      "Condition": {
        "Bool": {
          "log:Encrypted": "true"
        }
      }
    }
  ]
}

其他操作就不说了, 就是常规的创建 RAM 账号和授权。

创建 RAM 账号后, 可以获得编程用的 Access IDAccess Key

2. 接入 SLS Trace 服务

可以参考 SLS Trace 服务的相关文档 , 在 接入数据概览 中可以看到 , SLS Trace 服务提供了两种方式接入

  1. 直接接入: app -> SLS-Trace-Service
  2. 通过 OpenTelemetry Collector 转发接入: app -> OpenTelemetry Collector -> SLS-Trace-Service

2.1 直接接入

千万不要使用这种方式。

以 Go 为例, 我们使用 OpenTelmetry 官方的 Fibonacci 案例

按照阿里云文档案例, 使用 阿里云官方的 sls/provider

1
2
3
import (
    "github.com/aliyun-sls/opentelemetry-go-provider-sls/provider"
)

注意, 当前(2022-12-23) 阿里云提供的 provider 库并不支持最新的 OpenTelemetry v1.11.2 版本。 需要在 go.mod 中将 OpenTelemetry 降级到 v1.10.0

再强调一次, 千万不要使用直接接入 的方式。

  1. Aliyun 的官方库更新不及时, 依赖版本过低。 导致接入的时候还需要依赖库降级版本。 侵入性不是一般的大
  2. 使用了 aliyun 的库之后, 意味着后台其他平台还需要单独额外的适配。

2.2. 重点来了 Contrib 转发接入

就是使用 OpenTelemetry Collector Contrib 作为中间人转发数据, 好处是 收敛了 RAM 权限账号分发管理。 将 Dev 的配置操作转移到的 Ops , 减少对业务的侵入。

OpenTelemetry Collector Contrib 下载地址 在 Github 上, 官方提供, 放心使用。

参考阿里云的 contrib 转发 sls trace 文档 , 还是很简单的, 这里给出的是一个很基础的配置。

注意, 配置 endpoint 字段的时候, 地址 不需要 配置 project_name端口。 这个配置走的是 http(s) 协议。

 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
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: "0.0.0.0:55680"
      http:
        endpoint: "0.0.0.0:55681"
exporters:
  logging/detail:
    loglevel: debug
  alibabacloud_logservice/traces:
    endpoint: "cn-shanghai.log.aliyuncs.com"
    project: "${project_name}"
    logstore: "${log_store}-traces"
    access_key_id: "${access_key_id}"
    access_key_secret: "${access_key_secret}"
  alibabacloud_logservice/metrics:
    endpoint: "cn-shanghai.log.aliyuncs.com"
    project: "${project_name}"
    logstore: "${log_store}-metrics"
    access_key_id: "${access_key_id}"
    access_key_secret: "${access_key_secret}"
  alibabacloud_logservice/logs:
    endpoint: "cn-shanghai.log.aliyuncs.com"
    project: "${project_name}"
    logstore: "${log_store}-logs"
    access_key_id: "${access_key_id}"
    access_key_secret: "${access_key_secret}"

service:
  pipelines:
    traces:
      receivers: [otlp]           #接收端配置为otlp。
      exporters: [alibabacloud_logservice/traces]   #发送端配置为alibabacloud_logservice/traces。
      # for debug
      #exporters: [logging/detail,alibabacloud_logservice/traces]
    metrics:
      receivers: [otlp]
      exporters: [alibabacloud_logservice/metrics]
    logs:
      receivers: [otlp]
      exporters: [alibabacloud_logservice/logs]

在测试的时候, 这里可以使用 OpenTelemetry Collector 官方的测试用例

注意 阿里云给出的转发配置, 端口给出的是 grpc://0.0.0.0:55680http://0.0.0.0:55681。 而测试用例连接的是 grpc://localhost:30080 , 需要做相应修改。

其他没什么需要注意的。