Apache SkyWalking용 Grafana 대시보드 구축 - 기본 PromQL 지원

배경

분산 시스템용 애플리케이션 성능 모니터링 도구인 Apache SkyWalking은 클라우드 네이티브 아키텍처에서 분산 시스템에 대한 모니터링, 추적 및 진단 기능을 제공합니다. Prometheus  는 활성 생태계를 갖춘 오픈 소스 시스템 모니터링 및 경고 툴킷입니다. 특히 Prometheus 메트릭은  내보내기 및 통합을 통해  광범위하게 지원됩니다  . Prometheus 쿼리 언어인 PromQL은  일련의 표현식을 포함하고 HTTP API를 노출하여 지표를 읽습니다.

SkyWalking은 OpenTelemetry 수집기를 통해  Prometheus 메트릭 수집을 지원하고 이러한 메트릭의 집계 계산을 통해 Linux 모니터링 및 Kubernetes 모니터링과 같은 다양한 시스템 모니터링을 제공합니다. SkyWalking은 이미 사용자에게  기본 UI  및  GraphQL API를 제공합니다 . 그러나 보다 광범위한 생태계 통합 기능을 제공하기 위해 9.4.0부터는 이미 PromQL을 지원하는 타사 시스템 또는 시각화 플랫폼(예: Grafana)이 지표를 얻을 수 있는 PromQL 서비스를 제공합니다. SkyWalking 사용자는 다른 시스템과 통합할 때 이점을 얻을 수 있습니다.

SkyWalking의 PromQL 서비스는 무엇입니까?

PromQL 서비스는 SkyWalking의 기본 GraphQL 쿼리 위에 있는 쿼리 엔진으로, Prometheus 식으로 구동되는 추가 쿼리 단계 컴퓨팅 기능이 있습니다. PromQL HTTP API 요청을 수락하고, Prometheus 표현식을 구문 분석하고, Prometheus 메트릭과 SkyWalking 메트릭 간에 변환할 수 있습니다.

PromQL 서비스는 PromQL의 모든 프로토콜과 구문을 따르며 사용자는 PromQL처럼 사용할 수 있습니다. SkyWalking은 메트릭 분류, 형식, 저장 등의 측면에서 Prometheus와 근본적으로 다르므로 PromQL 서비스에서 전체 PromQL 기능을 구현하는 데 필요하지 않습니다. 자세한 내용은 설명서를 참조하십시오 .

스카이워킹의 기본 개념

다음은 PromQL 서비스를 사용할 때 사용자가 이해해야 하는 몇 가지 기본 개념과 Prometheus와의 차이점입니다. Prometheus 표시기는 명명 형식과 구조를 지정하고 실제 표시기 이름과 레이블은 클라이언트 제공자가 결정하고 자세한 정보를 저장합니다. 사용자는 PromQL의 표현식을 사용하여 메트릭을 집계하고 계산합니다. Prometheus와 달리 SkyWalking의 메트릭 메커니즘은 다음과 같은 계층 구조의 핵심 개념을 중심으로 구축됩니다.

  • 계층(Layer): 운영 체제(OS_LINUX 계층), Kubernetes(k8s 계층)와 같은 컴퓨터 과학의 추상 프레임워크를 나타냅니다. 이 계층은 다양한 기술에서 감지된 다양한 서비스의 소유자가 됩니다. 여기에서 사용 가능

    모든 레이어 정의를 찾습니다.

  • 서비스: 들어오는 요청에 대해 동일한 동작을 제공하는 워크로드 그룹/집합을 나타냅니다.

  • 서비스 인스턴스: 서비스 그룹의 단일 워크로드입니다.

  • 끝점: 들어오는 요청에 대한 서비스 경로입니다.

  • 프로세스: 운영 체제 프로세스. 일부 시나리오에서는 service instance 프로세스가 아닙니다. 예를 들어 Kubernetes Pod에는 여러 프로세스가 포함될 수 있습니다.

Metric 名称和属性(标签)由 SkyWalking OAP 服务器根据数据源以及 OAL 和 MAL 配置。SkyWalking 提供了对时间序列指标进行下采样(down-sampling),并生成不同时间段数据(分钟、小时、天)的能力。

SkyWalking 指标流如下:

流量

  • Service/ServiceRelation/Instance/ServiceInstanceRelation/Endpoint/EndpointRelation/Process/ProcessRelation 的元数据。包括名称、层、属性、它们之间的关系等。

指标

  • 名称(Name):指标名称,来自 OAL 和 MAL 的配置。
  • 实体(Entity):表示指标的归属,用于查询。一个 Entity 根据 Scope 不同会包含如下信息: Scope 代表指标级别,在查询阶段代表 Scope catalog,Scope catalog 为所有的 scope 提供了高维的分类,层次结构。
Scope 实体信息
Service 服务(包括图层信息)
ServiceInstance 服务、服务实例
Endpoint 服务、端点
ServiceRelation 服务,目标服务
ServiceInstanceRelation 服务实例、目标服务实例
EndpointRelation 端点、目标端点
Process 服务、服务实例、流程
ProcessRelation 进程、服务实例、DestProcess
  • 值:
  1. 单值:long
  2. 标签值:文本,label1,value1|label2,value2|... ,例如 L2 aggregation,5000 | L1 aggregation,8000
  • TimeBucket:时间精确到分钟、小时、天

如何使用 PromQL 服务

设置

PromQL 服务在 v9.4.0 之后默认开启,不需要额外配置。例如,可以使用 OAP 环境变量配置默认端口:

restHost: ${SW_PROMQL_REST_HOST:0.0.0.0}
restPort: ${SW_PROMQL_REST_PORT:9090}
restContextPath: ${SW_PROMQL_REST_CONTEXT_PATH:/}
restMaxThreads: ${SW_PROMQL_REST_MAX_THREADS:200}
restIdleTimeOut: ${SW_PROMQL_REST_IDLE_TIMEOUT:30000}
restAcceptQueueSize: ${SW_PROMQL_REST_QUEUE_SIZE:0}
复制代码

使用 Prometheus 表达式

PromQL 通过 Prometheus 表达式匹配指标。这是一个典型的 Prometheus 指标。

为了匹配指标,Prometheus 表达式如下:

在 PromQL 服务中,这些保留的标签将被解析为度量名称和实体信息字段以及用于查询的其他标签。映射如下。

SkyWalking 概念 Prometheus 表达
指标名称 指标名称
标签
服务 标签
服务实例 标签 <服务实例>
端点 标签
…… ……

例如,以下表达式用于匹配查询指标:service_cpm、service_instance_cpm、endpoint_cpm

service_cpm {service='agent::songs', layer='GENERAL'}
service_instance_cpm {service='agent::songs', service_instance='agent::songs_instance_1', layer='GENERAL'}
endpoint_cpm {service='agent::songs', endpoint='GET:/songs', layer='GENERAL'}
复制代码

典型查询示例

在这里,我们将 SkyWalking Showcase 部署作为 Playground 来演示如何使用 PromQL 获取 SkyWalking 指标。

以下示例可用于通过 PromQL 服务查询服务的元数据和指标。

获取指标名称

查询:

http://localhost:9099/api/v1/label/__name__/values
复制代码

结果:

{
    "status": "success",
    "data": [
        "meter_mysql_instance_qps",
        "service_cpm",
        "envoy_cluster_up_rq_active",
        "instance_jvm_class_loaded_class_count",
        "k8s_cluster_memory_requests",
        "meter_vm_memory_used",
        "meter_apisix_sv_bandwidth_unmatched",
        "meter_vm_memory_total",
        ...
    ]
}
复制代码

选择一个指标并获取标签

查询:

http://localhost:9099/api/v1/labels?match []=service_cpm
复制代码

结果:

{
  "status": "success",
  "data": [
    "layer",
    "service",
    "top_n",
    "order"
  ]
}
复制代码

从特定层获取服务

查询:

http://127.0.0.1:9099/api/v1/series?match []=service_traffic {layer='GENERAL'}&start=1677479336&end=1677479636
复制代码

结果:

{
    "status": "success",
    "data": [
        {"__name__": "service_traffic",
            "service": "agent::songs",
            "scope": "Service",
            "layer": "GENERAL"
        },
        {"__name__": "service_traffic",
            "service": "agent::recommendation",
            "scope": "Service",
            "layer": "GENERAL"
        },
        {"__name__": "service_traffic",
            "service": "agent::app",
            "scope": "Service",
            "layer": "GENERAL"
        },
        {"__name__": "service_traffic",
            "service": "agent::gateway",
            "scope": "Service",
            "layer": "GENERAL"
        },
        {"__name__": "service_traffic",
            "service": "agent::frontend",
            "scope": "Service",
            "layer": "GENERAL"
        }
    ]
}
复制代码

查询服务的特定指标

查询:

http://127.0.0.1:9099/api/v1/query?query=service_cpm {service='agent::songs', layer='GENERAL'}
复制代码

结果:

{
  "status": "success",
  "data": {
    "resultType": "vector",
    "result": [
      {"metric": {
          "__name__": "service_cpm",
          "layer": "GENERAL",
          "scope": "Service",
          "service": "agent::songs"
        },"value": [
          1679559960,
          "6"
        ]
      }
    ]
  }
}
复制代码

关于 range query 和不同的 metrics type for query 可以参考 这里的 文档。

构建 Grafana Dashboard

从上面我们知道了 PromQL 服务的机制和查询方式,现在我们可以为上面的服务示例构建 Grafana Dashboard。:以下所有配置均基于 Grafana 9.1.0 版本。

SkyWalking Showcase 提供了 General Service 和 Service Mesh 层等 Dashboard 文件,我们可以通过导入 Dashboard JSON 文件快速为层服务创建 Dashboard。

部署 Grafana 应用程序后,请按照以下步骤操作:

配置数据源

首先,我们需要创建一个数据源: 在数据源配置面板中,选择 Prometheus 并设置 URL 为 OAP 服务器地址,默认端口为 9090。 SkyWalking 如果有多个 Prometheus 数据源,请在此处设置数据源名称。

导入 Dashboard 文件

  1. 创建一个名为 SkyWalking 的 Dashboard 文件夹。

  2. 将 Dashboard 文件导入到 Grafana 中,有两种获取文件的方式:

    1. 来自 SkyWalking Showcase
    2. 转到 SkyWaking Demo:在 Grafana 上预览指标,并将其从 General Service Dashboard 导出。

  3. 完毕!现在我们可以看到 Dashboard 正在运行,服务位于下拉列表中,指标显示在面板上。

这是一种简单的构建方式,但是如果我们想要自定义它,我们需要知道它是如何工作的。

Dashboard 的工作原理

Dashboard 设置

打开 Settings-Variables 我们可以看到如下变量:

让我们看看每个变量的作用:

  1. $DS_SkyWalking

    这是一个数据源 ty 变量,它指定了之前定义为 SkyWalking 的 Prometheus 数据源。

  2. $layer

    这是一个常量类型,因为在 ‘General Service’ Dashboard 中,所有服务都属于 ‘GENERAL’ 层,因此可以在每个查询中直接使用它们。注意,当您自定义其他层时,必须在 Layer 上面定义该值。

  3. $service

    查询类型变量,为下拉列表获取该层下的所有服务名称。

    查询表达式:

    label_values (service_traffic {layer='$layer'}, service)
    复制代码

    查询表达式将查询 HTTP API /api/v1/series,以获取 $layer 中服务元数据,并根据标签(服务)提取服务名称。

  4. $service_instance

    与 $service 一样,是一个查询变量,用于在下拉列表中选择服务的所有实例。

    查询表达式:

    label_values (instance_traffic {layer='$layer', service='$service'}, service_instance)
    复制代码

    这里的查询表达式不仅指定了 $layer 还包含 $service 变量,用于关联下拉列表的服务。

  5. $endpoint

    与 $service 一样,是一个查询变量,用于在下拉列表中选择服务的所有端点。

    查询表达式:

    label_values (endpoint_traffic {layer='$layer', service='$service', keyword='$endpoint_keyword', limit='$endpoint_limit'}, endpoint)
    复制代码

    此处的查询表达式指定 $layer 和 $service 用于与下拉列表的服务相关联的。并且还接受 $endpoint_keyword 和 $endpoint_limit 变量作为过滤条件。

  6. $endpoint_keyword

    一个文本类型的变量,用户可以输入它来过滤 $endpoint 的返回值。

  7. $endpoint_limit

    自定义类型,用户可以选择它以限制返回端点的最大数量。

Dashboard 配置

这个 Dashboard 上有几个典型的指标面板,让我们看看它是如何配置的。

普通值指标

选择 Time series chart 面板 Service Apdex 并单击 edit。

  1. 查询表达式

    service_apdex {service='$service', layer='$layer'} / 10000
    复制代码

    指标范围为 Service,添加 service 和 layer 标签用于匹配,label 值使用上面配置的变量。该计算 Divided by 10000 用于匹配结果单位。查询文档可以参考 这里

  2. 设置 Query options --> Min interval = 1m,因为 SkyWalking 中的指标最小时间段是 1m。

  3. 设置 Connect null values --> AlwaysShow points --> Always,因为当查询间隔大于 1 小时或 1 天时,SkyWalking 返回小时 / 天步长指标值。

标签值指标

选择 Time series chart 面板 Service Response Time Percentile 并单击 edit

  1. 查询表达式

    service_percentile {service='$service', layer='$layer', labels='0,1,2,3,4', relabels='P50,P75,P90,P95,P99'}
    复制代码

    指标范围为 Service,添加 service 和 layer 标签用于匹配,label 值使用上面配置的变量。添加 labels='0,1,2,3,4' 过滤结果标签,并添加 relabels='P50,P75,P90,P95,P99' 重命名结果标签。查询文档可以参考 这里

  2. 设置 Query options --> Min interval = 1m,因为 SkyWalking 中的指标最小时间段是 1m。

  3. 设置 Connect null values --> AlwaysShow points --> Always,因为当查询间隔 > 1 小时或 1 天时,SkyWalking 返回小时 / 天步长指标值。

  4. 设置 Legend 为 {{label}} 来展示。

排序指标

选择 Time series chart 面板 Service Response Time Percentile 并单击 edit

  1. 查询表达式

    service_instance_cpm {parent_service='$service', layer='$layer', top_n='10', order='DES'}
    复制代码

    该表达式用于查询服务下的排序指标,因此添加标签 parent_service 和 layer 进行匹配。添加 top_n='10' 和 order='DES' 过滤结果。查询文档可以参考 这里

  2. 设置 Query options --> Min interval = 1m,因为 SkyWalking 中的指标最小时间段是 1m。

  3. 设置 Calculation --> Latest*

  4. 设置 Legend 为 {{service_instance}} 来展示。

结论 

在这篇文章中,我们介绍了 SkyWalking 中的 PromQL 服务是什么以及它的背景。详细介绍了 PromQL 服务的使用方法和 SkyWalking 相关的基本概念,展示了如何使用 PromQL 服务为 SkyWalking 构建 Grafana Dashboard。

未来,将会有更多的集成利用这个协议,比如 CI/CD、HPA(缩放)等。

추천

출처juejin.im/post/7215454235054473277