精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實戰(zhàn):如何編寫一個 OpenTelemetry Extensions

開發(fā) 后端
這次我準(zhǔn)備編寫的插件也是和 Metrics 有關(guān)的,因為 Pulsar 的 Java sdk 中并沒有暴露客戶端的一些監(jiān)控指標(biāo),所以我需要在插件中攔截到一些關(guān)鍵函數(shù),然后執(zhí)行暴露出指標(biāo)。

前言

前段時間我們從 SkyWalking 切換到了 OpenTelemetry ,與此同時之前使用 SkyWalking 編寫的插件也得轉(zhuǎn)移到 OpenTelemetry 體系下。

好在 OpenTelemetry 社區(qū)也提供了 Extensions 的擴展開發(fā),我們可以不用去修改社區(qū)發(fā)行版:opentelemetry-javaagent.jar 的源碼也可以擴展其中的能力。

比如可以:

  • 修改一些 trace,某些 span 不想記錄等。
  • 新增 metrics

這次我準(zhǔn)備編寫的插件也是和 metrics 有關(guān)的,因為 pulsar 的 Java sdk 中并沒有暴露客戶端的一些監(jiān)控指標(biāo),所以我需要在插件中攔截到一些關(guān)鍵函數(shù),然后執(zhí)行暴露出指標(biāo)。

截止到本文編寫的時候, Pulsar 社區(qū)也已經(jīng)將 Java-client 集成了 OpenTelemetry,后續(xù)正式發(fā)版后我這個插件也可以光榮退休了。

由于 OpenTelemetry 社區(qū)還處于高速發(fā)展階段,我在中文社區(qū)沒有找到類似的參考文章(甚至英文社區(qū)也沒有,只有一些 example 代碼,或者是只有去社區(qū)成熟插件里去參考代碼)

其中也踩了不少坑,所以覺得非常有必要分享出來幫助大家減少遇到同類問題的機會。

開發(fā)流程

OpenTelemetry extension 的寫法其實和 skywalking 相似,都是用的 bytebuddy這個字節(jié)碼增強庫,只是在一些 API 上有一些區(qū)別。

創(chuàng)建項目

首先需要創(chuàng)建一個 Java 項目,這里我直接參考了官方的示例,使用了 gradle 進(jìn)行管理(理論上 maven 也是可以的,只是要找到在 gradle 使用的 maven 插件)。

這里貼一下簡化版的 build.gradle 文件:

plugins {
    id 'java'
    id "com.github.johnrengelman.shadow" version "8.1.1"
    id "com.diffplug.spotless" version "6.24.0"
}

group = 'com.xx.otel.extensions'
version = '1.0.0'

ext {
    versions = [
            // this line is managed by .github/scripts/update-sdk-version.sh
            opentelemetrySdk           : "1.34.1",

            // these lines are managed by .github/scripts/update-version.sh
            opentelemetryJavaagent     : "2.1.0-SNAPSHOT",
            opentelemetryJavaagentAlpha: "2.1.0-alpha-SNAPSHOT",

            junit                      : "5.10.1"
    ]

    deps = [
    // 自動生成服務(wù)發(fā)現(xiàn) service 文件
            autoservice: dependencies.create(group: 'com.google.auto.service', name: 'auto-service', version: '1.1.1')
    ]
}

repositories {
    mavenLocal()
    maven { url "https://maven.aliyun.com/repository/public" }
    mavenCentral()
}

configurations {
    otel
}


dependencies {

    implementation(platform("io.opentelemetry:opentelemetry-bom:${versions.opentelemetrySdk}"))

    /*
    Interfaces and SPIs that we implement. We use `compileOnly` dependency because during
    runtime all necessary classes are provided by javaagent itself.
     */
    compileOnly 'io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.34.1'
    compileOnly 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.32.0'
    compileOnly 'io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:1.32.0-alpha'

    //Provides @AutoService annotation that makes registration of our SPI implementations much easier
    compileOnly deps.autoservice
    annotationProcessor deps.autoservice

    // https://mvnrepository.com/artifact/org.apache.pulsar/pulsar-client
    compileOnly 'org.apache.pulsar:pulsar-client:2.8.0'

}

test {
    useJUnitPlatform()
}

然后便是要創(chuàng)建  javaagent 的一個核心類:

@AutoService(InstrumentationModule.class)  
public class PulsarInstrumentationModule extends InstrumentationModule {
    public PulsarInstrumentationModule() {
        super("pulsar-client-metrics", "pulsar-client-metrics-2.8.0");
    } 
}

在這個類中定義我們插件的名稱,同時使用 @AutoService 注解可以在打包的時候幫我們在 META-INF/services/目錄下生成 SPI 服務(wù)發(fā)現(xiàn)的文件:

這是一個 Google 的插件,本質(zhì)是插件是使用 SPI 的方式進(jìn)行開發(fā)的。

關(guān)于 SPI 以前也寫過一篇文章,不熟的朋友可以用作參考:

  • Java SPI 的原理與應(yīng)用

創(chuàng)建 Instrumentation

之后就需要創(chuàng)建自己的 Instrumentation,這里可以把它理解為自己的攔截器,需要配置對哪個類的哪個函數(shù)進(jìn)行攔截:

public class ProducerCreateImplInstrumentation implements TypeInstrumentation {

    @Override
    public ElementMatcher<TypeDescription> typeMatcher() {
        return named("org.apache.pulsar.client.impl.ProducerBuilderImpl");
    }
    @Override
    public void transform(TypeTransformer transformer) {
        transformer.applyAdviceToMethod(
                isMethod()
                        .and(named("createAsync")),
                ProducerCreateImplInstrumentation.class.getName() + "$ProducerCreateImplConstructorAdvice");
    }

比如這就是對 ProducerBuilderImpl 類的 createAsync 創(chuàng)建函數(shù)進(jìn)行攔截,攔截之后的邏輯寫在了 ProducerCreateImplConstructorAdvice 類中。

值得注意的是對一些繼承和實現(xiàn)類的攔截方式是不相同的:

@Override  
public ElementMatcher<TypeDescription> typeMatcher() {  
    return extendsClass(named(ENHANCE_CLASS));  
    // return implementsInterface(named(ENHANCE_CLASS));
}

從這兩個函數(shù)名稱就能看出,分別是針對繼承和實現(xiàn)類進(jìn)行攔截的。

這里的 API 比 SkyWalking 的更易讀一些。

之后需要把我們自定義的 Instrumentation 注冊到剛才的 PulsarInstrumentationModule 類中:

@Override
    public List<TypeInstrumentation> typeInstrumentations() {
        return Arrays.asList(
                new ProducerCreateImplInstrumentation(),
                new ProducerCloseImplInstrumentation(),
                );
    }

有多個的話也都得進(jìn)行注冊。

編寫切面代碼

之后便是編寫我們自定義的切面邏輯了,也就是剛才自定義的 ProducerCreateImplConstructorAdvice 類:

public static class ProducerCreateImplConstructorAdvice {

        @Advice.OnMethodEnter(suppress = Throwable.class)
        public static void onEnter() {
            // inert your code
            MetricsRegistration.registerProducer();
        }

        @Advice.OnMethodExit(suppress = Throwable.class)
        public static void after(
                @Advice.Return CompletableFuture<Producer> completableFuture) {
            try {
                Producer producer = completableFuture.get();
                CollectionHelper.PRODUCER_COLLECTION.addObject(producer);
            } catch (Throwable e) {
                System.err.println(e.getMessage());
            }
        }
    }

可以看得出來其實就是兩個核心的注解:

  • @Advice.OnMethodEnter 切面函數(shù)調(diào)用之前
  • @Advice.OnMethodExit 切面函數(shù)調(diào)用之后

還可以在 @Advice.OnMethodExit的函數(shù)中使用 @Advice.Return獲得函數(shù)調(diào)用的返回值。

當(dāng)然也可以使用 @Advice.This 來獲取切面的調(diào)用對象。

編寫自定義 metrics

因為我這個插件的主要目的是暴露一些自定義的 metrics,所以需要使用到 io.opentelemetry.api.metrics 這個包:

這里以 Producer 生產(chǎn)者為例,整體流程如下:

  • 創(chuàng)建生產(chǎn)者的時候?qū)⑸a(chǎn)者對象存儲起來
  • OpenTelemetry 框架會每隔一段時間回調(diào)一個自定義的函數(shù)
  • 在這個函數(shù)中遍歷所有的 producer 獲取它的監(jiān)控指標(biāo),然后暴露出去。

注冊函數(shù):

public static void registerObservers() {  
    Meter meter = MetricsRegistration.getMeter();  
  
    meter.gaugeBuilder("pulsar_producer_num_msg_send")  
            .setDescription("The number of messages published in the last interval")  
            .ofLongs()  
            .buildWithCallback(  
                    r -> recordProducerMetrics(r, ProducerStats::getNumMsgsSent));

private static void recordProducerMetrics(ObservableLongMeasurement observableLongMeasurement, Function<ProducerStats, Long> getter) {  
    for (Producer producer : CollectionHelper.PRODUCER_COLLECTION.list()) {  
        ProducerStats stats = producer.getStats();  
        String topic = producer.getTopic();  
        if (topic.endsWith(RetryMessageUtil.RETRY_GROUP_TOPIC_SUFFIX)) {  
            continue;  
        }        observableLongMeasurement.record(getter.apply(stats),  
                Attributes.of(PRODUCER_NAME, producer.getProducerName(), TOPIC, topic));  
    }}

回調(diào)函數(shù),在這個函數(shù)中遍歷所有的生產(chǎn)者,然后讀取它的監(jiān)控指標(biāo)。

這樣就完成了一個自定義指標(biāo)的暴露,使用的時候只需要加載這個插件即可:

java -javaagent:opentelemetry-javaagent.jar \
     -Dotel.javaagent.extensinotallow=ext.jar
     -jar myapp.jar

-Dotel.javaagent.extensinotallow=/extensions當(dāng)然也可以指定一個目錄,該目錄下所有的 jar 都會被作為 extensions 被加入進(jìn)來。

打包

使用 ./gradlew build 打包,之后可以在build/libs/目錄下找到生成物。

當(dāng)然也可以將 extension 直接打包到 opentelemetry-javaagent.jar中,這樣就可以不用指定 -Dotel.javaagent.extensions參數(shù)了。

具體可以在 gradle 中加入以下 task:

task extendedAgent(type: Jar) {
  dependsOn(configurations.otel)
  archiveFileName = "opentelemetry-javaagent.jar"
  from zipTree(configurations.otel.singleFile)
  from(tasks.shadowJar.archiveFile) {
    into "extensions"
  }
  //Preserve MANIFEST.MF file from the upstream javaagent
  doFirst {
    manifest.from(
      zipTree(configurations.otel.singleFile).matching {
        include 'META-INF/MANIFEST.MF'
      }.singleFile
    )
  }
}

具體可以參考這里的配置:https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/examples/extension/build.gradle#L125

踩坑

看起來這個開發(fā)過程挺簡單的,但其中的坑還是不少。

NoClassDefFoundError

首先第一個就是我在調(diào)試過程中出現(xiàn) NoClassDefFoundError 的異常。

但我把打包好的 extension 解壓后明明是可以看到這個類的。

排查一段時間后沒啥頭緒,我就從頭仔細(xì)閱讀了開發(fā)文檔:

發(fā)現(xiàn)我們需要重寫 getAdditionalHelperClassNames函數(shù),用于將我們外部的一些工具類加入到應(yīng)用的 class loader 中,不然在應(yīng)用在運行的時候就會報 NoClassDefFoundError 的錯誤。

因為是字節(jié)碼增強的關(guān)系,所以很多日常開發(fā)覺得很常見的地方都不行了,比如:

  • 如果切面類是一個內(nèi)部類的時候,必須使用靜態(tài)函數(shù)。
  • 只能包含靜態(tài)函數(shù)。
  • 不能包含任何字段,常量。
  • 不能使用任何外部類,如果要使用就得使用 getAdditionalHelperClassNames 額外加入到 class loader 中(這一條就是我遇到的問題)。
  • 所有的函數(shù)必須使用 @Advice 注解。

以上的內(nèi)容其實在文檔中都有寫:

所以還是得仔細(xì)閱讀文檔。

缺少異常日志

其實上述的異常剛開始都沒有打印出來,只有一個現(xiàn)象就是程序沒有正常運行。

因為沒有日志也不知道如何排查,也懷疑是不是運行過程中報錯了,所以就嘗試把@Advice 注解的函數(shù)全部 try catch ,果然打印了上述的異常日志。

之后我注意到了注解的這個參數(shù),原來在默認(rèn)情況下是不會打印任何日志的,需要手動打開。

比如這樣:@Advice.OnMethodExit(suppress = Throwable.class)

調(diào)試日志

最后就是調(diào)試功能了,因為我這個插件的是把指標(biāo)發(fā)送到 OpenTelemetry-collector ,再由它發(fā)往 VictoriaMetrics/Prometheus;由于整個鏈路比較長,我想看到最終生成的指標(biāo)是否正常的干擾條件太多了。

好在 OpenTelemetry 提供了多種 metrics.exporter 的輸出方式:

  • -Dotel.metrics.exporter=otlp (default),默認(rèn)通過 otlp 協(xié)議輸出到 collector 中。
  • -Dotel.metrics.exporter=logging,以 stdout 的方式輸出到控制臺,主要用于調(diào)試
  • -Dotel.metrics.exporter=logging-otlp
  • -Dotel.metrics.exporter=prometheus,以 Prometheus 的方式輸出,還可以配置端口,這樣也可以讓 Prometheus 進(jìn)行遠(yuǎn)程采集,同樣的也可以在本地調(diào)試。

采用哪種方式可以根據(jù)環(huán)境情況自行選擇。

Opentelemetry-operator 配置 extension

最近在使用 opentelemetry-operator注入 agent 的時候發(fā)現(xiàn) operator 目前并不支持配置 extension,所以在社區(qū)也提交了一個草案,下周會嘗試提交一個 PR 來新增這個特性。

這個需求我在 issue 列表中找到了好幾個,時間也挺久遠(yuǎn)了,不太確定為什么社區(qū)還為實現(xiàn)。

目前 operator 只支持在自定義鏡像中配置 javaagent.jar,無法配置 extension:

這個原理在之前的文章中有提到。

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: my-instrumentation
spec:
  java:
    image: your-customized-auto-instrumentation-image:java

我的目的是可以在自定義鏡像中把 extension 也復(fù)制進(jìn)去,類似于這樣:

FROM busybox

ADD open-telemetry/opentelemetry-javaagent.jar /javaagent.jar

# Copy extensions to specify a path.
ADD open-telemetry/ext-1.0.0.jar /ext-1.0.0.jar

RUN chmod -R go+r /javaagent.jar
RUN chmod -R go+r /ext-1.0.0.jar

然后在 CRD 中配置這個 extension 的路徑:

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: my-instrumentation
spec:
  java:
    image: custom-image:1.0.0
    extensions: /ext-1.0.0.jar
    env:
    # If extension.jar already exists in the container, you can only specify a specific path with this environment variable.
      - name: OTEL_EXTENSIONS_DIR
        value: /custom-dir

這樣 operator 在拿到 extension 的路徑時,就可以在環(huán)境變量中加入 -Dotel.javaagent.extensinotallow=${java.extensions} 參數(shù),從而實現(xiàn)自定義 extension 的目的。

總結(jié)

整個過程其實并不復(fù)雜,只是由于目前用的人還不算多,所以也很少有人寫教程或者文章,相信用不了多久就會慢慢普及。

這里有一些官方的 example可以參考。

參考鏈接:

  • https://github.com/apache/pulsar/pull/22178。
  • https://opentelemetry.io/docs/languages/java/automatic/extensions/。
  • https://github.com/open-telemetry/opentelemetry-java-。instrumentation/tree/main/examples/extension#extensions-examples。
  • https://github.com/open-telemetry/opentelemetry-operator/issues/1758#issuecomment-1982159356。
責(zé)任編輯:姜華 來源: crossoverJie
相關(guān)推薦

2023-12-12 08:08:17

插件PRPulsar

2016-01-06 09:57:23

編寫PHP擴展

2015-08-19 09:29:35

Git協(xié)議編寫

2024-04-08 08:09:10

埋點收集數(shù)據(jù)StartRocks數(shù)據(jù)存儲

2017-01-12 22:36:30

2020-01-11 17:00:07

DjangoPythonWeb API

2021-07-06 14:36:05

RustLinux內(nèi)核模塊

2009-04-03 15:21:37

2017-12-27 09:49:35

HTTP服務(wù)器反向

2024-09-04 08:09:51

2024-08-12 08:33:05

2013-09-10 09:54:50

2021-04-07 13:38:27

Django項目視圖

2021-04-13 06:35:13

Elixir語言編程語言軟件開發(fā)

2020-10-12 10:58:15

IDEA插件監(jiān)聽

2023-12-11 08:16:51

工具命令行參數(shù)

2024-07-03 08:36:14

序列化算法設(shè)計模式

2018-12-18 12:12:51

Python服務(wù)器Django

2024-08-28 08:09:13

contextmetrics類型

2021-01-01 19:30:21

Python編程語言
點贊
收藏

51CTO技術(shù)棧公眾號

免费动漫网站在线观看| 成人公开免费视频| 97人人澡人人爽91综合色| 亚洲亚洲精品在线观看| 欧美另类高清视频在线| 一级爱爱免费视频| 亚洲精品字幕| 日韩亚洲精品电影| 波多野结衣视频播放| 成人午夜sm精品久久久久久久| 亚洲日本在线视频观看| 欧美精品免费观看二区| 国产精品美女一区| 亚洲免费中文| 九九精品在线观看| 国产综合精品久久久久成人av| 老司机亚洲精品一区二区| 欧美午夜丰满在线18影院| gogogo免费高清日本写真| 三级视频在线| 成人三级伦理片| 国产欧美日韩高清| 岛国av中文字幕| 黄色欧美成人| 久久久精品久久| 久久精品—区二区三区舞蹈| 成人h动漫免费观看网站| 精品视频在线免费看| 欧美 日韩 国产 高清| 国产网友自拍视频导航网站在线观看| 91丨九色丨蝌蚪富婆spa| 亚洲一区亚洲二区| 在线观看免费高清视频| 天使萌一区二区三区免费观看| 欧美国产日韩一区二区| 四虎地址8848| 日韩精品一区二区三区免费观看| 亚洲国产精品人人爽夜夜爽| 特种兵之深入敌后| av在线亚洲一区| 欧美日韩三级在线| 日本成人在线免费视频| 僵尸再翻生在线观看| 一区二区三区波多野结衣在线观看| 亚洲国产精品综合| jizzjizz在线观看| 国产亚洲精品bt天堂精选| 久久精品人成| 日韩福利一区二区| 2014亚洲片线观看视频免费| 久久精品女人的天堂av| 午夜av免费在线观看| 不卡视频免费播放| 国产一区二区高清不卡| 男人天堂手机在线观看| 成人午夜av电影| 国产欧美日韩综合一区在线观看| 精品久久国产视频| 高清日韩电视剧大全免费| 91丝袜脚交足在线播放| 亚洲黄色在线免费观看| 国产91精品精华液一区二区三区 | 中文字幕av网站| 日韩激情av在线| 国产精品久久97| 11024精品一区二区三区日韩| 免费精品99久久国产综合精品| 国产精品电影一区| 中文字幕在线播出| 国产综合色精品一区二区三区| 91久久久久久久久久| 国产特级aaaaaa大片| 国产黄人亚洲片| 国产一区二区久久久| 天堂av在线免费观看| 久久精品一区八戒影视| 偷拍视频一区二区| 麻豆tv入口在线看| 亚洲一区免费视频| 中文字幕日本最新乱码视频| 日韩三区免费| 欧美一区二区免费视频| 成人区人妻精品一区二| 色综合中文网| 久久人人爽人人爽人人片亚洲 | 国产精品xvideos88| 久久露脸国产精品| 波多野结衣在线观看视频| 久久99精品国产麻豆婷婷洗澡| 91久久久久久国产精品| 凸凹人妻人人澡人人添| 欧美国产激情一区二区三区蜜月| 中文字幕第一页亚洲| 岛国在线视频网站| 欧美日韩亚洲综合在线| 黄色在线免费播放| 欧美丝袜丝交足nylons172| 久久中文字幕在线| 一级片中文字幕| 精品一区二区av| 久久久久无码国产精品一区| 日本电影在线观看网站| 天天亚洲美女在线视频| 五月天中文字幕在线| 欧美韩一区二区| 久久精品国产一区二区三区| 国产一级精品视频| 国产一区二区三区蝌蚪| 蜜桃欧美视频| 日韩精品卡一| 欧美日韩国产区一| 老牛影视av老牛影视av| 欧美日韩国产在线一区| 国产精品盗摄久久久| 国产aⅴ爽av久久久久成人| 国产日产欧美一区| 一卡二卡三卡视频| 亚洲精品自拍| 亚洲天堂第二页| 中文字幕日韩一级| 国产一区二区三区免费看| 色播亚洲婷婷| 中文字幕21页在线看| 亚洲第一精品夜夜躁人人爽| 欧美色视频一区二区三区在线观看| 亚洲欧美激情诱惑| 精品高清视频| av人人综合网| 日韩欧美另类在线| 国产这里有精品| 精品一区二区国语对白| 色之综合天天综合色天天棕色| 末成年女av片一区二区下载| 欧美精品一区二区久久久| 欧美 日韩 国产 一区二区三区| 日韩精彩视频在线观看| 欧美精品欧美精品| 成人美女黄网站| 日韩精品中文字幕在线播放| 亚州国产精品视频| 波多野结衣中文一区| 91黄色在线看| 我要色综合中文字幕| 久久不射热爱视频精品| 国产尤物视频在线观看| 中文字幕一区二区在线观看| 最新中文字幕2018| 人人狠狠综合久久亚洲婷| 热99精品里视频精品| 亚洲人视频在线观看| 狠狠色狠狠色综合日日小说| 好吊一区二区三区视频| 性伦欧美刺激片在线观看| 蜜桃麻豆91| 亚洲精品粉嫩美女一区| 中文字幕一区电影| 又色又爽又黄无遮挡的免费视频| 中文字幕欧美日本乱码一线二线| 日本中文字幕高清| 四虎8848精品成人免费网站| 国产视频观看一区| av网站在线免费观看| 在线观看日产精品| 亚洲aaa视频| 国产一区二区三区在线观看免费| 日本福利视频网站| 91夜夜蜜桃臀一区二区三区| 国内精品中文字幕| 欧洲视频在线免费观看| 欧美综合亚洲图片综合区| 影音先锋男人看片资源| 国产一区二区三区香蕉 | 国产美女情趣调教h一区二区| 亚洲成av人影院在线观看| 91porny在线| 国产精品久久久久久久久快鸭| 亚洲天堂网2018| 伊人久久成人| 日韩影视精品| 日韩精品亚洲专区在线观看| 97在线看免费观看视频在线观看| 精品99又大又爽又硬少妇毛片| 欧美日韩亚洲国产综合| 久久精品国产亚洲AV无码麻豆 | 日韩欧美国产精品| 国产一级18片视频| 国产精品久久久久久久浪潮网站 | 一本色道69色精品综合久久| 18性欧美xxxⅹ性满足| 中文字幕在线观看日本| 日韩欧美亚洲一区二区| 国产一区二区视频免费| 亚洲视频图片小说| 97人妻精品一区二区三区免| 黄色资源网久久资源365| 日韩亚洲欧美视频| 久久一区二区三区电影| 含羞草久久爱69一区| 免费视频观看成人| 91av在线看| 草莓福利社区在线| 亚洲午夜色婷婷在线| 国产成人精品毛片| 91久久精品国产91性色tv| 久久久国产成人| 国产精品久久久久永久免费观看| 在线免费看黄色片| 国产毛片一区二区| 欧美特级aaa| 国产精品毛片| 国产高清不卡无码视频| 欧美人妖在线| 国内精品久久国产| 欧一区二区三区| 国产剧情久久久久久| 日本在线啊啊| 欧美精品电影在线| 久操视频在线观看| 国产亚洲人成a一在线v站| 蜜桃视频在线观看www| 欧美一区欧美二区| 91中文字幕在线视频| 一本久久精品一区二区| 特一级黄色大片| 亚洲成a人片在线不卡一二三区 | 天天综合色天天综合色h| 国产乱国产乱老熟300| 中文字幕制服丝袜一区二区三区| 一区二区精品免费| 久久一区二区三区国产精品| 国产chinese中国hdxxxx| 国产jizzjizz一区二区| 一级黄色免费毛片| 国产精品中文有码| 人妻体体内射精一区二区| 狠狠色2019综合网| 91小视频在线播放| 激情综合网av| 亚洲男人天堂av在线| 美日韩一区二区三区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 亚欧成人精品| 欧美亚洲日本在线观看| 久久激情一区| 欧美 国产 小说 另类| 男女精品视频| 久久久久狠狠高潮亚洲精品| 亚洲欧美成人综合| 成人免费视频久久| 日韩成人免费电影| 亚洲美女性囗交| 国产自产视频一区二区三区| 91性高潮久久久久久久| 国产成人精品aa毛片| 97中文字幕在线观看| kk眼镜猥琐国模调教系列一区二区| 久久久久久婷婷| 99re这里只有精品6| 国产三级视频网站| 国产视频在线观看一区二区三区 | 色综合久久久无码中文字幕波多| 国产酒店精品激情| 久草视频福利在线| 26uuu国产日韩综合| 一色道久久88加勒比一| 一区在线播放视频| 激情小说中文字幕| 欧美日韩国产在线看| 九九热最新视频| 4438x亚洲最大成人网| 亚洲精品久久久久avwww潮水| 亚洲精品久久久久久久久久久久 | 国产精品99久久免费黑人人妻| 日韩国产精品久久久久久亚洲| 亚洲精品成人在线播放| 成人黄色国产精品网站大全在线免费观看 | 精品小视频在线观看| 高跟丝袜欧美一区| 中文字幕一区二区三区四区免费看| 欧美精品免费视频| 色综合久久久久久| 这里只有精品在线观看| 色呦呦在线免费观看| 欧美专区在线观看| 99综合久久| 久久久综合香蕉尹人综合网| 欧美激情欧美| av之家在线观看| 麻豆精品在线观看| 亚洲一区二区三区黄色| 中文字幕免费不卡| 精品视频一区二区在线观看| 91官网在线观看| 亚洲精品一区二区三区新线路 | 国产三级精品在线不卡| 欧美中文字幕一区二区| 日韩精品在线中文字幕| 美女视频黄免费的久久| 伊人网综合视频| 一区精品在线播放| 欧美a视频在线观看| 日韩美一区二区三区| 成人高清免费在线播放| 久久久久久久久电影| 日韩黄色三级| 欧美久久久久久一卡四| 亚洲激情在线| 亚洲第一狼人区| 2024国产精品| 久久久久无码国产精品| 欧美日韩一区二区三区四区 | 中文字幕乱码久久午夜不卡| 国产乡下妇女做爰毛片| 欧美日韩在线播放一区| 色综合成人av| 午夜精品久久久久久久久久久久| 亚洲国产91视频| 五月婷婷综合色| 国产精品夜夜夜| 蜜臀视频在线观看| 亚洲美女一区二区三区| 中文字幕在线播放av| 亚洲区免费影片| 秋霞伦理一区| 精品国产乱码久久久久久郑州公司| 亚洲一区二区三区| 中文字幕资源在线观看| 国产精品午夜久久| 无码人妻丰满熟妇区bbbbxxxx| 亚洲精品v天堂中文字幕| av有码在线观看| 国产欧美综合精品一区二区| 欧美搞黄网站| 亚洲视频在线不卡| |精品福利一区二区三区| 亚洲无码精品在线播放| 在线亚洲男人天堂| 电影亚洲一区| 先锋影音一区二区三区| 日韩av不卡在线观看| 少妇av片在线观看| 欧美综合视频在线观看| 成人在线免费公开观看视频| 国产成人在线一区| 成人一区而且| 一级做a免费视频| 亚洲视频网在线直播| 国产人妻精品一区二区三区| 超薄丝袜一区二区| 日本免费一区二区三区视频| 亚洲欧美日韩不卡| 国产精品香蕉一区二区三区| 印度午夜性春猛xxx交| 日韩午夜在线影院| 日本aa在线| 九9re精品视频在线观看re6| 国产精品久久国产愉拍| av电影网站在线观看| 欧美日韩免费观看一区二区三区 | 亚洲综合男人的天堂| 图片区 小说区 区 亚洲五月| 欧美一级大片在线观看| 欧美精品一区二区久久| 中文字幕第88页| 亚洲精品成人在线| 日韩在线一区二区三区四区| 欧亚精品在线观看| 色综合五月天| 麻豆精品国产传媒| 亚洲成av人影院| 国产一区二区三区福利| 成人免费观看网址| 亚洲天堂偷拍| 久久久久久国产精品无码| 在线观看日韩精品| a天堂中文在线官网在线| 国产日韩欧美一区二区三区四区| 久久精品午夜| 翔田千里88av中文字幕| 亚洲国产美女精品久久久久∴| 成人午夜精品| 久久综合亚洲精品| 久久伊人蜜桃av一区二区| 亚洲图片欧美在线| 国内成人精品视频| 欧美日韩久久精品| 制服丝袜中文字幕第一页| 亚洲第一在线综合网站| 成人在线免费公开观看视频| 99在线视频免费观看| 日韩和欧美一区二区| 久久久久久久9999| 国产亚洲成av人片在线观看桃| 成人国产精品久久| 男人亚洲天堂网| 一区二区视频免费在线观看| 可以直接在线观看的av| 成人av资源| 久久精品国产亚洲高清剧情介绍| 久久精品国产av一区二区三区|