在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于Prometheus監(jiān)控系統相關的知識體系

jf_TEuU2tls ? 來源:浩道linux ? 作者:浩道linux ? 2022-10-20 09:06 ? 次閱讀

前言

大家好,這里是浩道linux,主要給大家分享linux、python網絡通信相關的IT知識平臺。

今天浩道跟大家分享關于Prometheus監(jiān)控系統相關的知識體系,讓你通過本文可以大體掌握其相關知識體系!

文章來源:aneasystone.com/archives/2018/11/prometheus-in-action.html

Prometheus 是一款基于時序數據庫的開源監(jiān)控告警系統,說起 Prometheus 則不得不提 SoundCloud,這是一個在線音樂分享的平臺,類似于做視頻分享的 YouTube,由于他們在微服務架構的道路上越走越遠,出現了成百上千的服務,使用傳統的監(jiān)控系統 StatsD 和 Graphite 存在大量的局限性。

于是他們在 2012 年開始著手開發(fā)一套全新的監(jiān)控系統。Prometheus 的原作者是 Matt T. Proud,他也是在 2012 年加入 SoundCloud 的,實際上,在加入 SoundCloud 之前,Matt 一直就職于 Google,他從 Google 的集群管理器 Borg 和它的監(jiān)控系統 Borgmon 中獲取靈感,開發(fā)了開源的監(jiān)控系統 Prometheus,和 Google 的很多項目一樣,使用的編程語言是 Go。

很顯然,Prometheus 作為一個微服務架構監(jiān)控系統的解決方案,它和容器也脫不開關系。早在 2006 年 8 月 9 日,Eric Schmidt 在搜索引擎大會上首次提出了云計算(Cloud Computing)的概念,在之后的十幾年里,云計算的發(fā)展勢如破竹。

在 2013 年,Pivotal 的 Matt Stine 又提出了云原生(Cloud Native)的概念,云原生由微服務架構、DevOps 和以容器為代表的敏捷基礎架構組成,幫助企業(yè)快速、持續(xù)、可靠、規(guī)模化地交付軟件。

為了統一云計算接口和相關標準,2015 年 7 月,隸屬于 Linux 基金會的 云原生計算基金會(CNCF,Cloud Native Computing Foundation) 應運而生。第一個加入 CNCF 的項目是 Google 的 Kubernetes,而 Prometheus 是第二個加入的(2016 年)。

目前 Prometheus 已經廣泛用于 Kubernetes 集群的監(jiān)控系統中,對 Prometheus 的歷史感興趣的同學可以看看 SoundCloud 的工程師 Tobias Schmidt 在 2016 年的 PromCon 大會上的演講:The History of Prometheus at SoundCloud 。

一、Prometheus 概述

我們在 SoundCloud 的官方博客中可以找到一篇關于他們?yōu)槭裁葱枰麻_發(fā)一個監(jiān)控系統的文章 Prometheus: Monitoring at SoundCloud,在這篇文章中,他們介紹到,他們需要的監(jiān)控系統必須滿足下面四個特性:

A multi-dimensional data model, so that data can be sliced and diced at will, along dimensions like instance, service, endpoint, and method.

Operational simplicity, so that you can spin up a monitoring server where and when you want, even on your local workstation, without setting up a distributed storage backend or reconfiguring the world.

Scalable data collection and decentralized architecture, so that you can reliably monitor the many instances of your services, and independent teams can set up independent monitoring servers.

Finally, a powerful query language that leverages the data model for meaningful alerting (including easy silencing) and graphing (for dashboards and for ad-hoc exploration).

簡單來說,就是下面四個特性:

多維度數據模型

方便的部署和維護

靈活的數據采集

強大的查詢語言

實際上,多維度數據模型和強大的查詢語言這兩個特性,正是時序數據庫所要求的,所以 Prometheus 不僅僅是一個監(jiān)控系統,同時也是一個時序數據庫。那為什么 Prometheus 不直接使用現有的時序數據庫作為后端存儲呢?這是因為 SoundCloud 不僅希望他們的監(jiān)控系統有著時序數據庫的特點,而且還需要部署和維護非常方便。

縱觀比較流行的時序數據庫(參見下面的附錄),他們要么組件太多,要么外部依賴繁重,比如:Druid 有 Historical、MiddleManager、Broker、Coordinator、Overlord、Router 一堆的組件,而且還依賴于 ZooKeeper、Deep storage(HDFS 或 S3 等),Metadata store(PostgreSQL 或 MySQL),部署和維護起來成本非常高。而 Prometheus 采用去中心化架構,可以獨立部署,不依賴于外部的分布式存儲,你可以在幾分鐘的時間里就可以搭建出一套監(jiān)控系統。

此外,Prometheus 數據采集方式也非常靈活。要采集目標的監(jiān)控數據,首先需要在目標處安裝數據采集組件,這被稱之為 Exporter,它會在目標處收集監(jiān)控數據,并暴露出一個 HTTP 接口供 Prometheus 查詢,Prometheus 通過 Pull 的方式來采集數據,這和傳統的 Push 模式不同。

不過 Prometheus 也提供了一種方式來支持 Push 模式,你可以將你的數據推送到 Push Gateway,Prometheus 通過 Pull 的方式從 Push Gateway 獲取數據。目前的 Exporter 已經可以采集絕大多數的第三方數據,比如 Docker、HAProxy、StatsD、JMX 等等,官網有一份 Exporter 的列表。

除了這四大特性,隨著 Prometheus 的不斷發(fā)展,開始支持越來越多的高級特性,比如:服務發(fā)現,更豐富的圖表展示,使用外部存儲,強大的告警規(guī)則和多樣的通知方式。下圖是 Prometheus 的整體架構圖:

50ee25d0-5009-11ed-a3b6-dac502259ad0.png

從上圖可以看出,Prometheus 生態(tài)系統包含了幾個關鍵的組件:Prometheus server、Pushgateway、Alertmanager、Web UI 等,但是大多數組件都不是必需的,其中最核心的組件當然是 Prometheus server,它負責收集和存儲指標數據,支持表達式查詢,和告警的生成。接下來我們就來安裝 Prometheus server。

二、安裝 Prometheus server

Prometheus 可以支持多種安裝方式,包括 Docker、Ansible、Chef、Puppet、Saltstack 等。下面介紹最簡單的兩種方式,一種是直接使用編譯好的可執(zhí)行文件,開箱即用,另一種是使用 Docker 鏡像。

2.1 開箱即用

首先從 官網的下載頁面 獲取 Prometheus 的最新版本和下載地址,目前最新版本是 2.4.3(2018年10月),執(zhí)行下面的命令下載并解壓:

$wgethttps://github.com/prometheus/prometheus/releases/download/v2.4.3/prometheus-2.4.3.linux-amd64.tar.gz
$tarxvfzprometheus-2.4.3.linux-amd64.tar.gz

然后切換到解壓目錄,檢查 Prometheus 版本:

$cdprometheus-2.4.3.linux-amd64
$./prometheus--version
prometheus,version2.4.3(branch:HEAD,revision:167a4b4e73a8eca8df648d2d2043e21bdb9a7449)
builduser:root@1e42b46043e9
builddate:20181004-08:42:02
goversion:go1.11.1

運行 Prometheus server:

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

2.2 使用 Docker 鏡像

使用 Docker 安裝 Prometheus 更簡單,運行下面的命令即可:

$sudodockerrun-d-p9090:9090prom/prometheus

一般情況下,我們還會指定配置文件的位置:

$sudodockerrun-d-p9090:9090
-v~/docker/prometheus/:/etc/prometheus/
prom/prometheus

我們把配置文件放在本地 ~/docker/prometheus/prometheus.yml,這樣可以方便編輯和查看,通過 -v 參數將本地的配置文件掛載到 /etc/prometheus/ 位置,這是 prometheus 在容器中默認加載的配置文件位置。如果我們不確定默認的配置文件在哪,可以先執(zhí)行上面的不帶 -v 參數的命令,然后通過 docker inspect 命名看看容器在運行時默認的參數有哪些(下面的 Args 參數):

$sudodockerinspect0c
[...]
"Id":"0c4c2d0eed938395bcecf1e8bb4b6b87091fc4e6385ce5b404b6bb7419010f46",
"Created":"2018-10-15T2234.56050369Z",
"Path":"/bin/prometheus",
"Args":[
"--config.file=/etc/prometheus/prometheus.yml",
"--storage.tsdb.path=/prometheus",
"--web.console.libraries=/usr/share/prometheus/console_libraries",
"--web.console.templates=/usr/share/prometheus/consoles"
],

[...]

2.3 配置 Prometheus

正如上面兩節(jié)看到的,Prometheus 有一個配置文件,通過參數 --config.file 來指定,配置文件格式為 YAML。我們可以打開默認的配置文件 prometheus.yml 看下里面的內容:

/etc/prometheus$catprometheus.yml
#myglobalconfig
global:
scrape_interval:15s#Setthescrapeintervaltoevery15seconds.Defaultisevery1minute.
evaluation_interval:15s#Evaluaterulesevery15seconds.Thedefaultisevery1minute.
#scrape_timeoutissettotheglobaldefault(10s).

#Alertmanagerconfiguration
alerting:
alertmanagers:
-static_configs:
-targets:
#-alertmanager:9093

#Loadrulesonceandperiodicallyevaluatethemaccordingtotheglobal'evaluation_interval'.
rule_files:
#-"first_rules.yml"
#-"second_rules.yml"

#Ascrapeconfigurationcontainingexactlyoneendpointtoscrape:
#Hereit'sPrometheusitself.
scrape_configs:
#Thejobnameisaddedasalabel`job=`toanytimeseriesscrapedfromthisconfig.
-job_name:'prometheus'

#metrics_pathdefaultsto'/metrics'
#schemedefaultsto'http'.

static_configs:
-targets:['localhost:9090']

Prometheus 默認的配置文件分為四大塊:

global 塊:Prometheus 的全局配置,比如 scrape_interval 表示 Prometheus 多久抓取一次數據,evaluation_interval 表示多久檢測一次告警規(guī)則;

alerting 塊:關于 Alertmanager 的配置,這個我們后面再看;

rule_files 塊:告警規(guī)則,這個我們后面再看;

scrape_config 塊:這里定義了 Prometheus 要抓取的目標,我們可以看到默認已經配置了一個名稱為 prometheus 的 job,這是因為 Prometheus 在啟動的時候也會通過 HTTP 接口暴露自身的指標數據,這就相當于 Prometheus 自己監(jiān)控自己,雖然這在真正使用 Prometheus 時沒啥用處,但是我們可以通過這個例子來學習如何使用 Prometheus;可以訪問 http://localhost:9090/metrics 查看 Prometheus 暴露了哪些指標;

三、學習 PromQL

通過上面的步驟安裝好 Prometheus 之后,我們現在可以開始體驗 Prometheus 了。Prometheus 提供了可視化的 Web UI 方便我們操作,直接訪問 http://localhost:9090/ 即可,它默認會跳轉到 Graph 頁面:

第一次訪問這個頁面可能會不知所措,我們可以先看看其他菜單下的內容,比如:Alerts 展示了定義的所有告警規(guī)則,Status 可以查看各種 Prometheus 的狀態(tài)信息,有 Runtime & Build Information、Command-Line Flags、Configuration、Rules、Targets、Service Discovery 等等。

實際上 Graph 頁面才是 Prometheus 最強大的功能,在這里我們可以使用 Prometheus 提供的一種特殊表達式來查詢監(jiān)控數據,這個表達式被稱為 PromQL(Prometheus Query Language)。通過 PromQL 不僅可以在 Graph 頁面查詢數據,而且還可以通過 Prometheus 提供的 HTTP API 來查詢。查詢的監(jiān)控數據有列表和曲線圖兩種展現形式(對應上圖中 Console 和 Graph 這兩個標簽)。

我們上面說過,Prometheus 自身也暴露了很多的監(jiān)控指標,也可以在 Graph 頁面查詢,展開 Execute 按鈕旁邊的下拉框,可以看到很多指標名稱,我們隨便選一個,譬如:promhttp_metric_handler_requests_total,這個指標表示 /metrics 頁面的訪問次數,Prometheus 就是通過這個頁面來抓取自身的監(jiān)控數據的。在 Console 標簽中查詢結果如下:

511133c2-5009-11ed-a3b6-dac502259ad0.jpg

上面在介紹 Prometheus 的配置文件時,可以看到 scrape_interval 參數是 15s,也就是說 Prometheus 每 15s 訪問一次 /metrics 頁面,所以我們過 15s 刷新下頁面,可以看到指標值會自增。在 Graph 標簽中可以看得更明顯:

51857426-5009-11ed-a3b6-dac502259ad0.jpg

3.1 數據模型

要學習 PromQL,首先我們需要了解下 Prometheus 的數據模型,一條 Prometheus 數據由一個指標名稱(metric)和 N 個標簽(label,N >= 0)組成的,比如下面這個例子:

promhttp\_metric\_handler\_requests\_total{code="200",instance="192.168.0.107:9090",job="prometheus"}106

這條數據的指標名稱為 promhttp_metric_handler_requests_total,并且包含三個標簽 code、instance 和 job,這條記錄的值為 106。上面說過,Prometheus 是一個時序數據庫,相同指標相同標簽的數據構成一條時間序列。如果以傳統數據庫的概念來理解時序數據庫,可以把指標名當作表名,標簽是字段,timestamp 是主鍵,還有一個 float64 類型的字段表示值(Prometheus 里面所有值都是按 float64 存儲)。

這種數據模型和 OpenTSDB 的數據模型是比較類似的,詳細的信息可以參考官網文檔 Data model。另外,關于指標和標簽的命名,官網有一些指導性的建議,可以參考 Metric and label naming 。

雖然 Prometheus 里存儲的數據都是 float64 的一個數值,但如果我們按類型來分,可以把 Prometheus 的數據分成四大類:

Counter

Gauge

Histogram

Summary

Counter 用于計數,例如:請求次數、任務完成數、錯誤發(fā)生次數,這個值會一直增加,不會減少。Gauge 就是一般的數值,可大可小,例如:溫度變化、內存使用變化。Histogram 是直方圖,或稱為柱狀圖,常用于跟蹤事件發(fā)生的規(guī)模,例如:請求耗時、響應大小。

它特別之處是可以對記錄的內容進行分組,提供 count 和 sum 的功能。Summary 和 Histogram 十分相似,也用于跟蹤事件發(fā)生的規(guī)模,不同之處是,它提供了一個 quantiles 的功能,可以按百分比劃分跟蹤的結果。例如:quantile 取值 0.95,表示取采樣值里面的 95% 數據。更多信息可以參考官網文檔 Metric types,Summary 和 Histogram 的概念比較容易混淆,屬于比較高階的指標類型,可以參考 Histograms and summaries 這里的說明。

這四種類型的數據只在指標的提供方作區(qū)分,也就是上面說的 Exporter,如果你需要編寫自己的 Exporter 或者在現有系統中暴露供 Prometheus 抓取的指標,你可以使用 Prometheus client libraries,這個時候你就需要考慮不同指標的數據類型了。如果你不用自己實現,而是直接使用一些現成的 Exporter,然后在 Prometheus 里查查相關的指標數據,那么可以不用太關注這塊,不過理解 Prometheus 的數據類型,對寫出正確合理的 PromQL 也是有幫助的。

3.2 PromQL 入門

我們從一些例子開始學習 PromQL,最簡單的 PromQL 就是直接輸入指標名稱,比如:

#表示Prometheus能否抓取target的指標,用于target的健康檢查
up

這條語句會查出 Prometheus 抓取的所有 target 當前運行情況,譬如下面這樣:

up{instance="192.168.0.107:9090",job="prometheus"}1
up{instance="192.168.0.108:9090",job="prometheus"}1
up{instance="192.168.0.107:9100",job="server"}1
up{instance="192.168.0.108:9104",job="mysql"}0

也可以指定某個 label 來查詢:

up{job="prometheus"}

這種寫法被稱為 Instant vector selectors,這里不僅可以使用 = 號,還可以使用 !=、=~、!~,比如下面這樣:

up{job!="prometheus"}
up{job=~"server|mysql"}
up{job=~"192.168.0.107.+"}

=~ 是根據正則表達式來匹配,必須符合 RE2 的語法。

和 Instant vector selectors 相應的,還有一種選擇器,叫做 Range vector selectors,它可以查出一段時間內的所有數據:

http_requests_total[5m]

這條語句查出 5 分鐘內所有抓取的 HTTP 請求數,注意它返回的數據類型是 Range vector,沒辦法在 Graph 上顯示成曲線圖,一般情況下,會用在 Counter 類型的指標上,并和 rate() 或 irate() 函數一起使用(注意 rate 和 irate 的區(qū)別)。

#計算的是每秒的平均值,適用于變化很慢的counter
#per-secondaveragerateofincrease,forslow-movingcounters
rate(http_requests_total[5m])

#計算的是每秒瞬時增加速率,適用于變化很快的counter
#per-secondinstantrateofincrease,forvolatileandfast-movingcounters
irate(http_requests_total[5m])

此外,PromQL 還支持 count、sum、min、max、topk 等 聚合操作,還支持 rate、abs、ceil、floor 等一堆的 內置函數,更多的例子,還是上官網學習吧。如果感興趣,我們還可以把 PromQL 和 SQL 做一個對比,會發(fā)現 PromQL 語法更簡潔,查詢性能也更高。

3.3 HTTP API

我們不僅僅可以在 Prometheus 的 Graph 頁面查詢 PromQL,Prometheus 還提供了一種 HTTP API 的方式,可以更靈活的將 PromQL 整合到其他系統中使用,譬如下面要介紹的 Grafana,就是通過 Prometheus 的 HTTP API 來查詢指標數據的。實際上,我們在 Prometheus 的 Graph 頁面查詢也是使用了 HTTP API。

我們看下 Prometheus 的 HTTP API 官方文檔,它提供了下面這些接口:

GET /api/v1/query

GET /api/v1/query_range

GET /api/v1/series

GET /api/v1/label/

/values

GET /api/v1/targets

GET /api/v1/rules

GET /api/v1/alerts

GET /api/v1/targets/metadata

GET /api/v1/alertmanagers

GET /api/v1/status/config

GET /api/v1/status/flags

從 Prometheus v2.1 開始,又新增了幾個用于管理 TSDB 的接口:

POST /api/v1/admin/tsdb/snapshot

POST /api/v1/admin/tsdb/delete_series

POST /api/v1/admin/tsdb/clean_tombstones

四、安裝 Grafana

雖然 Prometheus 提供的 Web UI 也可以很好的查看不同指標的視圖,但是這個功能非常簡單,只適合用來調試。要實現一個強大的監(jiān)控系統,還需要一個能定制展示不同指標的面板,能支持不同類型的展現方式(曲線圖、餅狀圖、熱點圖、TopN 等),這就是儀表盤(Dashboard)功能。

因此 Prometheus 開發(fā)了一套儀表盤系統 PromDash,不過很快這套系統就被廢棄了,官方開始推薦使用 Grafana 來對 Prometheus 的指標數據進行可視化,這不僅是因為 Grafana 的功能非常強大,而且它和 Prometheus 可以完美的無縫融合。

Grafana 是一個用于可視化大型測量數據的開源系統,它的功能非常強大,界面也非常漂亮,使用它可以創(chuàng)建自定義的控制面板,你可以在面板中配置要顯示的數據和顯示方式,它 支持很多不同的數據源,比如:Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus 等,而且它也 支持眾多的插件。

下面我們就體驗下使用 Grafana 來展示 Prometheus 的指標數據。首先我們來安裝 Grafana,我們使用最簡單的 Docker 安裝方式:

$dockerrun-d-p3000:3000grafana/grafana

運行上面的 docker 命令,Grafana 就安裝好了!你也可以采用其他的安裝方式,參考 官方的安裝文檔。安裝完成之后,我們訪問 http://localhost:3000/ 進入 Grafana 的登陸頁面,輸入默認的用戶名和密碼(admin/admin)即可。

要使用 Grafana,第一步當然是要配置數據源,告訴 Grafana 從哪里取數據,我們點擊 Add data source 進入數據源的配置頁面:

519f16ba-5009-11ed-a3b6-dac502259ad0.jpg

我們在這里依次填上:

Name: prometheus

Type: Prometheus

URL: http://localhost:9090

Access: Browser

要注意的是,這里的 Access 指的是 Grafana 訪問數據源的方式,有 Browser 和 Proxy 兩種方式。Browser 方式表示當用戶訪問 Grafana 面板時,瀏覽器直接通過 URL 訪問數據源的;而 Proxy 方式表示瀏覽器先訪問 Grafana 的某個代理接口(接口地址是 /api/datasources/proxy/),由 Grafana 的服務端來訪問數據源的 URL,如果數據源是部署在內網,用戶通過瀏覽器無法直接訪問時,這種方式非常有用。

配置好數據源,Grafana 會默認提供幾個已經配置好的面板供你使用,如下圖所示,默認提供了三個面板:Prometheus Stats、Prometheus 2.0 Stats 和 Grafana metrics。點擊 Import 就可以導入并使用該面板。

我們導入 Prometheus 2.0 Stats 這個面板,可以看到下面這樣的監(jiān)控面板。如果你的公司有條件,可以申請個大顯示器掛在墻上,將這個面板投影在大屏上,實時觀察線上系統的狀態(tài),可以說是非常 cool 的。

五、使用 Exporter 收集指標

目前為止,我們看到的都還只是一些沒有實際用途的指標,如果我們要在我們的生產環(huán)境真正使用 Prometheus,往往需要關注各種各樣的指標,譬如服務器的 CPU負載、內存占用量、IO開銷、入網和出網流量等等。

正如上面所說,Prometheus 是使用 Pull 的方式來獲取指標數據的,要讓 Prometheus 從目標處獲得數據,首先必須在目標上安裝指標收集的程序,并暴露出 HTTP 接口供 Prometheus 查詢,這個指標收集程序被稱為 Exporter,不同的指標需要不同的 Exporter 來收集,目前已經有大量的 Exporter 可供使用,幾乎囊括了我們常用的各種系統和軟件。

官網列出了一份 常用 Exporter 的清單,各個 Exporter 都遵循一份端口約定,避免端口沖突,即從 9100 開始依次遞增,這里是 完整的 Exporter 端口列表。另外值得注意的是,有些軟件和系統無需安裝 Exporter,這是因為他們本身就提供了暴露 Prometheus 格式的指標數據的功能,比如 Kubernetes、Grafana、Etcd、Ceph 等。

這一節(jié)就讓我們來收集一些有用的數據。

5.1 收集服務器指標

首先我們來收集服務器的指標,這需要安裝 node_exporter,這個 exporter 用于收集 *NIX 內核的系統,如果你的服務器是 Windows,可以使用 WMI exporter。

和 Prometheus server 一樣,node_exporter 也是開箱即用的:

$wgethttps://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
$tarxvfznode_exporter-0.16.0.linux-amd64.tar.gz
$cdnode_exporter-0.16.0.linux-amd64
$./node_exporter

node_exporter 啟動之后,我們訪問下 /metrics 接口看看是否能正常獲取服務器指標:

$curlhttp://localhost:9100/metrics

如果一切 OK,我們可以修改 Prometheus 的配置文件,將服務器加到 scrape_configs 中:

scrape_configs:
-job_name:'prometheus'
static_configs:
-targets:['192.168.0.107:9090']
-job_name:'server'
static_configs:
-targets:['192.168.0.107:9100']

修改配置后,需要重啟 Prometheus 服務,或者發(fā)送 HUP 信號也可以讓 Prometheus 重新加載配置:

$killall-HUPprometheus

在 Prometheus Web UI 的 Status -> Targets 中,可以看到新加的服務器:

在 Graph 頁面的指標下拉框可以看到很多名稱以 node 開頭的指標,譬如我們輸入 node_load1 觀察服務器負載:

51b5c676-5009-11ed-a3b6-dac502259ad0.jpg

如果想在 Grafana 中查看服務器的指標,可以在 Grafana 的 Dashboards 頁面 搜索 node exporter,有很多的面板模板可以直接使用,譬如:Node Exporter Server Metrics 或者 Node Exporter Full 等。我們打開 Grafana 的 Import dashboard 頁面,輸入面板的 URL(https://grafana.com/dashboards/405)或者 ID(405)即可。

522be14e-5009-11ed-a3b6-dac502259ad0.jpg

注意事項

一般情況下,node_exporter 都是直接運行在要收集指標的服務器上的,官方不推薦用 Docker 來運行 node_exporter。如果逼不得已一定要運行在 Docker 里,要特別注意,這是因為 Docker 的文件系統和網絡都有自己的 namespace,收集的數據并不是宿主機真實的指標。可以使用一些變通的方法,比如運行 Docker 時加上下面這樣的參數:

dockerrun-d
--net="host"
--pid="host"
-v"/:/host:ro,rslave"
quay.io/prometheus/node-exporter
--path.rootfs/host

關于 node_exporter 的更多信息,可以參考 node_exporter 的文檔 和 Prometheus 的官方指南 Monitoring Linux host metrics with the Node Exporter,另外,Julius Volz 的這篇文章 How To Install Prometheus using Docker on Ubuntu 14.04 也是很好的入門材料。

5.2 收集 MySQL 指標

mysqld_exporter 是 Prometheus 官方提供的一個 exporter,我們首先 下載最新版本 并解壓(開箱即用):

$wgethttps://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz
$tarxvfzmysqld_exporter-0.11.0.linux-amd64.tar.gz
$cdmysqld_exporter-0.11.0.linux-amd64/

mysqld_exporter 需要連接到 mysqld 才能收集它的指標,可以通過兩種方式來設置 mysqld 數據源。第一種是通過環(huán)境變量 DATA_SOURCE_NAME,這被稱為 DSN(數據源名稱),它必須符合 DSN 的格式,一個典型的 DSN 格式像這樣:user:password@(host:port)/。

$exportDATA_SOURCE_NAME='root:123456@(192.168.0.107:3306)/'
$./mysqld_exporter

另一種方式是通過配置文件,默認的配置文件是 ~/.my.cnf,或者通過 --config.my-cnf 參數指定:

$./mysqld_exporter--config.my-cnf=".my.cnf"

配置文件的格式如下:

$cat.my.cnf
[client]
host=localhost
port=3306
user=root
password=123456

如果要把 MySQL 的指標導入 Grafana,可以參考 這些 Dashboard JSON。

注意事項

這里為簡單起見,在 mysqld_exporter 中直接使用了 root 連接數據庫,在真實環(huán)境中,可以為 mysqld_exporter 創(chuàng)建一個單獨的用戶,并賦予它受限的權限(PROCESS、REPLICATION CLIENT、SELECT),最好還限制它的最大連接數(MAX_USER_CONNECTIONS)。

CREATEUSER'exporter'@'localhost'IDENTIFIEDBY'password'WITHMAX_USER_CONNECTIONS3;
GRANTPROCESS,REPLICATIONCLIENT,SELECTON*.*TO'exporter'@'localhost';

5.3 收集 Nginx 指標

官方提供了兩種收集 Nginx 指標的方式。

第一種是 Nginx metric library,這是一段 Lua 腳本(prometheus.lua),Nginx 需要開啟 Lua 支持(libnginx-mod-http-lua 模塊)。為方便起見,也可以使用 OpenResty 的 OPM(OpenResty Package Manager) 或者 luarocks(The Lua package manager) 來安裝。

第二種是 Nginx VTS exporter,這種方式比第一種要強大的多,安裝要更簡單,支持的指標也更豐富,它依賴于 nginx-module-vts 模塊,vts 模塊可以提供大量的 Nginx 指標數據,可以通過 JSON、HTML 等形式查看這些指標。Nginx VTS exporter 就是通過抓取 /status/format/json 接口來將 vts 的數據格式轉換為 Prometheus 的格式。

不過,在 nginx-module-vts 最新的版本中增加了一個新接口:/status/format/prometheus,這個接口可以直接返回 Prometheus 的格式,從這點這也能看出 Prometheus 的影響力,估計 Nginx VTS exporter 很快就要退役了(TODO:待驗證)。

除此之外,還有很多其他的方式來收集 Nginx 的指標,比如:nginx_exporter 通過抓取 Nginx 自帶的統計頁面 /nginx_status 可以獲取一些比較簡單的指標(需要開啟 ngx_http_stub_status_module 模塊);nginx_request_exporter 通過 syslog 協議 收集并分析 Nginx 的 access log 來統計 HTTP 請求相關的一些指標;nginx-prometheus-shiny-exporter 和 nginx_request_exporter 類似,也是使用 syslog 協議來收集 access log,不過它是使用 Crystal 語言 寫的。還有 vovolie/lua-nginx-prometheus 基于 Openresty、Prometheus、Consul、Grafana 實現了針對域名和 Endpoint 級別的流量統計。

有需要或感興趣的同學可以對照說明文檔自己安裝體驗下,這里就不一一嘗試了。

5.4 收集 JMX 指標

最后讓我們來看下如何收集 Java 應用的指標,Java 應用的指標一般是通過 JMX(Java Management Extensions) 來獲取的,顧名思義,JMX 是管理 Java 的一種擴展,它可以方便的管理和監(jiān)控正在運行的 Java 程序。

JMX Exporter 用于收集 JMX 指標,很多使用 Java 的系統,都可以使用它來收集指標,比如:Kafaka、Cassandra 等。首先我們下載 JMX Exporter:

$wgethttps://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar

JMX Exporter 是一個 Java Agent 程序,在運行 Java 程序時通過 -javaagent 參數來加載:

$java-javaagent:jmx_prometheus_javaagent-0.3.1.jar=9404:config.yml-jarspring-boot-sample-1.0-SNAPSHOT.jar

其中,9404 是 JMX Exporter 暴露指標的端口,config.yml 是 JMX Exporter 的配置文件,它的內容可以 參考 JMX Exporter 的配置說明 。然后檢查下指標數據是否正確獲取:

$curlhttp://localhost:9404/metrics

六、告警和通知

至此,我們能收集大量的指標數據,也能通過強大而美觀的面板展示出來。不過作為一個監(jiān)控系統,最重要的功能,還是應該能及時發(fā)現系統問題,并及時通知給系統負責人,這就是 Alerting(告警)。

Prometheus 的告警功能被分成兩部分:一個是告警規(guī)則的配置和檢測,并將告警發(fā)送給 Alertmanager,另一個是 Alertmanager,它負責管理這些告警,去除重復數據,分組,并路由到對應的接收方式,發(fā)出報警。常見的接收方式有:Email、PagerDuty、HipChat、Slack、OpsGenie、WebHook 等。

6.1 配置告警規(guī)則

我們在上面介紹 Prometheus 的配置文件時了解到,它的默認配置文件 prometheus.yml 有四大塊:global、alerting、rule_files、scrape_config,其中 rule_files 塊就是告警規(guī)則的配置項,alerting 塊用于配置 Alertmanager,這個我們下一節(jié)再看。現在,先讓我們在 rule_files 塊中添加一個告警規(guī)則文件:

rule_files:
-"alert.rules"

然后參考 官方文檔,創(chuàng)建一個告警規(guī)則文件 alert.rules:

groups:
-name:example
rules:

#Alertforanyinstancethatisunreachablefor>5minutes.
-alert:InstanceDown
expr:up==0
for:5m
labels:
severity:page
annotations:
summary:"Instance{{$labels.instance}}down"
description:"{{$labels.instance}}ofjob{{$labels.job}}hasbeendownformorethan5minutes."

#Alertforanyinstancethathasamedianrequestlatency>1s.
-alert:APIHighRequestLatency
expr:api_http_request_latencies_second{quantile="0.5"}>1
for:10m
annotations:
summary:"Highrequestlatencyon{{$labels.instance}}"
description:"{{$labels.instance}}hasamedianrequestlatencyabove1s(currentvalue:{{$value}}s)"

這個規(guī)則文件里,包含了兩條告警規(guī)則:InstanceDown 和 APIHighRequestLatency。顧名思義,InstanceDown 表示當實例宕機時(up === 0)觸發(fā)告警,APIHighRequestLatency 表示有一半的 API 請求延遲大于 1s 時(api_http_request_latencies_second{quantile="0.5"} > 1)觸發(fā)告警。

配置好后,需要重啟下 Prometheus server,然后訪問 http://localhost:9090/rules 可以看到剛剛配置的規(guī)則:

5234ced0-5009-11ed-a3b6-dac502259ad0.jpg

訪問 http://localhost:9090/alerts 可以看到根據配置的規(guī)則生成的告警:

52405c82-5009-11ed-a3b6-dac502259ad0.jpg

這里我們將一個實例停掉,可以看到有一條 alert 的狀態(tài)是 PENDING,這表示已經觸發(fā)了告警規(guī)則,但還沒有達到告警條件。這是因為這里配置的 for 參數是 5m,也就是 5 分鐘后才會觸發(fā)告警,我們等 5 分鐘,可以看到這條 alert 的狀態(tài)變成了 FIRING。

6.2 使用 Alertmanager 發(fā)送告警通知

雖然 Prometheus 的 /alerts 頁面可以看到所有的告警,但是還差最后一步:觸發(fā)告警時自動發(fā)送通知。這是由 Alertmanager 來完成的,我們首先 下載并安裝 Alertmanager,和其他 Prometheus 的組件一樣,Alertmanager 也是開箱即用的:

$wgethttps://github.com/prometheus/alertmanager/releases/download/v0.15.2/alertmanager-0.15.2.linux-amd64.tar.gz
$tarxvfzalertmanager-0.15.2.linux-amd64.tar.gz
$cdalertmanager-0.15.2.linux-amd64
$./alertmanager

Alertmanager 啟動后默認可以通過 http://localhost:9093/ 來訪問,但是現在還看不到告警,因為我們還沒有把 Alertmanager 配置到 Prometheus 中,我們回到 Prometheus 的配置文件 prometheus.yml,添加下面幾行:

alerting:
alertmanagers:
-scheme:http
static_configs:
-targets:
-"192.168.0.107:9093"

這個配置告訴 Prometheus,當發(fā)生告警時,將告警信息發(fā)送到 Alertmanager,Alertmanager 的地址為 http://192.168.0.107:9093。也可以使用命名行的方式指定 Alertmanager:

$./prometheus-alertmanager.url=http://192.168.0.107:9093

這個時候再訪問 Alertmanager,可以看到 Alertmanager 已經接收到告警了:

5254f69c-5009-11ed-a3b6-dac502259ad0.jpg

下面的問題就是如何讓 Alertmanager 將告警信息發(fā)送給我們了,我們打開默認的配置文件 alertmanager.ym:

global:
resolve_timeout:5m

route:
group_by:['alertname']
group_wait:10s
group_interval:10s
repeat_interval:1h
receiver:'web.hook'
receivers:
-name:'web.hook'
webhook_configs:
-url:'http://127.0.0.1:5001/'
inhibit_rules:
-source_match:
severity:'critical'
target_match:
severity:'warning'
equal:['alertname','dev','instance']

參考 官方的配置手冊 了解各個配置項的功能,其中 global 塊表示一些全局配置;route 塊表示通知路由,可以根據不同的標簽將告警通知發(fā)送給不同的 receiver,這里沒有配置 routes 項,表示所有的告警都發(fā)送給下面定義的 web.hook 這個 receiver;如果要配置多個路由,可以參考 這個例子:

routes:
-receiver:'database-pager'
group_wait:10s
match_re:
service:mysql|cassandra

-receiver:'frontend-pager'
group_by:[product,environment]
match:
team:frontend

緊接著,receivers 塊表示告警通知的接收方式,每個 receiver 包含一個 name 和一個 xxx_configs,不同的配置代表了不同的接收方式,Alertmanager 內置了下面這些接收方式:

email_config

hipchat_config

pagerduty_config

pushover_config

slack_config

opsgenie_config

victorops_config

wechat_configs

webhook_config

雖然接收方式很豐富,但是在國內,其中大多數接收方式都很少使用。最常用到的,莫屬 email_config 和 webhook_config,另外 wechat_configs 可以支持使用微信來告警,也是相當符合國情的了。

其實告警的通知方式是很難做到面面俱到的,因為消息軟件各種各樣,每個國家還可能不同,不可能完全覆蓋到,所以 Alertmanager 已經決定不再添加新的 receiver 了,而是推薦使用 webhook 來集成自定義的接收方式。可以參考 這些集成的例子,譬如 將釘釘接入 Prometheus AlertManager WebHook。

七、學習更多

到這里,我們已經學習了 Prometheus 的大多數功能,結合 Prometheus + Grafana + Alertmanager 完全可以搭建一套非常完整的監(jiān)控系統。不過在真正使用時,我們會發(fā)現更多的問題。

7.1 服務發(fā)現

由于 Prometheus 是通過 Pull 的方式主動獲取監(jiān)控數據,所以需要手工指定監(jiān)控節(jié)點的列表,當監(jiān)控的節(jié)點增多之后,每次增加節(jié)點都需要更改配置文件,非常麻煩,這個時候就需要通過服務發(fā)現(service discovery,SD)機制去解決。

Prometheus 支持多種服務發(fā)現機制,可以自動獲取要收集的 targets,可以參考 這里,包含的服務發(fā)現機制包括:azure、consul、dns、ec2、openstack、file、gce、kubernetes、marathon、triton、zookeeper(nerve、serverset),配置方法可以參考手冊的 Configuration 頁面。可以說 SD 機制是非常豐富的,但目前由于開發(fā)資源有限,已經不再開發(fā)新的 SD 機制,只對基于文件的 SD 機制進行維護。

關于服務發(fā)現網上有很多教程,譬如 Prometheus 官方博客中這篇文章 Advanced Service Discovery in Prometheus 0.14.0 對此有一個比較系統的介紹,全面的講解了 relabeling 配置,以及如何使用 DNS-SRV、Consul 和文件來做服務發(fā)現。

另外,官網還提供了 一個基于文件的服務發(fā)現的入門例子,Julius Volz 寫的 Prometheus workshop 入門教程中也 使用了 DNS-SRV 來當服務發(fā)現。

7.2 告警配置管理

無論是 Prometheus 的配置還是 Alertmanager 的配置,都沒有提供 API 供我們動態(tài)的修改。一個很常見的場景是,我們需要基于 Prometheus 做一套可自定義規(guī)則的告警系統,用戶可根據自己的需要在頁面上創(chuàng)建修改或刪除告警規(guī)則,或者是修改告警通知方式和聯系人,正如在 Prometheus Google Groups 里的 這個用戶的問題:How to dynamically add alerts rules in rules.conf and prometheus yml file via API or something?

不過遺憾的是,Simon Pasquier 在下面說到,目前并沒有這樣的 API,而且以后也沒有這樣的計劃來開發(fā)這樣的 API,因為這樣的功能更應該交給譬如 Puppet、Chef、Ansible、Salt 這樣的配置管理系統。

7.3 使用 Pushgateway

Pushgateway 主要用于收集一些短期的 jobs,由于這類 jobs 存在時間較短,可能在 Prometheus 來 Pull 之前就消失了。官方對 什么時候該使用 Pushgateway 有一個很好的說明。

總結

這篇博客參考了網絡上大量關于 Prometheus 的中文資料,有文檔,也有博客,比如 1046102779 的 Prometheus 非官方中文手冊,宋佳洋 的電子書《Prometheus 實戰(zhàn)》,在這里對這些原作者表示敬意。在 Prometheus 官方文檔的 Media 頁面,也提供了很多學習資源。

關于 Prometheus,還有非常重要的一部分內容這篇博客沒有涉及到,正如博客一開頭所講的,Prometheus 是繼 Kubernetes 之后第二個加入 CNCF 的項目,Prometheus 和 Docker、Kubernetes 的結合非常緊密,使用 Prometheus 作為 Docker 和 Kubernetes 的監(jiān)控系統也越來越主流。

關于 Docker 的監(jiān)控,可以參考官網的一篇指南:Monitoring Docker container metrics using cAdvisor,它介紹了如何使用 cAdvisor 來對容器進行監(jiān)控;不過 Docker 現在也開始原生支持 Prometheus 的監(jiān)控了,參考 Docker 的官方文檔 Collect Docker metrics with Prometheus;關于 Kubernetes 的監(jiān)控,Kubernetes 中文社區(qū) 里有不少關于 Promehtheus 的資源,另外,《如何以優(yōu)雅的姿勢監(jiān)控 Kubernetes》這本電子書也對 Kubernetes 的監(jiān)控有一個比較全面的介紹。

最近兩年 Prometheus 的發(fā)展非常迅速,社區(qū)也非常活躍,國內研究 Prometheus 的人也越來越多。隨著微服務,DevOps,云計算,云原生等概念的普及,越來越多的企業(yè)開始使用 Docker 和 Kubernetes 來構建自己的系統和應用,像 Nagios 和 Cacti 這樣的老牌監(jiān)控系統會變得越來越不適用,相信 Prometheus 最終會發(fā)展成一個最適合云環(huán)境的監(jiān)控系統。

附錄:什么是時序數據庫?

上文提到 Prometheus 是一款基于時序數據庫的監(jiān)控系統,時序數據庫常簡寫為 TSDB(Time Series Database)。很多流行的監(jiān)控系統都在使用時序數據庫來保存數據,這是因為時序數據庫的特點和監(jiān)控系統不謀而合。

增:需要頻繁的進行寫操作,而且是按時間排序順序寫入

刪:不需要隨機刪除,一般情況下會直接刪除一個時間區(qū)塊的所有數據

改:不需要對寫入的數據進行更新

查:需要支持高并發(fā)的讀操作,讀操作是按時間順序升序或降序讀,數據量非常大,緩存不起作用

DB-Engines 上有一個關于時序數據庫的排名,下面是排名靠前的幾個(2018年10月):

另外,liubin 在他的博客上寫了一個關于時序數據庫的系列文章:時序列數據庫武斗大會,推薦。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11402

    瀏覽量

    212064
  • 監(jiān)控系統

    關注

    21

    文章

    3993

    瀏覽量

    180197
  • Prometheus
    +關注

    關注

    0

    文章

    28

    瀏覽量

    1819

原文標題:【建議收藏】一起看看Prometheus 監(jiān)控系統知識體系

文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式學習指引--嵌入式系統知識體系,學習誤區(qū)

    ,全面地理解嵌入式系統知識體系。   2.4 入門芯片選擇的困惑   嵌入式系統的大部分初學者需要選擇一個微控制器(MCU)進行入門級學習,面對眾多廠家生產的微控制器系列,往往不知如何是好。 首先是
    發(fā)表于 03-11 16:58

    嵌入式系統知識體系、學習誤區(qū)及建議

    嵌入式系統知識體系、學習誤區(qū)及建議
    發(fā)表于 08-20 15:29

    嵌入式系統知識體系、學習的誤區(qū)盲區(qū)及一些建議

    軟件工程的方法、原理與基本原則。所以,嵌入式軟件工程也是嵌入式系統知識體系的有機組成部分,只不過它融于具體項目的開發(fā)過程之中。  以上涉及硬件基礎、軟件基礎及相關領域知識。計算機語言、
    發(fā)表于 03-18 13:47

    嵌入式系統知識體系、學習的誤區(qū)、盲區(qū)及一些建議

    ,其芯片相關知識只占知識體系的20%左右,80%左右是通用的軟件硬件及相關知識。80%的通用知識
    發(fā)表于 03-21 10:42

    嵌入式系統知識體系和學習誤區(qū)

    軟件工程的方法、原理與基本原則。所以,嵌入式軟件工程也是嵌入式系統知識體系的有機組成部分,只不過,它融于具體項目的開發(fā)過程之中。以上實踐訓練涉及硬件基礎、軟件基礎及相關領域知識。計算機
    發(fā)表于 07-30 14:32

    嵌入式初學者需要知道的學習知識體系

    軟件工程的方法、原理與基本原則。所以,嵌入式軟件工程也是嵌入式系統知識體系的有機組成部分,只不過,它融于具體項目的開發(fā)過程之中。以上實踐訓練涉及硬件基礎、軟件基礎及相關領域知識。計算機
    發(fā)表于 03-19 06:30

    prometheus監(jiān)控服務的整個流程介紹

    最近有個新項目需要搞一套完整的監(jiān)控告警系統,我們使用了開源監(jiān)控告警系統Prometheus;其功能強大,可以很方便對其進行擴展,并且可以安裝
    發(fā)表于 12-23 17:34

    嵌入式系統知識體系

    嵌入式系統知識體系嵌入式系統的學習誤區(qū)嵌入式系統基礎階段的學習建議
    發(fā)表于 02-19 07:06

    嵌入式系統學習知識體系,新手工程師都要懂!

    軟件工程的方法、原理與基本原則。所以,嵌入式軟件工程也是嵌入式系統知識體系的有機組成部分,只不過,它融于具體項目的開發(fā)過程之中。以上實踐訓練涉及硬件基礎、軟件基礎及相關領域知識。計算機
    發(fā)表于 05-10 08:30

    能夠快速構建嵌入式學習所需要知識體系的書籍推薦

    經常有網友要我推薦一些關于嵌入式方面的書,尤其是一些轉行學嵌入式的朋友,該看那些書能快速構建嵌入式學習所需要的知識體系呢?嵌入式是一門交叉學科,沒有足夠的知識儲備,上來就學習的話,往往也就成了走過場
    發(fā)表于 12-15 08:01

    LCD1602知識體系的結構學習與理解

    LCD1602的學習與理解文章目錄LCD1602的學習與理解一、LCD1602知識體系的結構二、初始化程序# 前言看過很多博主的文章,很多都講得不是很清楚,很可能的原因就是,這些博主在寫文章的時候
    發(fā)表于 01-27 06:31

    淺析自然語言處理知識體系結構

    自然語言處理知識太龐大了,網上也都是一些零零散散的知識,比如單獨講某些模型,也沒有來龍去脈,學習起來較為困難,于是總結了一份知識體系結構。
    的頭像 發(fā)表于 08-18 09:57 ?5320次閱讀

    電子硬件的知識體系是怎樣的

    最近有不少軟件領域的牛人進軍硬件行業(yè),但不知從何處入手。相信每個人面對一個龐大的知識體系時都一樣迷茫。最佳的應對策略就是找一個最貼近自己需求的切入點,然后向四面八方鋪開去逐漸認識整個知識網絡。這篇文章就是為了讓你在這個知識網里面
    的頭像 發(fā)表于 10-20 11:36 ?4487次閱讀

    嵌入式系統知識體系

    嵌入式系統知識體系  嵌入式系統的應用范圍可以粗略分為兩大類:電子系統的智能化(工業(yè) 控制、現代農業(yè)、家用電器、汽車電子、測控系統、數據采
    發(fā)表于 10-20 12:35 ?3次下載
    嵌入式<b class='flag-5'>系統</b>的<b class='flag-5'>知識體系</b>

    使用Thanos+Prometheus+Grafana構建監(jiān)控系統

    對于彈性伸縮和高可用的系統來說,一般有大量的指標數據需要收集和存儲,如何為這樣的系統打造一個監(jiān)控方案呢?本文介紹了如何使用 Thanos+Prometheus+Grafana 構建
    的頭像 發(fā)表于 05-05 21:14 ?2877次閱讀
    主站蜘蛛池模板: 国产www色| 免费a在线看 | 狠狠摸狠狠操 | 午夜剧场刺激性爽免费视频 | 日本黄色免费电影 | 国产三级播放 | 免费在线观看的网站 | aaaaaaaaa在线观看 | 视频一区二区不卡 | 欧美一区二区三区四区在线观看 | 农村妇女色又黄一级毛片卡 | www.xxx.国产| 日本一区不卡在线观看 | 日韩亚洲人成网站在线播放 | 日本一区二区在线不卡 | 久久semm亚洲国产 | 在线观看亚洲免费视频 | 久青草国产高清在线视频 | 手机看片国产精品 | 国产女乱淫真高清免费视频 | 视频二区在线观看 | 特级深夜a级毛片免费观看 特级生活片 | 日韩毛片免费线上观看 | 能在线观看的一区二区三区 | 一级毛片免费全部播放完整 | 五月天丁香婷婷网 | 在线播放视频网站 | 天天干天天操天天摸 | 美女视频网站色软件免费视频 | 在线你懂的网址 | 国产高清在线精品一区 | 操狠狠 | 日韩欧美成人乱码一在线 | 日韩一级生活片 | www.男人| 亚洲区 | 日韩一级影院 | 伊人不卡久久大香线蕉综合影院 | 国产精品三级国语在线看 | 一卡二卡≡卡四卡亚洲高清 | 免费国内精品久久久久影院 |