<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Prometheus+InfluxDB+Grafana 打造高逼格監(jiān)控平臺(tái)

          共 11587字,需瀏覽 24分鐘

           ·

          2021-11-09 13:25

          在下方公眾號(hào)后臺(tái)回復(fù):面試手冊(cè),可獲取杰哥匯總的 3 份面試 PDF 手冊(cè)。

          在本模塊中,我將把幾個(gè)常用的監(jiān)控部分給梳理一下。前面我們提到過,在性能監(jiān)控圖譜中,有操作系統(tǒng)、應(yīng)用服務(wù)器、中間件、隊(duì)列、緩存、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、前端、負(fù)載均衡、Web 服務(wù)器、存儲(chǔ)、代碼等很多需要監(jiān)控的點(diǎn)。顯然這些監(jiān)控點(diǎn)不能在一個(gè)專欄中全部覆蓋并一一細(xì)化,我只能找最常用的幾個(gè),做些邏輯思路的說(shuō)明,同時(shí)也把具體的實(shí)現(xiàn)描述出來(lái)。如果你遇到了其他的組件,也需要一一實(shí)現(xiàn)這些監(jiān)控。

          在本篇中,主要想說(shuō)明白下圖的這個(gè)監(jiān)控邏輯。

          這應(yīng)該是現(xiàn)在最流行的一套監(jiān)控邏輯了吧。我今天把常見的使用 Grafana、Prometheus、InfluxDB、Exporters 的數(shù)據(jù)展示方式說(shuō)一下,如果你剛進(jìn)入性能測(cè)試領(lǐng)域,也能有一個(gè)感性的認(rèn)識(shí)。

          有測(cè)試工具,有監(jiān)控工具,才能做后續(xù)的性能分析和瓶頸定位,所以有必要把這些工具的邏輯跟你擺一擺。

          所有做性能的人都應(yīng)該知道一點(diǎn),不管數(shù)據(jù)以什么樣的形式展示,最要緊的還是看數(shù)據(jù)的來(lái)源和含義,以便做出正確的判斷。

          我先說(shuō)明一下 JMeter 和 node_exporter 到 Grafana 的數(shù)據(jù)展示邏輯。至于其他的 Exporter,我就不再解釋這個(gè)邏輯了,只說(shuō)監(jiān)控分析的部分。

          JMeter+InfluxDB+Grafana 的數(shù)據(jù)展示邏輯

          一般情況下,我們用 JMeter 做壓力測(cè)試時(shí),都是使用 JMeter 的控制臺(tái)來(lái)查看結(jié)果。如下圖所示:

          或者裝個(gè)插件來(lái)看結(jié)果:

          或者用 JMeter 來(lái)生成 HTML:

          這樣看都沒有問題,我們?cè)谇懊嬉矎?qiáng)調(diào)過,對(duì)于壓力工具來(lái)說(shuō),我們最多只關(guān)心三條曲線的數(shù)據(jù):TPS(T 由測(cè)試目標(biāo)定義)、響應(yīng)時(shí)間、錯(cuò)誤率。這里的錯(cuò)誤率還只是輔助排查問題的曲線,沒有問題時(shí),只看 TPS 和響應(yīng)時(shí)間即可。

          不過采取以上三種方式有幾個(gè)方面的問題。

          整理結(jié)果時(shí)比較浪費(fèi)時(shí)間。

          在 GUI 用插件看曲線,做高并發(fā)時(shí)并不現(xiàn)實(shí)。

          在場(chǎng)景運(yùn)行時(shí)間比較長(zhǎng)的時(shí)候,采用生成 HTML 的方式,會(huì)出現(xiàn)消耗內(nèi)存過大的情況,而實(shí)際上,在生成的結(jié)果圖中,有很多生成的圖我們并不是那么關(guān)注。

          生成的結(jié)果保存之后再查看比較麻煩,還要一個(gè)個(gè)去找。

          那么如何解決這幾個(gè)問題呢?

          用 JMeter 的 Backend Listener 幫我們實(shí)時(shí)發(fā)送數(shù)據(jù)到 InfluxDB 或 Graphite 可以解決這樣的問題。

          Graphite Backend Listener 的支持是在 JMeter 2.13 版本,InfluxdDB Backend Listener 的支持是在 JMeter 3.3 的版本,它們都是用異步的方式把數(shù)據(jù)發(fā)送出來(lái),以便查看。

          其實(shí)有這個(gè) JMeter 發(fā)送給 InfluxDB 的數(shù)據(jù)之后,我們不需要看上面的那些 HTML 數(shù)據(jù),也可以直觀地看到系統(tǒng)性能的性能趨勢(shì)。

          并且這樣保存下來(lái)的數(shù)據(jù),在測(cè)試結(jié)束后想再次查看也比較方便比對(duì)。

          JMeter+InfluxDB+Grafana 的結(jié)構(gòu)如下:

          在這個(gè)結(jié)構(gòu)中,JMeter 發(fā)送壓力到服務(wù)器的同時(shí),統(tǒng)計(jì)下 TPS、響應(yīng)時(shí)間、線程數(shù)、錯(cuò)誤率等信息。默認(rèn)每 30 秒在控制臺(tái)輸出一次結(jié)果(在 jmeter.properties 中有一個(gè)參數(shù) #summariser.interval=30 可以控制)。

          配置了 Backend Listener 之后,將統(tǒng)計(jì)出的結(jié)果異步發(fā)送到 InfluxDB 中。最后在 Grafana 中配置 InfluxDB 數(shù)據(jù)源和 JMeter 顯示模板。

          然后就可以實(shí)時(shí)查看 JMeter 的測(cè)試結(jié)果了,這里看到的數(shù)據(jù)和控制臺(tái)的數(shù)據(jù)是一樣。

          但如果這么簡(jiǎn)單就說(shuō)完了,這篇文章也就沒價(jià)值了。下面我們來(lái)說(shuō)一下,數(shù)據(jù)的傳輸和展示邏輯。

          JMeter 中 Backend Listener 的配置

          下面我們就 InfluxDB 的 Backend Listener 做個(gè)說(shuō)明。它的配置比較簡(jiǎn)單,在腳本中加上即可。

          我們先配置好 influxdb Url、application 等信息,application 這個(gè)配置可以看成是場(chǎng)景名。

          那么 JMeter 如何將數(shù)據(jù)發(fā)給 InfluxDB 呢?請(qǐng)看源碼中的關(guān)鍵代碼,如下所示:

          private?void?addMetrics(String?transaction,?SamplerMetric?metric)?{
          ????????//?FOR?ALL?STATUS
          ????????addMetric(transaction,?metric.getTotal(),?metric.getSentBytes(),?metric.getReceivedBytes(),?TAG_ALL,?metric.getAllMean(),?metric.getAllMinTime(),
          ????????????????metric.getAllMaxTime(),?allPercentiles.values(),?metric::getAllPercentile);
          ????????//?FOR?OK?STATUS
          ????????addMetric(transaction,?metric.getSuccesses(),?null,?null,?TAG_OK,?metric.getOkMean(),?metric.getOkMinTime(),
          ????????????????metric.getOkMaxTime(),?okPercentiles.values(),?metric::getOkPercentile);
          ????????//?FOR?KO?STATUS
          ????????addMetric(transaction,?metric.getFailures(),?null,?null,?TAG_KO,?metric.getKoMean(),?metric.getKoMinTime(),
          ????????????????metric.getKoMaxTime(),?koPercentiles.values(),?metric::getKoPercentile);


          ????????metric.getErrors().forEach((error,?count)?->?addErrorMetric(transaction,?error.getResponseCode(),
          ????????????????????error.getResponseMessage(),?count));
          ????}

          從這段代碼可以看出,站在全局統(tǒng)計(jì)的視角來(lái)看,這里把 JMeter 運(yùn)行的統(tǒng)計(jì)結(jié)果,比如事務(wù)的 Total 請(qǐng)求、發(fā)送接收字節(jié)、平均值、最大值、最小值等,都加到 metric 中,同時(shí)也會(huì)把成功和失敗的事務(wù)信息添加到 metric 中去。

          在源碼中,還有更多的添加 metric 的步驟,你有興趣的話,也可以看一下 JMeter 源碼中的InfluxdbBackendListenerClient.java。

          保存了 metric 之后,再使用 InfluxdbMetricsSender 發(fā)送到 Influxdb 中去。發(fā)送關(guān)鍵代碼如下:

          @Override
          ????public?void?writeAndSendMetrics()?{
          ?........
          ????????if?(!copyMetrics.isEmpty())?{
          ????????????try?{
          ????????????????if(httpRequest?==?null)?{
          ????????????????????httpRequest?=?createRequest(url);
          ????????????????}
          ????????????????StringBuilder?sb?=?new?StringBuilder(copyMetrics.size()*35);
          ????????????????for?(MetricTuple?metric?:?copyMetrics)?{
          ????????????????????//?Add?TimeStamp?in?nanosecond?from?epoch?(?default?in?InfluxDB?)
          ????????????????????sb.append(metric.measurement)
          ????????????????????????.append(metric.tag)
          ????????????????????????.append("?")?//$NON-NLS-1$
          ????????????????????????.append(metric.field)
          ????????????????????????.append("?")
          ????????????????????????.append(metric.timestamp+"000000")?
          ????????????????????????.append("\n");?//$NON-NLS-1$
          ????????????????}


          ????????????????StringEntity?entity?=?new?StringEntity(sb.toString(),?StandardCharsets.UTF_8);

          ????????????????httpRequest.setEntity(entity);
          ????????????????lastRequest?=?httpClient.execute(httpRequest,?new?FutureCallback()?{
          ????????????????????@Override
          ????????????????????public?void?completed(final?HttpResponse?response)?{
          ????????????????????????int?code?=?response.getStatusLine().getStatusCode();
          ????????????????????????/*
          ?????????????????????????*?HTTP?response?summary?2xx:?If?your?write?request?received
          ?????????????????????????*?HTTP?204?No?Content,?it?was?a?success!?4xx:?InfluxDB
          ?????????????????????????*?could?not?understand?the?request.?5xx:?The?system?is
          ?????????????????????????*?overloaded?or?significantly?impaired.
          ?????????????????????????*/

          ????????????????????????if?(MetricUtils.isSuccessCode(code))?{
          ????????????????????????????if(log.isDebugEnabled())?{
          ????????????????????????????????log.debug("Success,?number?of?metrics?written:?{}",?copyMetrics.size());
          ????????????????????????????}?
          ????????????????????????}?else?{
          ????????????????????????????log.error("Error?writing?metrics?to?influxDB?Url:?{},?responseCode:?{},?responseBody:?{}",?url,?code,?getBody(response));
          ????????????????????????}
          ????????????????????}
          ????????????????????@Override
          ????????????????????public?void?failed(final?Exception?ex)?{
          ????????????????????????log.error("failed?to?send?data?to?influxDB?server?:?{}",?ex.getMessage());
          ????????????????????}
          ????????????????????@Override
          ????????????????????public?void?cancelled()?{
          ????????????????????????log.warn("Request?to?influxDB?server?was?cancelled");
          ????????????????????}
          ????????????????});???????????????
          ?........
          ????????????}
          ????????}
          ????}

          通過 writeAndSendMetrics,就將所有保存的 metrics 都發(fā)給了 InfluxDB。

          InfluxDB 中的存儲(chǔ)結(jié)構(gòu)

          然后我們?cè)賮?lái)看下 InfluxDB 中如何存儲(chǔ):

          >?show?databases
          name:?databases
          name
          ----
          _internal
          jmeter
          >?use?jmeter
          Using?database?jmeter
          >
          >?show?MEASUREMENTS
          name:?measurements
          name
          ----
          events
          jmeter
          >?select?*?from?events?where?application='7ddemo'
          name:?events
          time?application?text?title
          ----?-----------?----?-----
          1575255462806000000?7ddemo?Test?Cycle1?started?ApacheJMeter
          1575256463820000000?7ddemo?Test?Cycle1?ended?ApacheJMeter
          ..............
          n>?select?*?from?jmeter?where?application='7ddemo'?limit?10
          name:?jmeter
          time?application?avg?count?countError?endedT?hit?max?maxAT?meanAT?min?minAT?pct90.0?pct95.0?pct99.0?rb?responseCode?responseMessage?sb?startedT?statut?transaction
          ----?-----------?---?-----?----------?------?---?---?-----?------?---?-----?-------?-------?-------?--?------------?---------------?--?--------?------?-----------
          1575255462821000000?7ddemo?0?0?0?0?0?internal
          1575255467818000000?7ddemo?232.82352941176472?17?0?17?849?122?384.9999999999996?849?849?0?0?all?all
          1575255467824000000?7ddemo?232.82352941176472?17?849?122?384.9999999999996?849?849?0?0?all?0_openIndexPage
          1575255467826000000?7ddemo?232.82352941176472?17?849?122?384.9999999999996?849?849?ok?0_openIndexPage
          1575255467829000000?7ddemo?0?1?1?1?1?internal
          1575255472811000000?7ddemo?205.4418604651163?26?0?26?849?122?252.6?271.4?849?0?0?all?all
          1575255472812000000?7ddemo?0?1?1?1?1?internal
          1575255472812000000?7ddemo?205.4418604651163?26?849?122?252.6?271.4?849?ok?0_openIndexPage
          1575255472812000000?7ddemo?205.4418604651163?26?849?122?252.6?271.4?849?0?0?all?0_openIndexPage
          1575255477811000000?7ddemo?198.2142857142857?27?0?27?849?117?263.79999999999995?292.3500000000001?849?0?0?all?all

          這段代碼也就是說(shuō),在 InfluxDB 中,創(chuàng)建了兩個(gè) MEASUREMENTS,分別是 events 和 jmeter。這兩個(gè)各自存了數(shù)據(jù),我們?cè)诮缑嬷信渲玫?testtile 和 eventTags 放在了 events 這個(gè) MEASUREMENTS 中。在模板中這兩個(gè)值暫時(shí)都是不用的。

          在 jmeter 這個(gè) MEASUREMENTS 中,我們可以看到 application 和事務(wù)的統(tǒng)計(jì)信息,這些值和控制臺(tái)一致。在 Grafana 中顯示的時(shí)候,就是從這個(gè)表中取出的數(shù)據(jù),根據(jù)時(shí)序做的曲線。

          Grafana 中的配置

          有了 JMeter 發(fā)送到 InfluxDB 中的數(shù)據(jù),下面就來(lái)配置一下 Grafana 中的展示。首先,要配置一個(gè) InfluxDB 數(shù)據(jù)源。如下所示:

          在這里配置好 URL、Database、User、Password 之后,直接點(diǎn)擊保存即可。

          然后添加一個(gè) JMeter dashboard,我們常用的 dashboard 是 Grafana 官方 ID 為 5496 的模板。導(dǎo)入進(jìn)來(lái)后,選擇好對(duì)應(yīng)的數(shù)據(jù)源。

          然后就看到界面了。

          這時(shí)還沒有數(shù)據(jù),我們稍后做個(gè)示例,看下 JMeter 中的數(shù)據(jù)怎么和這個(gè)界面的數(shù)據(jù)對(duì)應(yīng)起來(lái)。我們先看下圖中兩個(gè)重要的數(shù)據(jù)查詢語(yǔ)句吧。

          TPS 曲線:

          SELECT?last("count")?/?$send_interval?FROM?"$measurement_name"?WHERE?("transaction"?=~?/^$transaction$/?AND?"statut"?=?'ok')?AND?$timeFilter?GROUP?BY?time($__interval)

          上面這個(gè)就是 Total TPS 了,在這里稱為 throughput。

          關(guān)于這個(gè)概念,我在第一篇中就已經(jīng)有了說(shuō)明,這里再次提醒,概念的使用在團(tuán)隊(duì)中要有統(tǒng)一的認(rèn)識(shí),不要受行業(yè)內(nèi)一些傳統(tǒng)信息的誤導(dǎo)。

          這里取的數(shù)據(jù)來(lái)自 MEASUREMENTS 中成功狀態(tài)的所有事務(wù)。

          響應(yīng)時(shí)間曲線:

          SELECT?mean("pct95.0")?FROM?"$measurement_name"?WHERE?("application"?=~?/^$application$/)?AND?$timeFilter?GROUP?BY?"transaction",?time($__interval)?fill(null)

          這里是用 95 pct 內(nèi)的響應(yīng)時(shí)間畫出來(lái)的曲線。

          整體展示出來(lái)的效果如下:

          數(shù)據(jù)比對(duì)

          首先,我們?cè)?JMeter 中配置一個(gè)簡(jiǎn)單的場(chǎng)景。10 個(gè)線程,每個(gè)線程迭代 10 次,以及兩個(gè) HTTP 請(qǐng)求。

          也就是說(shuō),這時(shí)會(huì)產(chǎn)生 10x10x2=200 次請(qǐng)求。我們用 JMeter 跑起來(lái)看一下。

          看到了吧,這個(gè)請(qǐng)求數(shù)和我們預(yù)想的一樣。下面我們看一下 Grafana 中展示出來(lái)的結(jié)果。

          還有針對(duì)每個(gè)事務(wù)的統(tǒng)計(jì)情況。

          至此,JMeter 到 Grafana 的展示過程就完成了。以后我們就不用再保存 JMeter 的執(zhí)行結(jié)果了,也不用等著 JMeter 輸出 HTML 了。

          node_exporter+Prometheus+Grafana 的數(shù)據(jù)展示邏輯

          對(duì)性能測(cè)試來(lái)說(shuō),在常用的 Grafana+Prometheus+Exporter 的邏輯中,第一步要看的就是操作系統(tǒng)資源了。所以在這一篇中,我們將以 node_exporter 為例來(lái)說(shuō)明一下操作系統(tǒng)抽取數(shù)據(jù)的邏輯,以便知道監(jiān)控?cái)?shù)據(jù)的來(lái)源,至于數(shù)據(jù)的含義,我們將在后續(xù)的文章中繼續(xù)描述。

          首先,我們還是要畫一個(gè)圖。

          現(xiàn)在 node_exporter 可以支持很多個(gè)操作系統(tǒng)了。官方列表如下:

          當(dāng)然不是說(shuō)只支持這些,你也可以擴(kuò)展自己的 Exporter。

          配置 node_exporter

          node_exporter 目錄如下:

          [root@7dgroup2?node_exporter-0.18.1.linux-amd64]#?ll
          total?16524
          -rw-r--r--?1?3434?3434?11357?Jun?5?00:50?LICENSE
          -rwxr-xr-x?1?3434?3434?16878582?Jun?5?00:41?node_exporter
          -rw-r--r--?1?3434?3434?463?Jun?5?00:50?NOTICE

          啟動(dòng):

          [root@7dgroup2?node_exporter-0.18.1.linux-amd64]#./node_exporter?--web.listen-address=:9200?&

          是不是很簡(jiǎn)潔?如果想看更多的功能 ,可以查看下它的幫助。

          配置 Prometheus

          先下載 Prometheus

          [root@7dgroup2?data]#?wget?-c?https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
          ..........
          100%[=============================================================================================>]?58,625,125?465KB/s?in?6m?4s
          2019-11-29?15:40:16?(157?KB/s)?-?‘prometheus-2.14.0.linux-amd64.tar.gz’?saved?[58625125/58625125]
          [root@7dgroup2?data]

          解壓之后,我們可以看到目錄結(jié)構(gòu)如下:

          [root@7dgroup2?prometheus-2.11.1.linux-amd64]#?ll
          total?120288
          drwxr-xr-x.?2?3434?3434?4096?Jul?10?23:26?console_libraries
          drwxr-xr-x.?2?3434?3434?4096?Jul?10?23:26?consoles
          drwxr-xr-x.?3?root?root?4096?Nov?30?12:55?data
          -rw-r--r--.?1?3434?3434?11357?Jul?10?23:26?LICENSE
          -rw-r--r--.?1?root?root?35?Aug?7?23:19?node.yml
          -rw-r--r--.?1?3434?3434?2770?Jul?10?23:26?NOTICE
          -rwxr-xr-x.?1?3434?3434?76328852?Jul?10?21:53?prometheus
          -rw-r--r--?1?3434?3434?1864?Sep?21?09:36?prometheus.yml
          -rwxr-xr-x.?1?3434?3434?46672881?Jul?10?21:54?promtool
          [root@7dgroup2?prometheus-2.11.1.linux-amd64]#


          再配置一個(gè) node_exporter 的模板,比如我這里選擇了官方模板(ID:11074),展示如下:

          數(shù)據(jù)邏輯說(shuō)明

          說(shuō)明完上面的過程之后,對(duì)我們做性能測(cè)試和分析的人來(lái)說(shuō),最重要的,就是要知道數(shù)據(jù)的來(lái)源和含義了。

          拿上面圖中的 CPU 使用率來(lái)說(shuō)吧(因?yàn)?CPU 使用率是非常重要的一個(gè)計(jì)數(shù)器,所以我們今天先拿它來(lái)開刀)。

          我們先點(diǎn)一下 title 上的 edit,看一下它的 query 語(yǔ)句。

          avg(irate(node_cpu_seconds_total{instance=~"$node",mode="system"}[30m]))?by?(instance)
          avg(irate(node_cpu_seconds_total{instance=~"$node",mode="user"}[30m]))?by?(instance)
          avg(irate(node_cpu_seconds_total{instance=~"$node",mode="iowait"}[30m]))?by?(instance)
          1?-?avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[30m]))?by?(instance)

          這些都是從 Prometheus 中取出來(lái)的數(shù)據(jù),查詢語(yǔ)句讀了 Prometheus 中node_cpu_seconds_total的不同的模塊數(shù)據(jù)。

          下面我們來(lái)看一下,node_exporter暴露出來(lái)的計(jì)數(shù)器。

          這些值和 top 一樣,都來(lái)自于/proc/目錄。下面這張圖是 top 數(shù)據(jù),我們可以比對(duì)一下。

          到此,我們就了解到了操作系統(tǒng)中監(jiān)控?cái)?shù)據(jù)的取值邏輯了,也就是從操作系統(tǒng)本身的計(jì)數(shù)器中取出值來(lái),然后傳給 Prometheus,再由 Grafana 中的 query 語(yǔ)句查出相應(yīng)的數(shù)據(jù),最后由 Grafana 展示在界面上。

          總結(jié)

          為什么要解釋數(shù)據(jù)的邏輯呢?因?yàn)樽罱诠ぷ髦杏龅揭恍┣闆r,有人覺得有了 Prometheus+Grafana+Exportor 這樣的組合工具之后,基本上都不再用手工執(zhí)行什么命令了。但我們要了解的是,對(duì)于監(jiān)控平臺(tái)來(lái)說(shuō),它取的所有的數(shù)據(jù)必然是被監(jiān)控者可以提供的數(shù)據(jù),像 node_exporter 這樣小巧的監(jiān)控收集器,它可以獲取的監(jiān)控?cái)?shù)據(jù),并不是整個(gè)系統(tǒng)全部的性能數(shù)據(jù),只是取到了常見的計(jì)數(shù)器而已。這些計(jì)數(shù)器不管是用命令查看,還是用這樣炫酷的工具查看,它的值本身都不會(huì)變。所以不管是在監(jiān)控平臺(tái)上看到的數(shù)據(jù),還是在命令行中看到的數(shù)據(jù),我們最重要的是要知道含義以及這些值的變化對(duì)性能測(cè)試和分析的下一步驟的影響。

          原文鏈接:www.cnblogs.com/siguadd/p/14878035.html

          推薦閱讀

          新公司要上監(jiān)控,我是這樣考察 Prometheus 的~

          Prometheus + Thanos 多集群架構(gòu)監(jiān)控

          Prometheus 監(jiān)控系統(tǒng),它有多強(qiáng)!

          性能監(jiān)控工具之 Grafana + Prometheus + Exporters

          實(shí)戰(zhàn) Prometheus 搭建監(jiān)控系統(tǒng)

          Docker環(huán)境部署Prometheus+Grafana監(jiān)控系統(tǒng)

          Prometheus 如何做到“活學(xué)活用”,大牛總結(jié)的避坑指南

          深入淺出 Prometheus

          Grafana 中文入門教程 | 構(gòu)建你的第一個(gè)儀表盤

          瀏覽 26
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕操逼 | 天堂五月丁香 | 色婷婷五月天丁香 | 澳门成人无码视频免费播放 | 翔田千里最猛的A片 |