基於Kafka Connect的流數據同步服務實現和監控體系搭建

1. Kafka Connect 簡介

Kafka 0.9+ 增加了一個新的特性 Kafka Connect,可以更方便的創建和管理數據流管道。它爲 Kafka 和其它系統創建規模可擴展的、可信賴的流數據提供了一個簡單的模型,通過Connectors 可以將大數據從其它系統導入到 Kafka 中,也可以從 Kafka 中導出到其它系統。

Kafka Connect 可以將完整的存儲系統中的數據注入到 Kafka 的 Topic 中,或者將服務器的系統監控指標註入到 Kafka,然後像正常的 Kafka 流處理機制一樣進行數據流處理。而導出工作則是將數據從 Kafka Topic 中導出到其它數據存儲系統、查詢系統或者離線分析系統等,比如 MySQL、MongoDB、Elasticsearch、 Cassandra、Ignite 等。

Kafka Consumer 和 Producer 都是 Develop 的工具,如果想用來做 Data Pipeline 或 ETL 工作並且同步大量的數據,同時還要對 Data Pipeline 做管理和監控,可以用Kafka Connect 來實現。

Kafka Connect 特性包括:

  • Kafka Connector 通用框架,提供統一的集成 API
  • 同時支持分佈式模式和單機模式
  • REST API,用來查看和管理 Kafka Connectors
  • 自動化的 offset 管理,開發人員不必擔心錯誤處理的影響
  • 分佈式、可擴展
  • 流處理和批處理集成

Kafka 背後的商業公司 Confluent 鼓勵社區創建更多的開源的 Connector,將 Kafka 生態圈壯大起來,促進 Kafka Connnect 的應用。

Kafka Connnect 有兩個核心概念:Source 和 Sink。Source 負責導入數據到 Kafka,Sink 負責從 Kafka 導出數據,它們都被稱爲 Connector。

當前 Kafka Connect 支持兩種分發擔保:at least once (至少一次) 和 at most once(至多一次),exactly once 將在未來支持。

Connectors 的發佈和開發可以參照官方文檔。如果以前你通過 producer API / consumer API 寫了一些導入導出的功能,不妨嘗試一下換成 Kafka Connect,看看是否簡化了你的代碼,提高了應用可擴展和容錯的能力。

2. Kafka Connect 概念

Kafka Connect 的幾個重要的概念包括:Connectors、Tasks、Workers、Converters、Transforms。

  • Connectors:通過管理任務來細條數據流的高級抽象
  • Tasks:數據寫入kafka和數據從kafka讀出的實現
  • Workers:運行connectors和tasks的進程
  • Converters:Kafka Connect 和其他存儲系統直接發送或者接受數據之間轉換數據
  • Transforms:更改 Connector 產生的或發送到 Connector 的每個消息的簡單處理邏輯
  • Dead Letter Queue:Kafka Connect 如何處理 Connector 錯誤

2.1 Connectors

在 kafka connect 中,connector 決定了數據應該從哪裏複製過來以及數據應該寫入到哪裏去,一個 connector 實例是一個需要負責在 kafka 和其他系統之間複製數據的邏輯作業,connector plugin 是 jar 文件,實現了 kafka 定義的一些接口來完成特定的任務。

2.2 Tasks

task 是 kafka connect 數據模型的主角,每一個 connector 都會協調一系列的 task 去執行任務,connector 可以把一項工作分割成許多的 task,然後再把 task 分發到各個 worker 中去執行(分佈式模式下),task 不自己保存自己的狀態信息,而是交給特定的 kafka topic 去保存(config.storage.topic 和 status.storage.topic)。

在分佈式模式下有一個概念叫做任務再平衡(Task Rebalancing),當一個 connector 第一次提交到集羣時,所有的 worker 都會做一個 task rebalancing 從而保證每一個 worker 都運行了差不多數量的工作,而不是所有的工作壓力都集中在某個 worker 進程中,而當某個進程掛了之後也會執行 task rebalance。

當 Connector 首次提交到集羣時,Worker 將重新平衡集羣中的全部 Connectors 及其 Tasks,以便每個 Worker 具有大致相同的工作量。當 Connector 增加或減少它們需要的任務數量,或者 Connector 的配置發生更改時,也會使用相同的重新平衡過程。當一個 Worker 失敗時,task 將在活動的 worker 之間重新進行平衡。當 task 失敗時,不會觸發再平衡,因爲 task 失敗被視爲異常情況。因此,失敗的 task 不會由框架自動重新啓動,而應該通過 REST API 重新啓動。

2.3 Workers

connectors 和 tasks 都是邏輯工作單位,必須安排在進程中執行,而在 kafka connect 中,這些進程就是 workers,分別有兩種 worker:standalone 和 distributed。這裏不對 standalone 進行介紹,具體的可以查看官方文檔。我個人覺得 distributed worker 很棒,因爲它提供了可擴展性以及自動容錯的功能,你可以使用一個 group.ip 來啓動很多 worker 進程,在有效的 worker 進程中它們會自動的去協調執行 connector 和 task,如果你新加了一個 worker 或者掛了一個 worker,其他的 worker 會檢測到然後在重新分配 connector 和 task。

2.4 Converters

converter 會把 bytes 數據轉換成 kafka connect 內部的格式,也可以把 kafka connect 內部存儲格式的數據轉變成 bytes,converter 對 connector 來說是解耦的,所以其他的 connector 都可以重用,例如,使用了 avro converter,那麼 jdbc connector 可以寫 avro 格式的數據到 kafka,當然,hdfs connector 也可以從 kafka 中讀出 avro 格式的數據。

Confluent Platform 提供了以下 Converters:

AvroConverter: io.confluent.connect.avro.AvroConverter: use with Schema Registry
ProtobufConverter: io.confluent.connect.protobuf.ProtobufConverter: use with Schema Registry
JsonSchemaConverter: io.confluent.connect.json.JsonSchemaConverter: use with Schema Registry
JsonConverter: org.apache.kafka.connect.json.JsonConverter (without Schema Registry): use with structured data
StringConverter: org.apache.kafka.connect.storage.StringConverter: simple string format
ByteArrayConverter: org.apache.kafka.connect.converters.ByteArrayConverter: provides a “pass-through” option that does no conversion

2.5 Transforms

Connector 可以配置 Transforms 來對單個消息進行簡單而輕量級的修改。這對於較小的數據調整和事件路由來說非常方便,並且多個 Transforms 可以在 Connectors 配置中鏈接在一起。但是,應用於多個消息的更復雜的轉換和操作最好使用 ksqlDB 和 Kafka 流實現。

Transforms 是一個簡單的函數,它接受一條記錄作爲輸入並輸出修改後的記錄。Kafka Connect 提供的所有轉換都執行簡單但通常有用的修改。注意,您可以使用自己的自定義邏輯實現轉換接口,將它們打包爲 Kafka Connect 插件,並與任何 Connectors 一起使用它們。

Kafka Connect Transformations:

Transform Description
Cast Cast fields or the entire key or value to a specific type (for example, to force an integer field to a smaller width).
Drop Drop either a key or a value from a record and set it to null.
ExtractField Extract the specified field from a Struct when schema present, or a Map in the case of schemaless data. Any null values are passed through unmodified.
ExtractTopic Replace the record topic with a new topic derived from its key or value.
Filter Include or drop records that match the filter.condition predicate.
Flatten Flatten a nested data structure. This generates names for each field by concatenating the field names at each level with a configurable delimiter character.
HoistField Wrap data using the specified field name in a Struct when schema present, or a Map in the case of schemaless data.
InsertField Insert field using attributes from the record metadata or a configured static value.
MaskField Mask specified fields with a valid null value for the field type.
MessageTimeStampRouter Update the record’s topic field as a function of the original topic value and the record’s timestamp field.
RegexRouter Update the record topic using the configured regular expression and replacement string.
ReplaceField Filter or rename fields.
SetSchemaMetadata Set the schema name, version, or both on the record’s key or value schema.
TimestampConverter Convert timestamps between different formats such as Unix epoch, strings, and Connect Date and Timestamp types.
TimestampRouter Update the record’s topic field as a function of the original topic value and the record timestamp.
TombstoneHandler Manage tombstone records. A tombstone record is defined as a record with the entire value field being null, whether or not it has ValueSchema.
ValueToKey Replace the record key with a new key formed from a subset of fields in the record value.

2.6 Dead Letter Queue

由於多種原因,可能會出現無效記錄。舉個栗子:一條記錄到達以 JSON 格式序列化的 Sink Connector,但 Sink Connector 配置期望的是 Avro 格式。當 Sink Connector 無法處理無效記錄時,將根據 Connector 配置屬性 errors.tolerance 處理該錯誤。

當 errors.tolerance:none 無效的記錄會導致 Connector task 立即失敗,Connector 進入失敗狀態。要解決這個問題,您需要檢查 Kafka Connect Worker 日誌,找出導致故障的原因,糾正它,並重新啓動 Connector。

當 errors.tolerance:all,忽略所有錯誤或無效記錄,繼續處理。Connect Worker 日誌中沒有寫入錯誤。要確定記錄是否失敗,您必須使用 internal metrics 或計算錯誤記錄數量,並將其與已處理的記錄數量進行比較。

可用的錯誤處理特性是將所有無效記錄路由到一個特殊 Kafka Topic。此 Topic 包含 Sink Connector 無法處理的死信記錄隊列。

即使死信主題包含失敗的記錄,它也不會顯示原因。你可以添加以下附加配置屬性來包括失敗的記錄頭信息:

errors.deadletterqueue.context.headers.enable = true

當此參數設置爲 true(默認爲false)時,記錄頭被添加到死信隊列中。然後可以使用 kafkacat Utility 查看記錄頭,並確定記錄失敗的原因。

爲了避免與原始記錄頭衝突,死信隊列上下文頭鍵開始 _connect.errors。

3. Kafka Connect Elasticsearch 實踐

當你需要 Connector 的時候,你可以選擇去 Kafka 和 Confluent 社區選擇優秀的開源 Connector,你也可以選擇自己開發 Connector 爲社區做貢獻。

我的需求是使用 Kafka Connect 做 Data Pipeline,把 Kafka 集羣中的消息高並行低延遲的同步到 Elasticsearch 集羣中,Confluent Hub 社區官方提供了很優秀的 Connector: kafka-connect-elasticsearch,我就不重複造輪子了,拿來即用。

接下來梳理下 kafka-connect-elasticsearch 過程中的一些使用經驗,如果是自己玩玩你可以使用 Confluent 全家桶,大家都知道 Confluent 是當初 Linkin 的幾位 kafka 核心開發者創業成立的公司,致力於 kafka 的商業化,該團隊基於 kafka 給社區貢獻了幾個優質的開源項目 Schema Registry、Kafka Rest、KSQL,還有很多 kafka connectors 組件。Confluent 包含了從 kafka 集羣搭建到 connector 組件部署,再到 connect 監控的一站式集成,使用非常方便,但是核心的 Confluent Control Center 及周邊支持是企業版纔有的特性,免費版只能試用一段時間,而且功能特性還有限制,社區版功能更是甚少,所以準備自己搭建監控平臺。

你可以實現自己所需要的 Connector,先從 Confluent Hub 下載 kafka-connect-elasticsearch 組件,爲了方便管理,建議跟 kafka connect 在相同目錄下,我使用的 kafka_2.12-2.3.1 版本,目錄結構如下:

3.1 Standalone 模式部署 Kafka Connect

standalone 模式部署時,connect-standalone.properties 配置文件中配置了 kafka broker 地址、消息 key 和 value converter 格式、offset 存儲位置、connectors 加載目錄等基本信息,更詳細參數參考官網。

# These are defaults. This file just demonstrates how to override some settings.
bootstrap.servers=localhost:9092

# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will
# need to configure these based on the format they want their data in when loaded from or stored into Kafka
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false

offset.storage.file.filename=/denv/kafka_2.12-2.3.1/connectors/kafka-connect-elasticsearch/connect.offsets
offset.flush.interval.ms=5000

# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins
# (connectors, converters, transformations). The list should consist of top level directories that include 
# any combination of: 
# a) directories immediately containing jars with plugins and their dependencies
# b) uber-jars with plugins and their dependencies
# c) directories immediately containing the package directory structure of classes of plugins and their dependencies
# Note: symlinks will be followed to discover dependencies or plugins.
# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors
plugin.path=/denv/kafka_2.12-2.3.1/connectors

3.2 Kafka Connect Elasticsearch 配置

Kafka Connect Elasticsearch 作爲 Sink Connector時的配置文件 elasticsearch-sink.properties 中包含 ElasticsearchSinkConnector 相關配置,如 consumer name、topics name、Elasticseatch Rest API、Index Type 等,更詳細參數參考官網。

name=elasticsearch-sink
connector.class=io.confluent.connect.elasticsearch.ElasticsearchSinkConnector
tasks.max=1
topics=test-elasticsearch-sink
key.ignore=false
schema.ignore=true
connection.url=http://127.0.0.1:9200
type.name=_doc
behavior.on.malformed.documents=warn
behavior.on.null.values=ignore

3.3 啓動 Kafka Connect

以 standalone 模式啓動 kafka connect:

bin/connect-standalone.sh config/connect-standalone.properties connectors/kafka-connect-elasticsearch/etc/elasticsearch-sink.properties

3.4 通過 REST 接口監控

Kafka Connect 提供了 Rest interface 用來監控 Connect 和 Connector:

Since Kafka Connect is intended to be run as a service, it also supports a REST API for managing connectors. By default this service runs on port 8083. When executed in distributed mode, the REST API will be the primary interface to the cluster. You can make requests to any cluster member, the REST API automatically forwards requests if required.

舉幾個栗子:

  • 獲取 Worker 集羣 ID、版本、Commit ID

    curl localhost:8083/ | jq
    
    # response
    {
      "version": "5.5.0-ce",
      "commit": "2bedb2c6980ba7a8",
      "kafka_cluster_id": "wxOOb2vrTPCLJl28PI18KA"
    }
    
  • 列出 Worker 上當前可用的 Connector 組件

    curl localhost:8083/connector-plugins | jq
    # response
    [
      {
        "class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
        "type": "sink",
        "version": "5.5.1"
      },
      {
        "class": "org.apache.kafka.connect.file.FileStreamSinkConnector",
        "type": "sink",
        "version": "2.3.1"
      },
      {
        "class": "org.apache.kafka.connect.file.FileStreamSourceConnector",
        "type": "source",
        "version": "2.3.1"
      }
    ]
    
  • 列出 Worker 上當前活動的 Connector 組件

    curl localhost:8083/connectors | jq
    # response
    [
      "elasticsearch-sink"
    ]
    
  • 創建一個 Connector,成功時返回 Connector 基本信息;如果返回碼是 409,說明 Worker 正在再均衡。

    curl -X POST localhost:8083/connectors -H 'Content-Type: application/json' -d'{
      "name": "elasticsearch-sink",
      "config": {
            "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
            "type.name": "_doc",
            "behavior.on.malformed.documents": "warn",
            "behavior.on.null.values": "ignore",
            "topics": "elasticsearch-sink",
            "tasks.max": "1",
            "name": "elasticsearch-sink",
            "connection.url": "http://127.0.0.1:9200",
            "key.ignore": "false",
            "schema.ignore": "true"
        }
    }'
    
  • 重啓一個 Connector

    curl -X POST localhost:8083/connectors/elasticsearch-sink/restart
    
  • 暫停一個 Connector

    curl -X PUT localhost:8083/connectors/elasticsearch-sink/pause
    
  • 重新啓用一個 Connector

    curl -X PUT localhost:8083/connectors/elasticsearch-sink/resume
    
  • 刪除一個 Connector

    curl -X DELETE localhost:8083/connectors/elasticsearch-sink
    
  • 更新 Connector 配置

    curl -X PUT localhost:8083/connectors/elasticsearch-sink/config -H 'Content-Type: application/json' -d'{
      "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
      "type.name": "_doc",
      "behavior.on.malformed.documents": "warn",
      "behavior.on.null.values": "ignore",
      "topics": "elasticsearch-sink",
      "tasks.max": "2",
      "name": "elasticsearch-sink",
      "connection.url": "http://127.0.0.1:9200",
      "key.ignore": "false",
      "schema.ignore": "true"
    }'
    
  • 獲取 Connector Task 列表

    curl localhost:8083/connectors/elasticsearch-sink/tasks | jq
    # response
    [
      {
        "id": {
          "connector": "elasticsearch-sink",
          "task": 0
        },
        "config": {
          "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
          "type.name": "_doc",
          "behavior.on.malformed.documents": "warn",
          "behavior.on.null.values": "ignore",
          "task.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkTask",
          "topics": "elasticsearch-sink",
          "tasks.max": "1",
          "name": "elasticsearch-sink",
          "connection.url": "http://127.0.0.1:9200",
          "key.ignore": "false",
          "schema.ignore": "true"
        }
      }
    ]
    
  • 獲取 Connector Tasks 包含當前狀態的列表

    curl localhost:8083/connectors/elasticsearch-sink/status | jq
    # response
    {
      "name": "elasticsearch-sink",
      "connector": {
        "state": "RUNNING",
        "worker_id": "127.0.0.1:8083"
      },
      "tasks": [
        {
          "id": 0,
          "state": "RUNNING",
          "worker_id": "127.0.0.1:8083"
        },
        {
          "id": 1,
          "state": "RUNNING",
          "worker_id": "127.0.0.1:8083"
        }
      ],
      "type": "sink"
    }
    
  • 重啓 Connector 的某個 Task

    curl -X POST localhost:8083/connectors/elasticsearch-sink/tasks/0/restart
    

4. 使用 JMX 監控 Kafka Connect

使用 kafka 做消息隊列中間件時,爲了實時監控其性能時,免不了要使用 jmx 調取 kafka broker 的內部數據,不管是自己重新做一個 kafka 集羣的監控系統,還是使用一些開源的產品,比如 yahoo 的kafka manager, 其都需要使用 jmx 來監控一些敏感的數據。在 kafka 官網中這樣說:

Kafka uses Yammer Metrics for metrics reporting in both the server and the client. This can be configured to report stats using pluggable stats reporters to hook up to your monitoring system.
The easiest way to see the available metrics to fire up jconsole and point it at a running kafka client or server; this will all browsing all metrics with JMX.

可見 kafka 官方也是提倡使用 jmx,並且提供了 jmx 的調用給用戶以監控 kafka。

在使用 jmx 之前需要確保 kafka 開啓了 jmx 監控,kafka 啓動時要添加 JMX_PORT=9999 參數:

JMX_PORT=9999 bin/connect-standalone.sh config/connect-standalone.properties connectors/kafka-connect-elasticsearch/etc/elasticsearch-sink.properties

使用 JConsole 查看 JMX Metrics。首先啓動 JConsole 並連接 Kafka Connect JMX:

然後可以查看 Kafka Connect JMX Metrics:

5. 使用 Prometheus JMX Exporter 收集 Kafka Connect JMX Metrics

Prometheus 是一個監控工具,可以提取指標,使其成爲圖形,然後將其公開給 Alert Manager,後者可以使用多種方法發送警報。它從 HTTP 端點提取指標,該指標已添加到Prometheus 配置文件中。因此,我們需要一種以 Prometheus 理解的格式通過 HTTP 公開 Kafka Connect Metrics 的方法。

5.1 Prometheus JMX Exporter

Prometheus 提供了 JMX Exporter,它是 “可以配置地抓取和公開 JMX Metrics 的 mBean 的收集器”。它以 Prometheus 可以理解的格式通過 HTTP 服務器公開了我們在上述工具中看到的 JMX Metrics。

JMX Exporter 可以兩種模式之一運行,作爲注入您要監視的應用程序的 Java Agent,或作爲連接到我們公開的 JMX 端口的獨立進程。作爲注入的 Java Agent 運行它會暴露更多的CPU和內存指標,更易於爲某些應用程序配置,並且在有大量指標時性能損耗得多。在這種情況下,我們選擇將 JMX Exporter 作爲單獨的進程運行,因爲我們可以更輕鬆地重用現有的 Chef 代碼並且因爲它更易於開發,這就是我們在生產中監視 Kafka Connect 和 Kafka Mirror Maker 的方式。但是,在具有數百個 Topics 的 Kafka Broker 上,這種運行 JMX Exporter 的方法效果不佳,在這種情況下,我們選擇注入 Java Agent。

解析 JMX 度量標準名稱和值有些不可思議,這通常是整個設置過程中最難的部分。重要的是鍵的順序很重要,並且 JMX Dump 不會保留順序,JMX Dump 的輸出可輕鬆瀏覽可用的指標。一個良好的起點是使用 JMX Dump 來發現可能的最高級別指標。

所有的 Kafka 服務,包括 Kafka Connect,都以 kafka 開頭公開 JMX Metrics,因此這是作爲 JMX Exporter 模式的一個很好的起點。以下配置是獲取 JMX Exporter 公開Kafka Connect JMX Metrics 所需的最低配置:

hostPort: 127.0.0.1:9999   # jmx_port
lowercaseOutputName: true
# whitelistObjectNames:
#     - kafka.connect:type=connector-metrics,connector="{connector}"
#     - kafka.connect:type=connector-task-metrics,connector="{connector}",task="{task}"
#     - kafka.connect:type=source-task-metrics,connector=([-.w]+),task=([d]+)
#     - kafka.connect:type=sink-task-metrics,connector=([-.w]+),task=([d]+)
#     - kafka.connect:type=connect-metrics,client-id=
#     - kafka.consumer:type=consumer-fetch-manager-metrics,client-id=([-.w]+)
#     - kafka.consumer:type=consumer-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
ssl: false
rules:
  - pattern: kafka*

接下來我們改造下 connect-standalone 啓動腳本,以 Java Agent 的方式注入 Prometheus JMX Exporter:

# jmx port
export JMX_PORT="9999"
# jmx prometheus exporter
export KAFKA_OPTS="-javaagent:/denv/kafka_2.12-2.3.1/exporter/jmx_prometheus_javaagent-0.13.0.jar=19999:/denv/kafka_2.12-2.3.1/exporter/jmx-connector-metrics.yaml"

if [ $# -lt 1 ];
then
        echo "USAGE: $0 [-daemon] connect-standalone.properties"
        exit 1
fi
base_dir=$(dirname $0)

if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then
    export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/connect-log4j.properties"
fi
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
  export KAFKA_HEAP_OPTS="-Xms256M -Xmx2G"
fi

EXTRA_ARGS=${EXTRA_ARGS-'-name connectStandalone'}
COMMAND=$1
case $COMMAND in
  -daemon)
    EXTRA_ARGS="-daemon "$EXTRA_ARGS
    shift
    ;;
  *)
    ;;
esac
exec $(dirname $0)/kafka-run-class.sh $EXTRA_ARGS org.apache.kafka.connect.cli.ConnectStandalone "$@"

再次啓動 connect-standalone:

bin/connect-standalone.sh config/connect-standalone.properties connectors/kafka-connect-elasticsearch/etc/elasticsearch-sink.properties

此時,已經可以通過 Rest API http://127.0.0.1:19999/metrics 查看 JMX Metrics 了,截取了部分 Metrics 的時序數據如下:

# HELP kafka_connect_sink_task_metrics_put_batch_max_time_ms The maximum time taken by this task to put a batch of sinks records. (kafka.connect<type=sink-task-metrics, connector=elasticsearch-sink, task=0><>put-batch-max-time-ms)
# TYPE kafka_connect_sink_task_metrics_put_batch_max_time_ms untyped
kafka_connect_sink_task_metrics_put_batch_max_time_ms{connector="elasticsearch-sink",task="0",} 1.0
# HELP kafka_connect_connector_task_metrics_offset_commit_success_percentage The average percentage of this task's offset commit attempts that succeeded. (kafka.connect<type=connector-task-metrics, connector=elasticsearch-sink, task=0><>offset-commit-success-percentage)
# TYPE kafka_connect_connector_task_metrics_offset_commit_success_percentage untyped
kafka_connect_connector_task_metrics_offset_commit_success_percentage{connector="elasticsearch-sink",task="0",} 1.0

5.2 使用 Prometheus 展示 Kafka Connect JMX Metrics

修改 prometheus.yml:

# my global config
global:
  scrape_interval:     5s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 5s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    # - targets: ['localhost:9990']
    - targets: ['127.0.0.1:19999']

啓動 Prometheus:

./prometheus --config.file=prometheus.yml

訪問 Prometheus UI: http://127.0.0.1:9090/,輸入 kafka_connect_* 開頭的指標,即可把 Prometheus Exporter 寫入 TSDB 時序數據庫中的 Metrics 圖形化展示出來,隨便選擇了 2 個 Metrics 如下圖所示:

如果你需要更豐富的圖像化展示,可以把 Prometheus 作爲數據源接入 Grafana,接入 Grafana 配置的幾個 Kafka Connect Metrics 圖形化展示如下圖所示:

分享就到這裏吧,如果還有不明白的地方,官方文檔是最好的學習資料。

6. 參考資料

本文轉載自公衆號貝殼產品技術(ID:beikeTC)。

原文鏈接

https://mp.weixin.qq.com/s/hK7bRxnAI3DzK2ts2IUcaw

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章