日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Envoy service mesh、Prometheus和Grafana下的微服务监控(翻译)

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Envoy service mesh、Prometheus和Grafana下的微服务监控(翻译) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:medium.com/@dnivra26/m…

如果你剛接觸“Service Mesh“和“Envoy”,我這里有一篇文章可以幫你入門。

這是Envoy service mesh下的可觀測性系列的第二篇文章,你可以在這里閱讀第一篇關于分布式追蹤的文章。

在微服務中談及監控時,你可不能被蒙在鼓里,至少要知道問題出在哪兒了。

讓我們看看Envoy是怎樣幫助我們了解我們的服務運行狀況的。在service mesh下,所有的通信都會通過mesh,這意味著沒有任何服務會與其它服務直接通信,服務向Envoy發起調用請求,然后Envoy將調用請求路由到目標服務,所以Envoy將持有傳入和傳出流量的上下文。Envoy通常提供關于傳入請求、傳出請求和Envoy實例狀態的指標。

準備

這是我們將要構建的系統概覽。

Statsd

Envoy支持通過兩到三種格式來暴露指標,但本文中我們將使用statsd格式。

所以流程將是這樣,首先Envoy推送指標到statsd,然后我們用prometheus(一個時序數據庫)從statsd拉取指標,最后通過grafana可視化這些指標。

在準備概覽圖中,我提到了statsd exporter而不是statsd,這是因為我們并不會直接使用statsd,而是使用一個接收statsd格式數據,并將其以prometheus格式輸出的轉換器(服務)。下面讓我們來搞定它吧。

Envoy的指標主要分為兩類:

  • Counter(計數器):一個只增不減的指標。如:請求總數
  • Gauge(量表):一個可增可減的指標,類似于一個瞬時值。如:當前CPU使用量
  • 讓我們看一個包含stats sink的Envoy配置

    --- admin: access_log_path: "/tmp/admin_access.log" address: socket_address: address: "127.0.0.1" port_value: 9901 stats_sinks: - name: "envoy.statsd" config: tcp_cluster_name: "statsd-exporter" prefix: front-envoy static_resources: listeners: - name: "http_listener" address: socket_address: address: "0.0.0.0" port_value: 80 filter_chains: filters: - name: "envoy.http_connection_manager" config: use_remote_address: true add_user_agent: true access_log: - name: envoy.file_access_log config: path: /dev/stdout format: "[ACCESS_LOG][%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" \"%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%\"\n" stat_prefix: "ingress_443" codec_type: "AUTO" generate_request_id: true route_config: name: "local_route" virtual_hosts: - name: "http-route" domains: - "*" routes: - match: prefix: "/" route: cluster: "service_a" http_filters: - name: "envoy.router" clusters: - name: "statsd" connect_timeout: "0.25s" type: "strict_dns" lb_policy: "ROUND_ROBIN" hosts: - socket_address: address: "statsd_exporter" port_value: 9125 - name: "service_a" connect_timeout: "0.25s" type: "strict_dns" lb_policy: "ROUND_ROBIN" hosts: - socket_address: address: "service_a_envoy" port_value: 8786 復制代碼

    第8-13行告訴Envoy我們需要statsd格式的指標、我們的統計信息前綴(通常是你的服務名)是什么和statsd sink的地址。

    第55-63行配置了我們的環境中的statsd sink。

    這就是讓Envoy輸出統計信息所需要的所有配置。現在讓我們來看看第2-7行做了哪些事情:

  • Envoy在9901端口暴露了一個管理端,你可以通過它動態地改變日志級別,查看當前配置、統計數據等
  • Envoy也可以生成與nginx類似的訪問日志,你可以通過它了解服務間的通信狀況。訪問日志的格式也是可配置的,如第29-33行
  • 你需要將相同的配置添加到系統中的其它Envoy sidecar上(是的,每個服務都有自己的Envoy sidecar)。

    這些服務本身是用go寫的,它們做的事情很簡單,僅僅是通過Envoy調用其它服務。你可以在這里查看服務和Envoy的配置。

    現在,雖然我們只有圖中的statsd exporter,但有了它,如果我們運行docker容器(docker-compose build & docker-compose up),然后向Front Envoy(localhost:8080)發送一些流量,Envoy 將把這些流量的指標發送到statsd exporter,隨后statsd exporter會把這些指標轉換成prometheus格式,并將其暴露在9102端口。

    Statsd exporter中的統計信息格式如下圖所示

    這里邊將有上百個指標,同時,在上面的截圖中我們能看到Service A和Service B之間的通信延遲指標。上圖的指標是遵循prometheus格式的

    metric_name ["{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"] value [ timestamp ] 復制代碼

    你可以在這里了解更多。

    Prometheus

    我們將使用Prometheus作為時序數據庫來保存我們的指標。Prometheus不僅是一個時序數據庫,它本身還是一個監控系統,但本文我們只用它來存儲指標數據。需要注意的是,prometheus是一個通過主動拉取來獲取指標的系統,這意味著你必須告訴prometheus從何處拉取指標,在我們的例子中是從statsd exporter處拉取。

    將Prometheus添加到系統中非常簡單而又直接,我們只需要將拉取目標(statsd exporter)作為配置文件傳遞給Prometheus就可以了。配置看起來是這樣的

    global: scrape_interval: 15s scrape_configs: - job_name: 'statsd' scrape_interval: 5s static_configs: - targets: ['statsd_exporter:9102'] labels: group: 'services' 復制代碼

    scrape_interval的值表示Prometheus從目標處拉取配置的頻率。

    現在啟動Prometheus,里面應該有一些數據了。讓我們打開localhost:9090來看一看

    如圖所示,可以看到我們的指標。你能做的可不僅僅是選擇已有的指標,從這里可以閱讀關于prometheus查詢語言的更多信息。它還可以基于查詢結果繪制圖表,除此之外還有一個報警系統。

    如果我們打開prometheus的targets頁面,將能看到所有的拉取目標和它們的健康狀態

    Grafana

    Grafana是一個很棒的監控可視化解決方案,它支持Prometheus,Graphite,InfluxDB,ElasticSearch等多種后端。

    Grafana有兩大主要組件需要我們配置

  • 數據源(Datasource):指定grafana從哪個后端獲取指標。你可以通過配置文件來配置數據源,代碼如下所示

    apiVersion: 1datasources: - name: prometheus type: prometheus access: Server url: http://prometheus:9090 editable: true isDefault: 復制代碼
  • 儀表盤(Dashboard):你可以從儀表盤查看來自數據源的指標。Grafana支持多種可視化元素,如Graphs,Single Stats,Heatmaps……你可以繼承這些元素并使用插件來構造自己的元素。

  • 我在使用Grafana時遇到的唯一一個問題是,缺少一種標準的方法來用代碼開發那些儀表盤。所幸有一些第三方的庫提供了支持,我們將使用來自weaveworks的grafanalib。

    下面是我們通過 python 代碼嘗試構建的一個儀表盤

    from grafanalib.core import * import os dashboard = Dashboard(title="Services Dashboard",templating=Templating([Template(name="source",dataSource="prometheus",query="metrics(.*_cluster_.*_upstream_rq_2xx)",regex="/(.*)_cluster_.*_upstream_rq_2xx/",default="service_a"),Template(name="destination",dataSource="prometheus",query="metrics(.*_cluster_.*_upstream_rq_2xx)",regex="/.*_cluster_(.*)_upstream_rq_2xx/",default="service_b")]),rows=[Row(panels=[Graph(title="2XX",transparent=True,dataSource="prometheus",targets=[Target(expr="[[source]]_cluster_[[destination]]_upstream_rq_2xx - [[source]]_cluster_[[destination]]_upstream_rq_2xx offset $__interval",legendFormat="2xx")]),Graph(title="5XX",transparent=True,dataSource="prometheus",targets=[Target(expr="[[source]]_cluster_[[destination]]_upstream_rq_5xx - [[source]]_cluster_[[destination]]_upstream_rq_5xx offset $__interval",legendFormat="5xx"),]),Graph(title="Latency",transparent=True,dataSource="prometheus",targets=[Target(expr="[[source]]_cluster_[[destination]]_upstream_rq_time",legendFormat="{{quantile}}")])]),] ).auto_panel_ids() 復制代碼

    在這段代碼中,我們為2xx,5xx和延遲數據構建了圖表。其中第5-22行很重要,它從我們的設置中提取可用的service names作為grafana的變量,為我們創建一個動態的儀表盤,這意味著我們能夠選擇性地查看特定源服務和目標服務的統計數據。如果想了解更多關于變量的內容請參考這里。

    你需要通過grafanalib命令來從上述python文件生成儀表盤

    generate-dashboard -o dashboard.json service-dashboard.py 復制代碼

    注意這里生成的dashboard.json可不容易閱讀。

    所以,啟動Grafana時我們只需要傳遞儀表盤和數據源就好了。當訪問http:localhost:3000時,你將看到:

    現在你應該能看到2xx,5xx和延遲的圖表,同時還能看到一個下拉菜單,你可以通過它選擇源服務和目標服務。關于Grafana還有許多內容我們沒有討論到,包括強大的查詢編輯器和告警系統。更重要的是,這一切都是可以通過插件和應用擴展的,可以參考這里的例子。如果你正想可視化常見服務如redis,rabbitmq等的指標,grafana有一個公共儀表盤庫,你只需要導入它們就可以使用了。使用Grafana 還有一個好處,你可以通過配置文件和代碼創建和管理所有東西,而不需要過多地通過UI來操作。

    我建議你試用一下prometheus和grafana以了解更多信息。感謝閱讀,如有建議和意見,請寫在評論中。

    在這里可以找到所有代碼和配置文件。

    轉載于:https://juejin.im/post/5c50533b5188252410609e63

    總結

    以上是生活随笔為你收集整理的Envoy service mesh、Prometheus和Grafana下的微服务监控(翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。