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

OpenTelemetry 實戰:從零實現分布式鏈路追蹤

開發 前端
對于支持自動埋點的語言就很簡單,只需要配置下 agent 即可;而原生的 Go 語言不支持自動埋點就得手動使用 OpenTelemetry 提供的 SDK 處理一些關鍵步驟;總體來說也不算復雜。

背景

之前寫過一篇 從 Dapper 到 OpenTelemetry:分布式追蹤的演進之旅的文章,主要是從概念上講解了 Trace 在 OpenTelemetry 的中的場景和使用。

也寫過一篇 實操 OpenTelemetry:通過 Demo 掌握微服務監控的藝術:如何從一個 demo 開始集成 OpenTelemetry。

但還是有不少小伙伴反饋說無法快速上手(可能也是這個 demo 的項目比較多),于是我準備從 0 開始從真實的代碼一步步帶大家集成 OpenTelemetry,因為 OpenTelemetry 本身是跨多種語言的,所以也會以兩種語言為(Java、Golang)主進行講解。

使用這兩種語言主要是因為 Java 幾乎全是自動埋點,而 Golang 因為語言特性,大部分都得硬編碼埋點;覆蓋到這兩種場景后其他語言也是類似的,頂多只是 API 名稱有些許區別。

在這個過程中也會穿插一些 OpenTelemetry 的原理,希望整個過程下來大家可以在項目中實際運用起來,同時也能知其所以然。

項目結構

在這個過程中會涉及到以下項目:

名稱

作用

語言

版本

java-demo

發送 gRPC 請求的客戶端

Java

opentelemetry-agent: 2.4.0/SpringBoot: 2.7.14

k8s-combat

提供 gRPC 服務的服務端

Golang

go.opentelemetry.io/otel: 1.28/ Go: 1.22

Jaeger

trace 存儲的服務端以及 TraceUI 展示

Golang

jaegertracing/all-in-one:1.56

opentelemetry-collector-contrib

OpenTelemetry 的 collector 服務端,用于收集 trace/metrics/logs 然后寫入到遠端存儲

Golang

otel/opentelemetry-collector-contrib:0.98.0

圖片圖片

在開始之前我們先看看實際的效果,我們需要先把 collector 和 Jaeger 部署好:

docker run --rm -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.56


docker run --rm -d -v $(pwd)/coll-config.yaml:/etc/otelcol-contrib/config.yaml --name coll \
-p 5318:4318 \
-p 5317:4317 \
otel/opentelemetry-collector-contrib:0.98.0

這里有一個 coll-config 的配置文件如下:

receivers:
  otlp:
    protocols:
      grpc:
      http:
exporters:
  debug:
  otlp:
    endpoint: "127.0.0.1:4317"
    tls:
      insecure: true
processors:
  batch:
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp, debug]

重點是這里的 endpoint: "127.0.0.1:4317" 我們需要配置位 Jaeger 的 IP 和端口。

更多關于這里的配置會在后續單獨的 collector 章節中講解。

這兩個服務都啟動成功后再啟動我們的 Java 客戶端和  Go  服務端:

java -javaagent:opentelemetry-javaagent-2.4.0-SNAPSHOT.jar \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=otlp \
-Dotel.logs.exporter=none \
-Dotel.service.name=demo \
-Dotel.exporter.otlp.protocol=grpc \
-Dotel.propagators=tracecontext,baggage \
-Dotel.exporter.otlp.endpoint=http://127.0.0.1:5317 \
      -jar target/demo-0.0.1-SNAPSHOT.jar

# Golang
export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:5317
export OTEL_RESOURCE_ATTRIBUTES=service.name=k8s-combat
./k8s-combat

可以看到不管是 Java 還是 Golang 應用都是需要配置 OTEL_EXPORTER_OTLP_ENDPOINT 參數,也就是 opentelemetry-collector-contrib 的地址。

其余的一些配置在后面會講到。

curl http://127.0.0.1:9191/request\?name\=1232

然后我們觸發一下 Java 客戶端的入口,就可以在 JaegerUI 中查詢到剛才的鏈路了。http://localhost:16686/search

圖片圖片

圖片這樣整個 trace 鏈路就串起來了。

Java 應用

下面來看看具體的應用代碼里是如何編寫的。

Java 是基于 springboot 編寫的,具體 springboot 的使用就不再贅述了。

因為我們應用是使用 gRPC 通信的,所以需要提供一個 helloworld.proto 的 pb 文件:

syntax = "proto3";  
  
option go_package = "google.golang.org/grpc/examples/helloworld/helloworld";  
option java_multiple_files = true;  
option java_package = "io.grpc.examples.helloworld";  
option java_outer_classname = "HelloWorldProto";  
  
package helloworld;  
  
// The greeting service definition.  
service Greeter {  
  // Sends a greeting  
  rpc SayHello (HelloRequest) returns (HelloReply) {}  
}  
  
// The request message containing the user's name.  
message HelloRequest {  
  string name = 1;  
}  
  
// The response message containing the greetings  
message HelloReply {  
  string message = 1;  
}

這個文件也沒啥好說的,就定義了一個簡單的 SayHello 接口。

<dependency>  
  <groupId>net.devh</groupId>  
  <artifactId>grpc-spring-boot-starter</artifactId>  
  <version>3.1.0.RELEASE</version>  
</dependency>  
  
<dependency>  
  <groupId>io.grpc</groupId>  
  <artifactId>grpc-stub</artifactId>  
  <version>${grpc.version}</version>  
</dependency>  
<dependency>  
  <groupId>io.grpc</groupId>  
  <artifactId>grpc-protobuf</artifactId>  
  <version>${grpc.version}</version>  
</dependency>

在 Java 中使用了 grpc-spring-boot-starter 這個庫來處理 gRPC 的客戶端和服務端請求。

grpc:  
  server:  
    port: 9192  
  client:  
    greeter:  
      address: 'static://127.0.0.1:50051'  
      enableKeepAlive: true  
      keepAliveWithoutCalls: true  
      negotiationType: plaintext

然后我們定義了一個接口用于接收請求觸發 gRPC 的調用:

@RequestMapping("/request")  
    public String request(@RequestParam String name) {  
       log.info("request: {}", request);    
       HelloReply abc = greeterStub.sayHello(io.grpc.examples.helloworld.HelloRequest.newBuilder().setName(request.getName()).build());   
       return abc.getMessage();  
    }

Java 應用的實現非常簡單,和我們日常日常開發沒有任何區別;唯一的區別就是在啟動時需要加入一個 javaagent以及一些啟動參數。

java -javaagent:opentelemetry-javaagent-2.4.0-SNAPSHOT.jar \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=otlp \
-Dotel.logs.exporter=none \
-Dotel.service.name=demo \
-Dotel.exporter.otlp.protocol=grpc \
-Dotel.propagators=tracecontext,baggage \
-Dotel.exporter.otlp.endpoint=http://127.0.0.1:5317 \
      -jar target/demo-0.0.1-SNAPSHOT.jar

下面來仔細看看這些參數

名稱

作用

javaagent:opentelemetry-javaagent-2.4.0-SNAPSHOT.jar

這個沒啥好說的,指定一個 javaagent

otel.traces.exporter

指定 trace 以什么格式傳輸(默認是這里的 otlp);當然還有其他的值:logging/jaeger/zipkin 等,我們這里使用 otlp 會將數據傳輸到 collector 中。

otel.metrics.exporter

同上,只是指定的是 metrics 的傳輸方式,我們在之后講解指標的時候會用到。

otel.service.name

定義在 trace 中的應用名稱,springboot 會默認使用 spring.application.name 這個變量。

otel.exporter.otlp.protocol

指定傳輸協議;除了 grpc 之外還有 http/protobuf,當然我們也可以根據 trace 和 metrics 分開指定:otel.exporter.otlp.traces.protocol/otel.exporter.otlp.metrics.protocol

otel.propagators

指定我們跨服務傳播上下文的時候使用哪種格式,默認是 W3C Trace Context,baggage,當然也有其他的- "b3": B3 Single,- "xray": AWS X-Ray,"jaeger": Jaeger等

otel.exporter.otlp.endpoint

指定 collector 的 endpoint

更多細節的參數大家可以在這里找到:


https://opentelemetry.io/docs/languages/java/configuration/


Golang 應用

接著我們來看看 Go 是如何集成 OpenTelemetry 的。

在創建好項目之后我們需要添加 OpenTelemetry 所提供的包:

go get "go.opentelemetry.io/otel" \
  "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" \
  "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" \
  "go.opentelemetry.io/otel/propagation" \
  "go.opentelemetry.io/otel/sdk/metric" \
  "go.opentelemetry.io/otel/sdk/resource" \
  "go.opentelemetry.io/otel/sdk/trace" \       "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"\

然后我們需要創建一個初始化 tracer 的函數:

func initTracerProvider() *sdktrace.TracerProvider {
 ctx := context.Background()

 exporter, err := otlptracegrpc.New(ctx)
 if err != nil {
  log.Printf("new otlp trace grpc exporter failed: %v", err)
 }
 tp := sdktrace.NewTracerProvider(
  sdktrace.WithBatcher(exporter),
  sdktrace.WithResource(initResource()),
 )
 otel.SetTracerProvider(tp)
 otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
 return tp
}

因為我們使用的是 grpc 協議上報 otlp 數據,所以這里使用的是 exporter, err := otlptracegrpc.New(ctx)  創建了一個 exporter。

otel.SetTextMapPropagator() 這個函數里配置數據和剛才 Java 里配置的 -Dotel.propagators=tracecontext,baggage 是一樣的效果。

與此同時我們還需要提供一個 initResource() 的函數:

func initResource() *sdkresource.Resource {
 initResourcesOnce.Do(func() {
  extraResources, _ := sdkresource.New(
   context.Background(),
   sdkresource.WithOS(),
   sdkresource.WithProcess(),
   sdkresource.WithContainer(),
   sdkresource.WithHost(),
  )
  resource, _ = sdkresource.Merge(
   sdkresource.Default(),
   extraResources,
  )
 })
 return resource
}

這個函數用來告訴 trace 需要暴露那些 resource,也就是我們在這里看到進程相關的屬性:

圖片圖片

比如這里的 sdkresource.WithOS(), 就會顯示 OS 的類型和描述。

func WithOS() Option {  
    return WithDetectors(  
       osTypeDetector{},  
       osDescriptionDetector{},  
    )}

而 sdkresource.WithProcess(), 顯示的數據就更多了。

func WithProcess() Option {  
    return WithDetectors(  
       processPIDDetector{},  
       processExecutableNameDetector{},  
       processExecutablePathDetector{},  
       processCommandArgsDetector{},  
       processOwnerDetector{},  
       processRuntimeNameDetector{},  
       processRuntimeVersionDetector{},  
       processRuntimeDescriptionDetector{},  
    )}

以上這些代碼在 Java 中都是由 agent 指定創建的。


// Init OpenTelemetry start  
tp := initTracerProvider()  
defer func() {  
    if err := tp.Shutdown(context.Background()); err != nil {  
       log.Printf("Error shutting down tracer provider: %v", err)  
    }}()  
   
err := runtime.Start(runtime.WithMinimumReadMemStatsInterval(time.Second))  
if err != nil {  
    log.Err(err)  
}
tracer = tp.Tracer("k8s-combat")
// Init OpenTelemetry end

之后我們需要在 main 函數一開始就初始化 traceProvider。

對于 grpc 來說,OpenTelemetry 的 Go-SDK 提供了自動埋點,但我們也得手動配置一下:

s := grpc.NewServer(  
    grpc.StatsHandler(otelgrpc.NewServerHandler()),  
)  
pb.RegisterGreeterServer(s, &server{})

使用 grpc.StatsHandler(otelgrpc.NewServerHandler()),  將 OTel 的 serverHandle 加入進去,這個 handle 會自動創建 grpc 服務端的 span。

對 trace/span 概念還有不了解的朋友可以查看這篇文章。

var port = ":50051"  
lis, err := net.Listen("tcp", port)  
if err != nil {  
    log.Fatal().Msgf("failed to listen: %v", err)  
}  
s := grpc.NewServer(  
    grpc.StatsHandler(otelgrpc.NewServerHandler()),  
)  
pb.RegisterGreeterServer(s, &server{})  
if err := s.Serve(lis); err != nil {  
    log.Fatal().Msgf("failed to serve: %v", err)  
} else {  
    log.Printf("served on %s \n", port)  
}

接著我們只需要啟動這個 grpc 服務即可,就算完成了 Go 服務的集成。

從這里可以看出 Java 相對于 Go 來說會簡單許多,只需要配置一個 agent 就可以不該一行代碼支持目前市面上流行的絕大多數框架。

圖片圖片

自定義  span 的 attribute

我們在看鏈路信息的時候其實看的最多的是某個 span 里的 attribute 數據(有些地方又稱為 tag) 如下圖所示:

圖片圖片

這里會展示當前 span 的各種信息,但如果我們想要額外加一些自己關心的數據應該如何添加呢?

message HelloRequest {  
  string name = 1;  
}

比如我們想知道這個 grpc 接口里的 name 參數,如上圖所示那樣展示在 span 中。

好在 OpenTelemetry 已經考慮到類似的需求:

span := trace.SpanFromContext(ctx)  
span.SetAttributes(attribute.String("request.name", in.Name))

我們使用 span := trace.SpanFromContext(ctx)  獲取到當前的 span,然后調用 SetAttributes 就可以添加自定義的數據了。

對應的 Java 也有類似的函數。

除了新增 attribute 之外還可以新增 Event,Link 等數據,使用方式也是類似的。

// AddEvent adds an event with the provided name and options.  
AddEvent(name string, options ...EventOption)  
  
// AddLink adds a link.  
// Adding links at span creation using WithLinks is preferred to calling AddLink  
// later, for contexts that are available during span creation, because head  
// sampling decisions can only consider information present during span creation.  
AddLink(link Link)

自定義新增 span

同理我們可能不局限于為某個 span 新增 attribute,也有可能想要新增一個新的 span 來記錄關鍵的調用信息。

默認情況下只有 OpenTelemetry 實現過的組件的核心函數才會有 span,自己代碼里的函數調用是不會創建span 的。

func (s *server) span(ctx context.Context) {  
    ctx, span := tracer.Start(ctx, "hello-span")  
    defer span.End()  
    // do some work  
    log.Printf("create span")  
}

在  Go 中只需要手動 Start 一個 span 即可。

對應到 Java 稍微簡單一些,只需要為函數添加一個注解即可。

@WithSpan("span")  
public void span(@SpanAttribute("request.name") String name) {  
    TimeUnit.SECONDS.sleep(1);  
    log.info("span:{}", name);  
}

只不過得單獨引入一個依賴:

<dependency>  
  <groupId>io.opentelemetry</groupId>  
  <artifactId>opentelemetry-api</artifactId>  
</dependency>  
  
<dependency>  
  <groupId>io.opentelemetry.instrumentation</groupId>  
  <artifactId>opentelemetry-instrumentation-annotations</artifactId>  
  <version>2.3.0</version>  
</dependency>

最終我們在 Jaeger UI 上看到的效果如下:

圖片圖片

總結

圖片圖片

最后總結一下,OpenTelemetry 支持許多流行的語言,主要分為兩類:是否支持自動埋點。

圖片圖片

這里 Go 也可以零代碼埋點,是使用了 eBPF,本文暫不做介紹。

對于支持自動埋點的語言就很簡單,只需要配置下 agent 即可;而原生的 Go 語言不支持自動埋點就得手動使用 OpenTelemetry 提供的 SDK 處理一些關鍵步驟;總體來說也不算復雜。

參考鏈接:

  • https://opentelemetry.io/docs/languages/java/configuration/
  • https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md
  • https://crossoverjie.top/2024/06/06/ob/OpenTelemetry-trace-concept/
責任編輯:武曉燕 來源: crossoverJie
相關推薦

2020-12-16 09:24:18

Skywalking分布式鏈路追蹤

2024-06-07 13:04:31

2025-10-10 08:58:13

2023-11-21 08:25:09

2024-01-26 07:49:49

Go分布式鏈路

2024-06-07 07:41:03

2021-02-22 07:58:51

分布式鏈路追蹤

2024-11-28 08:57:21

分布式鏈路Skywalking

2023-10-16 23:43:52

云原生可觀測性

2020-09-11 09:44:04

微服務分布式鏈路

2024-07-09 08:11:56

2024-08-28 08:09:13

contextmetrics類型

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2021-11-08 14:10:37

分布式Spring鏈路

2024-10-24 08:51:19

分布式鏈路項目

2022-11-26 09:49:07

分布式鏈路追蹤技術

2022-08-05 10:03:17

分布式微服務

2020-05-26 11:59:30

日志鏈路微服務架構

2023-10-26 00:00:00

分布式系統定位

2020-10-19 07:30:57

Java Redis 開發
點贊
收藏

51CTO技術棧公眾號

午夜性色福利影院| 国产一级片久久| 亚洲欧洲专区| 亚洲精品成人少妇| 精品一区二区不卡| 五月婷婷丁香在线| 中文字幕乱码亚洲无线精品一区| 精品福利一区二区三区免费视频| 国产亚洲天堂网| 亚洲图片88| 国产91露脸合集magnet| 国产999精品| 少妇人妻丰满做爰xxx| 澳门精品久久国产| 欧美在线高清视频| 免费特级黄色片| 国产精品四虎| 国产成人av电影在线播放| 555www成人网| 欧美黑人猛猛猛| 最新亚洲精品| 精品久久久久久无| 日韩精品你懂的| 国产蜜臀一区二区打屁股调教| 久久色中文字幕| 91在线播放视频| 中文字幕在线2018| 国产精品久久久久毛片大屁完整版| 色噜噜狠狠色综合网图区| 中国免费黄色片| 未满十八勿进黄网站一区不卡| 欧美日韩国产精品| 一级性生活视频| 9191在线观看| 久久久久久99精品| 国产一区高清视频| www.看毛片| 久久电影网站中文字幕| 国产成人综合精品| 婷婷激情五月网| 国产精品videosex极品| 精品国模在线视频| 国产在线综合视频| 亚洲精品国产setv| 亚洲第一精品福利| 久久黄色一级视频| 成人网av.com/| 欧美日韩亚洲综合一区| 国产欧美在线一区| 国产在线美女| 偷拍一区二区三区四区| 久久亚洲国产成人精品无码区| 欧美精品videos另类| 欧美极品另类videosde| 欧美亚州在线观看| 牛牛热在线视频| 久久综合九色综合97婷婷女人 | av成人在线观看| 色综合天天性综合| 91免费视频网站在线观看| yellow字幕网在线| 亚洲va欧美va天堂v国产综合| 香港三级日本三级a视频| dy888亚洲精品一区二区三区| 国产精品久久久久aaaa樱花 | 亚洲最大的网站| 成 人 免费 黄 色| 高清不卡在线观看| 久草精品电影| 极品美乳网红视频免费在线观看| 久久伊99综合婷婷久久伊| 久久久久资源| 日本精品999| 久久奇米777| 日韩高清dvd| 国产精品日日做人人爱| 国产真实乱人偷精品| 成人福利一区| 亚洲国产日韩欧美在线动漫| 日本国产一级片| 国产精品亚洲综合在线观看| 日韩免费福利电影在线观看| 欧美熟妇精品一区二区蜜桃视频| 人人精品视频| 中文日韩电影网站| 国产精品九九九九九九| 亚洲国产黄色| 国产精品福利观看| 99久久婷婷国产一区二区三区| 国产精品18久久久久久久久| 激情久久av| 最新97超碰在线| 亚洲黄色尤物视频| 欧美v在线观看| 日韩电影精品| 亚洲国产欧美一区| 亚洲人做受高潮| 国产精品videossex久久发布| 日本sm极度另类视频| 91丨九色丨丰满| 91丨porny丨中文| 中文字幕日韩精品一区二区| 国产极品在线观看| 欧洲av一区二区嗯嗯嗯啊| 国产黄色一区二区三区| 日韩三区视频| 久久国产一区二区三区| 国产区一区二区三| 黑人巨大精品欧美一区| 美日韩精品免费| 成人福利在线观看视频| 亚洲大片精品永久免费| www.99r| 大伊香蕉精品在线品播放| 国产一区二区三区视频在线观看| 麻豆疯狂做受xxxx高潮视频| 丝袜诱惑制服诱惑色一区在线观看 | 国产免费av一区二区| 久久99久久99| 欧美日韩精品一区| 欧美日韩色网| 欧美日本韩国一区二区三区视频 | 不卡视频在线| 91干在线观看| a网站在线观看| 中国色在线观看另类| 香港三级韩国三级日本三级| 日韩区一区二| 久久精品夜夜夜夜夜久久| 人人草在线观看| 不卡大黄网站免费看| www.黄色网址.com| 精品自拍视频| 国产一区二区三区在线观看视频 | 污视频在线看网站| 欧美日韩在线播放三区四区| 亚洲第一香蕉网| 亚洲日本欧美| 国产精品一区二区你懂得| а√天堂资源地址在线下载| 欧美日本一区二区三区四区 | 成人激情在线| 国产成+人+综合+亚洲欧洲| 五月婷婷狠狠干| 午夜欧美2019年伦理| 国产 xxxx| 一区二区三区四区五区精品视频 | 日本高清视频免费观看| 亚洲自拍与偷拍| 亚洲欧洲日韩综合| 欧美日本一区二区视频在线观看| 91精品视频在线播放| 九七久久人人| 4438x成人网最大色成网站| 亚洲一级理论片| 久久草av在线| 中文视频一区视频二区视频三区| av成人亚洲| 精品国产一区二区三区四区在线观看 | 国产极品国产极品| 国产综合久久久久影院| 色乱码一区二区三区熟女| 日韩成人在线一区| 久久激情视频免费观看| 国产av无码专区亚洲av麻豆| 一区二区高清在线| 特级特黄刘亦菲aaa级| 亚洲国产裸拍裸体视频在线观看乱了中文 | 97热精品视频官网| 色天堂在线视频| 91精品办公室少妇高潮对白| 五月天婷婷丁香网| 国产麻豆一精品一av一免费| 日韩免费在线观看av| 久久综合五月婷婷| 日本中文字幕成人| 伊人在线视频| 精品国产免费一区二区三区四区 | 日本女人一区二区三区| 亚洲精品tv久久久久久久久| 国产精品白丝久久av网站| 九九九久久久久久| 天堂网www中文在线| 欧美手机在线视频| 欧美黑人精品一区二区不卡| 99视频一区二区| 无码人妻丰满熟妇区五十路百度| 国产精品二区不卡| 国产精品对白刺激久久久| 女厕盗摄一区二区三区| 自拍偷拍亚洲精品| 黄色aaa大片| 日本乱人伦aⅴ精品| 亚洲伦理一区二区三区| 99久久婷婷国产综合精品| 五月天亚洲视频| 欧美性色综合| 日韩免费av一区二区三区| 人人爱人人干婷婷丁香亚洲| 98精品国产高清在线xxxx天堂| fc2在线中文字幕| 精品国产伦一区二区三区观看体验| 狠狠人妻久久久久久| 亚洲人精品午夜| www.自拍偷拍| 国产精品99久久久| www.99在线| 亚洲人成毛片在线播放女女| 天堂v在线视频| 欧美综合自拍| av免费观看久久| 国产91在线精品| 欧日韩在线观看| 羞羞电影在线观看www| 亚洲网站在线播放| 欧美一级特黄aaaaaa大片在线观看| 欧美丝袜丝交足nylons| 在线观看国产亚洲| 亚洲精品欧美综合四区| 卡一卡二卡三在线观看| www.欧美.com| 天天色天天干天天色| 青青草原综合久久大伊人精品优势| 国产不卡一区二区视频| 在线看片不卡| 亚洲精品久久久久久一区二区| 欧美做受69| 国产精品久久久一区二区三区| 日韩欧国产精品一区综合无码| 欧洲成人午夜免费大片| 女子免费在线观看视频www| 大胆欧美人体视频| 在线观看的av| 国产一区二区欧美日韩| 国产在线免费观看| 国产婷婷成人久久av免费高清| 亚洲男人天堂久久| 日韩午夜三级在线| 97精品人妻一区二区三区| 欧洲精品一区二区| 欧美性受xxx黑人xyx性爽| 色久综合一二码| 久久久国产免费| 欧美综合久久久| 天天爱天天做天天爽| 色94色欧美sute亚洲13| 懂色av蜜臀av粉嫩av喷吹| 在线看不卡av| 正在播放亚洲精品| 欧美日韩大陆在线| 国产精品高潮呻吟AV无码| 欧美日韩你懂得| 一炮成瘾1v1高h| 欧美一区二区三区小说| 成人av手机在线| 亚洲第一精品自拍| 婷婷在线观看视频| 亚洲美女av电影| 91在线网址| 久久国产精品网站| 亚洲区欧洲区| 97人人模人人爽人人喊中文字| 乡村艳史在线观看| 国产精品高清免费在线观看| 国产综合色激情| 91观看网站| 欧美挤奶吃奶水xxxxx| 欧美一级爱爱| 婷婷久久一区| 激情五月婷婷六月| 亚洲专区一区| 色免费在线视频| 国产激情偷乱视频一区二区三区 | 波多野结衣在线电影| 精品视频1区2区3区| 91超薄丝袜肉丝一区二区| 日韩一二三四区| 欧美 日韩 国产 成人 在线 91| 亚洲二区中文字幕| 国产大片在线免费观看| 国产亚洲精品综合一区91| 在线观看免费黄色| 欧美激情亚洲综合一区| av资源在线播放| 国产成人精品av| 精品一区二区三区在线观看视频| 成人羞羞视频免费| 成人午夜大片| 亚洲精品成人久久久998| 香蕉综合视频| 中文字幕一区二区三区5566| 亚洲成人直播| 人妻丰满熟妇av无码区app| 日韩av高清在线观看| 亚洲成人福利视频| 26uuu国产在线精品一区二区| 91香蕉视频网| 激情久久av一区av二区av三区 | 青青草视频在线免费直播| 午夜精品久久久久久久男人的天堂 | 欧美在线激情网| 在线成人免费| 国产一区二区三区四区hd| 日韩欧美高清| 欧美一级片免费播放| 视频一区免费在线观看| 野战少妇38p| 国产日韩av一区| 国产盗摄一区二区三区在线| 在线精品视频免费播放| 中文字幕人妻一区二区在线视频| 欧美在线制服丝袜| 国产又粗又猛又爽又黄91| 亚洲欧美国产精品专区久久| yellow91字幕网在线| 国产日韩欧美夫妻视频在线观看| 成午夜精品一区二区三区软件| 神马影院午夜我不卡| 性伦欧美刺激片在线观看| 污污视频在线免费| 久久久高清一区二区三区| 日本熟妇毛耸耸xxxxxx| 欧美久久久久免费| 四虎在线视频免费观看| 色在人av网站天堂精品| 黑人一区二区三区| 欧美日韩一区二区三| 黑丝一区二区三区| 久久国产激情视频| 欧美国产精品一区| 亚洲精品77777| 日韩视频123| a黄色片在线观看| 国产精品久久久久久影视| 国产毛片一区二区三区| 国产亚洲黄色片| 国产一区欧美一区| 欧美大片xxxx| 欧美日韩激情一区二区三区| 亚洲欧美一区二区三| 97在线视频免费播放| 视频精品一区二区三区| 欧美在线观看黄| 久久99精品久久久久| 欧美大波大乳巨大乳| 欧美亚洲尤物久久| 日韩精品视频在线观看一区二区三区| 欧美精品www| 亚洲成人影音| 日韩不卡一二区| 国产成人在线观看| www深夜成人a√在线| 欧洲av一区二区嗯嗯嗯啊| av网站无病毒在线| 日本高清+成人网在线观看| 蜜臀91精品国产高清在线观看| 2018国产在线| 成人免费看黄yyy456| 国产成人无码精品久在线观看| 亚洲精品在线网站| 国产伦久视频在线观看| 激情五月综合色婷婷一区二区| 亚洲理论在线| 97伦伦午夜电影理伦片| 日韩欧中文字幕| 蝌蚪视频在线播放| 国产91精品在线播放| 欧美女优在线视频| 欧美三级午夜理伦三级富婆| 国产精品久线观看视频| 国产免费无遮挡| 麻豆国产va免费精品高清在线| 国产精品毛片无码| 777av视频| 99久久精品国产精品久久| 秋霞av一区二区三区| 中文字幕一区电影| 2019中文亚洲字幕| 国产美女在线一区| 99国产精品久| 一本色道久久综合亚洲| 久久国产精品免费视频| 久久伊人影院| 少妇高潮喷水久久久久久久久久| 国产日韩欧美综合一区| 国产国语亲子伦亲子| 国内久久久精品| 999精品视频| 中文字幕在线国产| 精品久久久久久亚洲国产300 | 上原亚衣av一区二区三区| 国产精品久久久久久吹潮| 久久99久久99精品| 91蜜桃免费观看视频| 国产黄色一区二区| 91精品国产91久久久久久| 7777久久香蕉成人影院| 国产精品手机在线观看| 狠狠久久五月精品中文字幕| 18加网站在线|