Envoy 状态统计

Envoy状态统计

  • Envoy运行过程中会生成大量的统计数据,这些统计数据大体可以分为三类

    • 下游:与传入Envoy的连接相关的统计信息,主要由侦听器、HTTP连接管理器和TCP代理过滤器等生成;

    • 上游:与离开Envoy的连接相关的统计信息,主要由连接池、路由器过滤器和TCP代理过滤器等生成;

    • Envoy服务器:记录了Envoy服务器实例的工作细节,例如服务器正常运行时间或分配的内存量等;

  • Envoy统计的数据类型主要有三类,数据类型均为无符号整数

    • Counter:累加型的计数器数据,单调递增,例如total requests等;

    • Gauge:常规的指标数据,可增可降,例如current active requests等;

    • Histogram:柱状图数据, 主要用于统计一些数据的分布情况,用于计算在一定范围内的分布情况,同时还提供了度量指标值的总和,例如upstream request time;
  • 几乎所有的统计数据都可以通过admin接口的/stats获取到;

stats相关的配置

stats的配置参数位于Bootstrap配置文件的顶级配置段

stats配置

node: {...}
static_resources: {...}
dynamic_resources: {...}
cluster_manager: {...}
hds_config: {...}
flags_path: ...
stats_sinks:  # stats_sink列表,为Envoy的可选配置,统计数据默认没有配置任何暴露机制,但需要存储长期的指标数据则应该手动定制此配置;
  name: ... 
  typed_config: {...}
stats_config: {...} # stats内部处理机制;
stats_flush_interval: {...} # stats数据刷写至sinks的频率,出于性能考虑,Envoy仅周期性刷写counters和gauges,默认时长为5000ms;
stats_flush_on_admin: ... # 仅在admin接口上收到查询请求时才刷写数据;
watchdog: {...}
watchdogs: {...}
tracing: {...}
layered_runtime: {...}
admin: {...}
overload_manager: {...}
enable_dispatcher_stats: ...
header_prefix: ...
stats_server_version_override: {...}
use_tcp_for_dns_lookups: ...
dns_resolution_config: {...}
typed_dns_resolver_config: {...}
bootstrap_extensions: []
fatal_actions: []
default_socket_interface: ...
inline_headers: []
perf_tracing_file_path: ...
default_regex_engine: {...}

stats_sinks

stats_sinks配置

...
stats_sinks:  # stats_sink列表,为Envoy的可选配置,统计数据默认没有配置任何暴露机制,但需要存储长期的指标数据则应该手动定制此配置;
  name: ... 
  typed_config: {...}

stats_sinks.typed_config

envoy.stat_sinks.statsd配置

...
stats_sinks:  # stats_sink列表,为Envoy的可选配置,统计数据默认没有配置任何暴露机制,但需要存储长期的指标数据则应该手动定制此配置;
  name: envoy.stat_sinks.statsd # 要初始化的Sink的名称,名称必须匹配于Envoy内置支持的sink,包括envoy.stat_sinks.dog_statsd、envoy.stat_sinks.graphite_statsd、envoy.stat_sinks.hystrix、envoy.stat_sinks.metrics_service、envoy.stat_sinks.statsd和envoy.stat_sinks.wasm几个;它们的功用类似于Prometheus的exporter;
  typed_config: # statsd专用配置
    "@type": type.googleapis.com/envoy.config.metrics.v3.StatsdSink
    address: {...} # StatsdSink服务的访问端点,也可以使用下面的tcp_cluster_name指定为配置在Envoy上的Sink服务器组成集群;
    tcp_cluster_name: ... # StatsdSink集群的名称,与address互斥;
    prefix: ... # StatsdSink的自定义前缀,可选参数;默认值为envoy。指标表示格式: <metricname>:<value>|<type> 例如envoy.test_timer:5|ms

statsd exporter

  • StatsD exporter是 StatsD 的直接替代品。此exporter通过配置的映射规则将 StatsD 指标转换为 Prometheus 指标。

Tag Specifier

Envoy的统计信息由规范字符串表示法进行标识,这些字符串的动态部分可被剥离标签(tag),并可由用户通过tag specifier进行配置;

...
stats_config:  # stats内部处理机制;
  stats_tags:  # 每个统计名称都通过这些标签说明符独立处理。当标签匹配时,第一个捕获组不会立即从名称中删除,因此以后的 TagSpecifiers也可以匹配匹配的同一部分。在完成所有标签匹配后,将生成名称的标签提取版本,并用于表示标签的统计信息接收器,例如 Prometheus。
    tag_name: ... # 将标识符附加到标签值以标识接收器中的标签。
    regex: ... # 指定要从标签提取名称中剥离的标签,并作为命名标签值提供给所有统计信息。仅当名称的任何部分与一个或多个捕获组提供的正则表达式匹配时才会发生这种情况。只能设置regex、fixed_value其中之一。
    fixed_value: ... #值为tag_name。只能设置regex、fixed_value其中之一。
  use_all_default_tags: {...} # 使用 Envoy 中指定的所有默认标签正则表达式。这些可以与stats_tags中指定的自定义标签结合使用。它们将在自定义标签之前进行处理。默认值为true。
  stats_matcher: {...} # 用于统计名称创建的包含/排除匹配器。如果未提供,则所有统计信息都将正常实例化。阻止某些统计系列的实例化可以提高 Envoy 运行特别大的配置的内存性能。
  histogram_bucket_settings: [] # 定义设置直方图桶的规则

Envoy 状态统计配置示例

envoy-config.yaml

node:
  id: front-envoy
  cluster: mycluster

admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
       address: 0.0.0.0
       port_value: 9901

layered_runtime:
  layers:
  - name: admin
    admin_layer: {}

stats_sinks:
- name: envoy.stat_sinks.statsd
  typed_config:
    "@type": type.googleapis.com/envoy.config.metrics.v3.StatsdSink
    tcp_cluster_name: statsd_exporter
    prefix: front-envoy

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:   
                  cluster: colord
                  retry_policy:
                    retry_on: "5xx"
                    num_retries: 3                  
                  timeout: 1s                  
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
  - name: colord
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: colord
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: myservice
                port_value: 80

  - name: statsd_exporter
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: statsd_exporter
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: statsd_exporter
                port_value: 9125

Prometheus

global:
  scrape_interval:  15s
  evaluation_interval:  15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'grafana'
    static_configs:
      - targets: ['grafana:3000']

  - job_name: 'statsd'
    scrape_interval: 5s
    static_configs:
      - targets: ['statsd_exporter:9102']
        labels:
          group: 'services'

参考文档

https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/observability/statistics

https://github.com/prometheus/statsd_exporter

posted @ 2022-09-16 15:15  小吉猫  阅读(407)  评论(0编辑  收藏  举报