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

OpenTelemetry 實戰:gRPC 監控的實現原理

開發 前端
具體埋點過程中 OpenTelemetry 提供了許多解耦的 API,方便我們實現埋點所需要的業務邏輯,也會在后續的文章繼續分析 OpenTelemetry 的一些設計原理和核心 API 的使用。

前言

圖片圖片

最近在給 opentelemetry-java-instrumentation 提交了一個 PR,是關于給 gRPC 新增四個 metrics:

  • rpc.client.request.size: 客戶端請求包大小
  • rpc.client.response.size:客戶端收到的響應包大小
  • rpc.server.request.size:服務端收到的請求包大小
  • rpc.server.response.size:服務端響應的請求包大小

這個 PR 的主要目的就是能夠在指標監控中拿到 RPC 請求的包大小,而這里的關鍵就是如何才能拿到這些包的大小。

首先支持的是 gRPC(目前在云原生領域使用的最多),其余的 RPC 理論上也是可以支持的:

圖片圖片

在實現的過程中我也比較好奇 OpenTelemetry 框架是如何給 gRPC 請求創建 span 調用鏈的,如下圖所示:

圖片圖片

圖片圖片

這是一個 gRPC 遠程調用,java-demo 是 gRPC 的客戶端,k8s-combat 是 gRPC 的服務端

在開始之前我們可以根據 OpenTelemetry 的運行原理大概猜測下它的實現過程。

首先我們應用可以創建這些鏈路信息的前提是:使用了 OpenTelemetry 提供的 javaagent,這個 agent 的原理是在運行時使用了 byte-buddy 增強了我們應用的字節碼,在這些字節碼中代理業務邏輯,從而可以在不影響業務的前提下增強我們的代碼(只要就是創建 span、metrics 等數據)

Spring 的一些代理邏輯也是這樣實現的

gRPC 增強原理

而在工程實現上,我們最好是不能對業務代碼進行增強,而是要找到這些框架提供的擴展接口。

拿 gRPC 來說,我們可以使用它所提供的 io.grpc.ClientInterceptor 和 io.grpc.ServerInterceptor 接口來增強代碼。

打開 io.opentelemetry.instrumentation.grpc.v1_6.TracingClientInterceptor 類我們可以看到它就是實現了 io.grpc.ClientInterceptor:

圖片圖片

而其中最關鍵的就是要實現 io.grpc.ClientInterceptor#interceptCall 函數:

@Override  
public <REQUEST, RESPONSE> ClientCall<REQUEST, RESPONSE> interceptCall(  
    MethodDescriptor<REQUEST, RESPONSE> method, CallOptions callOptions, Channel next) {  
  GrpcRequest request = new GrpcRequest(method, null, null, next.authority());  
  Context parentContext = Context.current();  
  if (!instrumenter.shouldStart(parentContext, request)) {  
    return next.newCall(method, callOptions);  
  }  
  Context context = instrumenter.start(parentContext, request);  
  ClientCall<REQUEST, RESPONSE> result;  
  try (Scope ignored = context.makeCurrent()) {  
    try {  
      // call other interceptors  
      result = next.newCall(method, callOptions);  
    } catch (Throwable e) {  
      instrumenter.end(context, request, Status.UNKNOWN, e);  
      throw e;  
    }  }  
  return new TracingClientCall<>(result, parentContext, context, request);  
}

這個接口是 gRPC 提供的攔截器接口,對于 gRPC 客戶端來說就是在發起真正的網絡調用前后會執行的方法。

所以在這個接口中我們就可以實現創建 span 獲取包大小等邏輯。

使用 byte-buddy 增強代碼

不過有一個問題是我們實現的 io.grpc.ClientInterceptor 類需要加入到攔截器中才可以使用:

var managedChannel = ManagedChannelBuilder.forAddress(host, port) .intercept(new TracingClientInterceptor()) // 加入攔截器
.usePlaintext()
.build();

但在 javaagent 中是沒法給業務代碼中加上這樣的代碼的。

此時就需要 byte-buddy 登場了,它可以動態修改字節碼從而實現類似于修改源碼的效果。

在 io.opentelemetry.javaagent.instrumentation.grpc.v1_6.GrpcClientBuilderBuildInstr umentation  類里可以看到 OpenTelemetry 是如何使用 byte-buddy 的。

@Override
  public ElementMatcher<TypeDescription> typeMatcher() {
    return extendsClass(named("io.grpc.ManagedChannelBuilder"))
        .and(declaresField(named("interceptors")));
  }

  @Override
  public void transform(TypeTransformer transformer) {
    transformer.applyAdviceToMethod(
        isMethod().and(named("build")),
        GrpcClientBuilderBuildInstrumentation.class.getName() + "$AddInterceptorAdvice");
  }

  @SuppressWarnings("unused")
  public static class AddInterceptorAdvice {

    @Advice.OnMethodEnter(suppress = Throwable.class)
    public static void addInterceptor(
        @Advice.This ManagedChannelBuilder<?> builder,
        @Advice.FieldValue("interceptors") List<ClientInterceptor> interceptors) {
      VirtualField<ManagedChannelBuilder<?>, Boolean> instrumented =
          VirtualField.find(ManagedChannelBuilder.class, Boolean.class);
      if (!Boolean.TRUE.equals(instrumented.get(builder))) {
        interceptors.add(0, GrpcSingletons.CLIENT_INTERCEPTOR);
        instrumented.set(builder, true);
      }
    }
  }

從這里的源碼可以看出,使用了 byte-buddy 攔截了 io.grpc.ManagedChannelBuilder#intercept(java.util.List<io.grpc.ClientInterceptor>) 函數。

io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers#extendsClass/ isMethod 等函數都是 byte-buddy 庫提供的函數。

而這個函數正好就是我們需要在業務代碼里加入攔截器的地方。

interceptors.add(0, GrpcSingletons.CLIENT_INTERCEPTOR);
GrpcSingletons.CLIENT_INTERCEPTOR = new TracingClientInterceptor(clientInstrumenter, propagators);

通過這行代碼可以手動將 OpenTelemetry 里的 TracingClientInterceptor 加入到攔截器列表中,并且作為第一個攔截器。

而這里的:

extendsClass(named("io.grpc.ManagedChannelBuilder"))
        .and(declaresField(named("interceptors")))

通過函數的名稱也可以看出是為了找到 繼承了io.grpc.ManagedChannelBuilder 類中存在成員變量 interceptors 的類。

transformer.applyAdviceToMethod(  
    isMethod().and(named("build")),  
    GrpcClientBuilderBuildInstrumentation.class.getName() + "$AddInterceptorAdvice");

然后在調用 build 函數后就會進入自定義的 AddInterceptorAdvice 類,從而就可以攔截到添加攔截器的邏輯,然后把自定義的攔截器加入其中。

獲取 span 的 attribute

圖片圖片

我們在 gRPC 的鏈路中還可以看到這個請求的具體屬性,比如:

  • gRPC 服務提供的 IP 端口。
  • 請求的響應碼
  • 請求的 service 和 method
  • 線程等信息。

這些信息在問題排查過程中都是至關重要的。

可以看到這里新的 attribute 主要是分為了三類:

  • net.* 是網絡相關的屬性
  • rpc.* 是和 grpc 相關的屬性
  • thread.* 是線程相關的屬性

所以理論上我們在設計 API 時最好可以將這些不同分組的屬性解耦開,如果是 MQ 相關的可能還有一些 topic 等數據,所以各個屬性之間是互不影響的。

帶著這個思路我們來看看 gRPC 這里是如何實現的。

clientInstrumenterBuilder
 .setSpanStatusExtractor(GrpcSpanStatusExtractor.CLIENT)
 .addAttributesExtractors(additionalExtractors)
        .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
        .addAttributesExtractor(ServerAttributesExtractor.create(netClientAttributesGetter))
        .addAttributesExtractor(NetworkAttributesExtractor.create(netClientAttributesGetter))

OpenTelemetry 會提供一個 io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder#addAttributesExtractor構建器函數,用于存放自定義的屬性解析器。

從這里的源碼可以看出分別傳入了網絡相關、RPC 相關的解析器;正好也就對應了圖中的那些屬性,也滿足了我們剛才提到的解耦特性。

而每一個自定義屬性解析器都需要實現接口 io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor

public interface AttributesExtractor<REQUEST, RESPONSE> {
}

這里我們以 GrpcRpcAttributesGetter 為例。

enum GrpcRpcAttributesGetter implements RpcAttributesGetter<GrpcRequest> {
  INSTANCE;

  @Override
  public String getSystem(GrpcRequest request) {
    return "grpc";
  }

  @Override
  @Nullable
  public String getService(GrpcRequest request) {
    String fullMethodName = request.getMethod().getFullMethodName();
    int slashIndex = fullMethodName.lastIndexOf('/');
    if (slashIndex == -1) {
      return null;
    }
    return fullMethodName.substring(0, slashIndex);
  }

可以看到 system 是寫死的 grpc,也就是對于到頁面上的 rpc.system 屬性。

而這里的 getService 函數則是拿來獲取 rpc.service 屬性的,可以看到它是通過 gRPC 的method 信息來獲取 service 的。


public interface RpcAttributesGetter<REQUEST> {  
  
  @Nullable  
  String getService(REQUEST request);
}

而這里 REQUEST 其實是一個泛型,在 gRPC 里是 GrpcRequest,在其他 RPC 里這是對應的 RPC 的數據。

這個 GrpcRequest 是在我們自定義的攔截器中創建并傳遞的。圖片

而我這里需要的請求包大小也是在攔截中獲取到數據然后寫入進 GrpcRequest。

圖片圖片

static <T> Long getBodySize(T message) {  
  if (message instanceof MessageLite) {  
    return (long) ((MessageLite) message).getSerializedSize();  
  } else {  
    // Message is not a protobuf message  
    return null;  
  }}

這樣就可以實現不同的 RPC 中獲取自己的 attribute,同時每一組 attribute 也都是隔離的,互相解耦。

自定義 metrics

每個插件自定義 Metrics 的邏輯也是類似的,需要由框架層面提供 API 接口:

public InstrumenterBuilder<REQUEST, RESPONSE> addOperationMetrics(OperationMetrics factory) {  
  operationMetrics.add(requireNonNull(factory, "operationMetrics"));  
  return this;  
}
// 客戶端的 metrics
.addOperationMetrics(RpcClientMetrics.get());

// 服務端的 metrics
.addOperationMetrics(RpcServerMetrics.get());

之后也會在框架層面回調這些自定義的 OperationMetrics:

if (operationListeners.length != 0) {
      // operation listeners run after span start, so that they have access to the current span
      // for capturing exemplars
      long startNanos = getNanos(startTime);
      for (int i = 0; i < operationListeners.length; i++) {
        context = operationListeners[i].onStart(context, attributes, startNanos);
      }
    }

 if (operationListeners.length != 0) {  
   long endNanos = getNanos(endTime);  
   for (int i = operationListeners.length - 1; i >= 0; i--) {  
     operationListeners[i].onEnd(context, attributes, endNanos);  
   }
 }

這其中最關鍵的就是兩個函數 onStart 和 onEnd,分別會在當前這個 span 的開始和結束時進行回調。

所以通常的做法是在 onStart 函數中初始化數據,然后在 onEnd 結束時統計結果,最終可以拿到 metrics 所需要的數據。

以這個 rpc.client.duration 客戶端的請求耗時指標為例:

@Override  
public Context onStart(Context context, Attributes startAttributes, long startNanos) {  
  return context.with(  
      RPC_CLIENT_REQUEST_METRICS_STATE,  
      new AutoValue_RpcClientMetrics_State(startAttributes, startNanos));  
}

@Override  
public void onEnd(Context context, Attributes endAttributes, long endNanos) {  
  State state = context.get(RPC_CLIENT_REQUEST_METRICS_STATE);
 Attributes attributes = state.startAttributes().toBuilder().putAll(endAttributes).build();  
 clientDurationHistogram.record(  
     (endNanos - state.startTimeNanos()) / NANOS_PER_MS, attributes, context);
}

在開始時記錄下當前的時間,結束時獲取當前時間和結束時間的差值正好就是這個 span 的執行時間,也就是 rpc client 的處理時間。

在 OpenTelemetry 中絕大多數的請求時間都是這么記錄的。

Golang 增強

而在 Golang 中因為沒有 byte-buddy 這種魔法庫的存在,不可以直接修改源碼,所以通常的做法還是得硬編碼才行。

還是以 gRPC 為例,我們在創建 gRPC server 時就得指定一個 OpenTelemetry 提供的函數。

s := grpc.NewServer(  
    grpc.StatsHandler(otelgrpc.NewServerHandler()),  
)

圖片

在這個 SDK 中也會實現剛才在 Java 里類似的邏輯,限于篇幅具體邏輯就不細講了。

總結

以上就是 gRPC 在 OpenTelemetry 中的具體實現,主要就是在找到需要增強框架是否有提供擴展的接口,如果有就直接使用該接口進行埋點。

如果沒有那就需要查看源碼,找到核心邏輯,再使用 byte-buddy 進行埋點。

圖片圖片

比如 Pulsar 并沒有在客戶端提供一些擴展接口,只能找到它的核心函數進行埋點。

而在具體埋點過程中 OpenTelemetry 提供了許多解耦的 API,方便我們實現埋點所需要的業務邏輯,也會在后續的文章繼續分析 OpenTelemetry 的一些設計原理和核心 API 的使用。

這部分 API 的設計我覺得是 OpenTelemetry 中最值得學習的地方。

參考鏈接:

  • https://bytebuddy.net/#/
  • https://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#metric-rpcserverrequestsize
責任編輯:武曉燕 來源: crossoverJie
相關推薦

2024-08-28 08:09:13

contextmetrics類型

2024-08-21 08:09:17

2024-04-08 08:09:10

埋點收集數據StartRocks數據存儲

2023-09-06 07:17:57

2024-06-14 08:19:45

2024-06-27 08:41:21

2024-04-16 08:09:36

JavapulsarAPI

2015-09-15 15:41:09

監控寶Docker

2015-12-11 11:49:19

java

2015-12-11 11:39:15

.net代碼

2024-05-27 08:09:29

2021-09-18 15:05:58

MySQL數據庫監控

2015-12-11 14:02:02

php應用

2021-09-26 10:20:06

開發Golang代碼

2025-02-17 07:45:29

2023-09-05 07:28:02

Java自動埋點

2023-12-25 11:18:12

OpenTeleme應用日志Loki

2022-11-08 00:00:00

監控系統Prometheus

2015-10-12 17:08:14

云智慧

2021-03-08 08:48:02

應用場景項目
點贊
收藏

51CTO技術棧公眾號

欧美亚洲高清一区二区三区不卡| 国内成人免费视频| 亚洲精品自在久久| 我要看一级黄色大片| 乱人伦中文视频在线| 国产综合一区二区| 欧美激情视频在线免费观看 欧美视频免费一 | 毛片免费不卡| 国产不卡视频一区| 欧美在线性视频| 神马久久精品综合| 欧美中文一区| 欧美高清视频在线高清观看mv色露露十八 | 91九色鹿精品国产综合久久香蕉| 精品国产乱码久久久久久天美| 欧美日韩国产精品一区二区| 国产精品无码免费播放 | 日韩视频免费在线观看| 人妻 日韩 欧美 综合 制服| 国模一区二区| 亚洲国产成人va在线观看天堂| 欧美一区国产一区| 亚洲av综合色区无码一区爱av| 久久久夜夜夜| 欧美激情精品久久久久| 中文字幕欧美激情极品| 波多野结衣在线一区二区| 日本乱码高清不卡字幕| 丰满的少妇愉情hd高清果冻传媒 | 99久久99久久久精品齐齐| 国产美女91呻吟求| av黄色在线播放| 欧美色一级片| 日韩在线免费高清视频| 亚洲人人夜夜澡人人爽| 亚洲高清999| 欧美精品国产精品| 日本美女高潮视频| 中文字幕一区久| 亚洲午夜三级在线| www.黄色网址.com| 自拍视频在线免费观看| 久久久久国产精品厨房| 久久av免费观看| 中文网丁香综合网| 日操夜操天天操| 欧美日韩伊人| 麻豆乱码国产一区二区三区 | 欧美日韩在线一| 青春草免费在线视频| 国产精品国产三级国产专播品爱网| 欧美日韩一区二区视频在线观看| 黄色小视频免费观看| 国产一区二区不卡| 91美女福利视频高清| 亚洲图片中文字幕| 麻豆极品一区二区三区| 国产精品免费一区豆花| 天天干天天插天天射| 视频一区视频二区中文字幕| 7777精品视频| 秋霞精品一区二区三区| 久久精品观看| 日韩女优在线播放| 少妇又紧又色又爽又刺激视频| 日日摸夜夜添夜夜添精品视频 | 久久婷婷国产麻豆91| 欧美xxx在线观看| 久久99视频精品| 久久久久亚洲av无码专区| 狠狠综合久久| 992tv在线成人免费观看| 亚洲黄色一区二区| 免费日韩av片| 国产精品黄色影片导航在线观看| 丰满人妻一区二区三区四区| 蜜臀va亚洲va欧美va天堂| 国产精品无av码在线观看| 一个人看的www日本高清视频| 久久99精品国产.久久久久| 91pron在线| 少妇高潮久久久| 久久精品视频一区| 中国一区二区三区| 在线午夜影院| 五月天视频一区| 天天摸天天碰天天添| 亚洲s码欧洲m码国产av| 日本一本草久在线中文| 国产激情视频一区二区三区欧美 | 成人性生交大片免费看中文视频| 亚洲福利在线视频| 91成年人网站| 午夜免费一区| 欧美亚洲在线视频| 国产又粗又猛又黄又爽无遮挡| 国产成人av在线影院| 久久久久久一区| 日本激情视频在线观看| 亚洲午夜三级在线| 在线观看亚洲色图| 国产一区二区在线视频你懂的| 亚洲欧美国产日韩中文字幕| 国产精品久久久免费看| 一区二区三区成人精品| 国产精品美女在线| 人妻精品一区二区三区| 国产精品美女一区二区| 日韩一级片免费视频| 日本一区二区三区视频在线| 欧美成人精品3d动漫h| 亚洲精品国产91| 国产专区一区| 国产欧美在线播放| 香蕉视频网站在线| 亚洲女子a中天字幕| 精品久久久久久无码国产| 91精品啪在线观看国产爱臀| 一区二区三区天堂av| 日韩精品乱码久久久久久| 精品一二线国产| 欧美日韩一区二| 91探花在线观看| 91麻豆精品国产91久久久| 亚洲做受高潮无遮挡| 国一区二区在线观看| 国产色视频一区| 国产综合视频一区二区三区免费| 亚洲第一在线综合网站| 免费不卡av网站| 日韩精品电影| 国产精品高潮在线| 男男电影完整版在线观看| 亚洲成人自拍网| 一区二区在线免费观看视频| 日韩精品一卡| 国产区精品区| 在线性视频日韩欧美| 毛片基地在线观看| 成人午夜碰碰视频| 欧美少妇在线观看| 国产一区二区高清在线| 神马久久桃色视频| 人妻中文字幕一区二区三区| 久久这里只有精品视频网| 男人添女荫道口图片| 中文字幕一区二区三区四区久久| 日韩一区二区欧美| 亚洲影视一区二区| 国产精品色噜噜| 黄色三级视频在线| 欧美男gay| 日韩免费不卡av| 欧美日韩国产中文字幕在线| 欧美日韩中文字幕综合视频 | 在线观看亚洲天堂| 99久久精品免费看| 97在线国产视频| 欧美五码在线| 51视频国产精品一区二区| 青青草在线免费视频| 日本道在线观看一区二区| 一本加勒比北条麻妃| 日本午夜精品视频在线观看| 色噜噜色狠狠狠狠狠综合色一| 成人国产一区二区三区精品麻豆| 一区二区欧美亚洲| 一区二区三区黄| 亚洲少妇30p| 久久久精品人妻一区二区三区| 红桃视频欧美| 精品一区在线播放| 日韩欧美少妇| 日韩综合中文字幕| 国产成人麻豆精品午夜在线| 亚洲愉拍自拍另类高清精品| 182在线视频| 巨乳诱惑日韩免费av| 亚洲最新在线| 综合成人在线| 日本一区二区在线播放| 91亚洲精选| 91麻豆精品久久久久蜜臀| 国产亚洲成人精品| 91天堂素人约啪| 依人在线免费视频| 在线免费高清一区二区三区| 91在线小视频| 日韩欧美一区二区三区久久婷婷| 开心久久婷婷综合中文字幕| 欧美国产日韩xxxxx| 日韩黄色影片| 欧美精品日韩综合在线| 美女91精品| y111111国产精品久久婷婷| av蜜臀在线| 国产亚洲激情在线| 国产av无码专区亚洲av麻豆| 精品久久久久久久久久国产| 天天干天天操天天拍| 成人a免费在线看| 熟女少妇精品一区二区| 欧美91视频| 欧美日韩亚洲在线| 我要色综合中文字幕| 国产99久久久欧美黑人| 成人免费网站在线观看视频| 精品无人国产偷自产在线| 国产麻豆免费观看| 精品欧美激情精品一区| 五月综合色婷婷| 久久久一区二区三区| 69久久精品无码一区二区| 久久精品观看| 亚洲一区二区三区av无码| 国产精品嫩草影院在线看| 官网99热精品| 欧美特黄色片| 国产脚交av在线一区二区| 欧美一卡二卡| 中文字幕日韩精品有码视频| 亚洲aaaaaaa| 欧美成人精品1314www| 亚洲香蕉在线视频| 色综合久久综合| 国产一级黄色av| 国产精品国产馆在线真实露脸 | 影音先锋亚洲天堂| 亚洲精品欧美激情| 亚洲精品天堂网| 久久久精品国产免费观看同学| 丰满熟女人妻一区二区三区| 国产制服丝袜一区| 免费看污污网站| 久久久久91| 国产网站免费在线观看| 影音先锋亚洲精品| 青青在线视频免费观看| 亚洲一区二区三区| 在线无限看免费粉色视频| 成人影视亚洲图片在线| 欧美一区二区视频17c| 国模无码国产精品视频| 日韩福利电影在线| 久久久久久久久久久福利| 亚洲精品美女| 精品无码国产一区二区三区av| 午夜日韩av| 黄色三级中文字幕| 国产专区一区| 亚洲理论电影在线观看| 激情久久婷婷| 色综合久久久久无码专区| 在线视频免费在线观看一区二区| www.av毛片| 亚洲毛片一区| 激情综合在线观看| 午夜影院日韩| 国产成人精品视频ⅴa片软件竹菊| 久久午夜精品| 999精品视频在线| 日本成人中文字幕在线视频| av网站在线不卡| 美女视频一区在线观看| 中文字幕成人免费视频| 精品一区二区精品| 久久国产免费视频| thepron国产精品| 免费观看一级一片| 国产欧美日韩视频在线观看| 日本午夜精品视频| 亚洲视频免费在线| 午夜偷拍福利视频| 色欧美片视频在线观看在线视频| youjizz在线视频| 欧美日韩精品三区| 99在线观看精品视频| 欧美精品一区二区久久久| 性xxxx搡xxxxx搡欧美| 亚洲网站在线看| 国产黄色小视频在线| 欧美精品videosex极品1| 日韩大片免费观看| 国产精选久久久久久| 日韩一区二区三区高清在线观看| 国产在线一区二区三区四区| 国产欧美日韩| 国产女主播av| 久久中文字幕一区二区三区| 中文字幕日韩久久| www.欧美亚洲| 成人免费视频入口| 香蕉乱码成人久久天堂爱免费| 精品不卡一区二区| 51久久夜色精品国产麻豆| 欧日韩在线视频| 尤物九九久久国产精品的分类 | 自拍日韩亚洲一区在线| 水野朝阳av一区二区三区| 国产乱码一区二区三区四区| 99久免费精品视频在线观看| 日韩在线视频免费看| 精品国产福利视频| 中文字幕一区二区三区四区五区六区| 欧美日韩中出| 日本精品一区二区| 国产综合色产| 麻豆三级在线观看| av电影天堂一区二区在线观看| 农村老熟妇乱子伦视频| 偷拍一区二区三区| 国产女同91疯狂高潮互磨| 亚洲人成电影在线观看天堂色| 色呦呦在线视频| 国产精品久久久久久亚洲影视| 成人看片黄a免费看视频| 亚洲精品国产一区| 免播放器亚洲| 中文字幕在线视频播放| 亚洲视频在线一区| 久久久久精彩视频| 日韩成人激情在线| 欧美videossex| 国产精品永久免费视频| 小说区图片区色综合区| 国内少妇毛片视频| 国产真实乱子伦精品视频| 国产伦精品一区二区三区视频女| 五月婷婷久久丁香| 丰满人妻一区二区三区四区53| 久久精品电影网站| 涩涩涩久久久成人精品| 日韩高清国产精品| 亚洲一区二区三区高清| 在线观看免费视频国产| 亚洲精品欧美专区| 国产区精品在线| 色青青草原桃花久久综合| 另类专区亚洲| 免费99视频| 六月婷婷一区| 中文字幕5566| 日韩欧美亚洲一二三区| 天堂中文资源在线| 羞羞色国产精品| 欧美成人基地| 欧美成人免费在线观看视频| 成人av在线播放网站| 国产亚洲精久久久久久无码77777| 欧美一区二区视频免费观看| 国产在线看片| 亚洲一区二区三区xxx视频| 91精品国产麻豆国产在线观看 | 三级成人在线| 免费亚洲一区二区| 巨乳诱惑日韩免费av| 手机看片日韩av| 欧美日韩在线播放一区| 男女啪啪在线观看| 91香蕉嫩草影院入口| 欧美日韩ab| 野战少妇38p| 欧美视频第一页| 二区三区在线| 成人精品久久av网站| 亚洲电影影音先锋| 久久av一区二区三| 偷窥少妇高潮呻吟av久久免费| 天天干天天色天天| 国产精品白丝jk喷水视频一区| 欧洲视频一区| 性鲍视频在线观看| 亚洲成人福利片| 国产在线视频网| 老色鬼精品视频在线观看播放| 国产福利短视频| 欧美性一区二区| 国产福利视频在线| 国产 高清 精品 在线 a| 亚洲一区日本| www.xx日本| 精品久久国产97色综合| 久久电影tv| 中国黄色录像片| 成人动漫中文字幕| 免费av中文字幕| 欧美理论电影在线观看| 日本久久成人网| 57pao国产成永久免费视频| 亚洲一区二区视频在线| 久久电影中文字幕| 亚洲精品欧美日韩专区| 亚洲一区成人| 2025国产精品自拍| 亚洲毛片在线免费观看| 亚洲ww精品| 成年人视频观看| 亚洲精品美国一| 国产经典自拍视频在线观看| 亚洲综合自拍一区|