精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久久久无码精品国产| 欧美日韩一区二区三区69堂| 神马午夜电影一区二区三区在线观看| 国产精品毛片| 伊人久久免费视频| 99中文字幕在线| 黄色在线免费观看网站| 中文字幕免费观看一区| 97人人模人人爽视频一区二区 | 国产精品另类一区| 亚洲综合精品一区二区| 亚洲欧美精品一区二区三区| 91久久夜色精品国产按摩| 欧美成人免费网站| 别急慢慢来1978如如2| 曰本三级在线| 国产欧美日韩不卡| 国产伦精品一区二区三区在线| 制服丝袜在线一区| 国产日韩1区| 不卡毛片在线看| 中文字幕被公侵犯的漂亮人妻| 精品国产一区二区三区2021| 日韩欧美亚洲国产一区| 日韩一级特黄毛片| аⅴ资源新版在线天堂| 成人精品免费视频| 96精品久久久久中文字幕| 四虎精品永久在线| 亚洲视频一二| 久热在线中文字幕色999舞| 久久国产精品影院| 高清一区二区三区| 在线成人av网站| 国产日韩成人内射视频| а√在线天堂官网| 玉足女爽爽91| 亚洲自拍的二区三区| 全色精品综合影院| 成人av午夜电影| 99久久国产免费免费| 亚洲系列第一页| 久久激情综合| 国产91成人video| 国产无遮挡裸体免费视频| 手机在线电影一区| 在线观看精品自拍私拍| 青青草福利视频| 精品久久97| 亚洲精品在线电影| 国产调教打屁股xxxx网站| 亚洲综合伊人| 在线观看91精品国产麻豆| 一区二区在线免费看| 日韩不卡在线| 在线精品视频免费观看| 国产v亚洲v天堂无码久久久| 亚洲性色av| 欧美日韩一区二区免费视频| 尤物av无码色av无码| 9999在线视频| 都市激情亚洲色图| 日韩欧美亚洲天堂| 蜜桃视频www网站在线观看| 亚洲午夜羞羞片| 国产va亚洲va在线va| 99色在线观看| 午夜欧美一区二区三区在线播放| 美女扒开大腿让男人桶| 成人免费图片免费观看| 欧美日韩中文字幕在线| 情侣黄网站免费看| 三级成人黄色影院| 欧美色爱综合网| 亚洲18在线看污www麻豆 | 国产精品久久久久久久龚玥菲| www国产精品av| 青青影院一区二区三区四区| 国产人成在线观看| 国产精品理论在线观看| 色爽爽爽爽爽爽爽爽| 羞羞污视频在线观看| 亚洲国产精品自拍| 亚洲午夜无码av毛片久久| 美女福利一区二区| 欧美男男青年gay1069videost| 久久婷婷中文字幕| 女同久久另类99精品国产| 日韩精品免费电影| 国产日韩精品中文字无码| 亚洲色图二区| 欧美亚洲视频在线看网址| 亚洲欧美一二三区| 国产一区二区成人久久免费影院| 国产嫩草一区二区三区在线观看| 日产精品久久久久久久性色| 国产精品久久久久久久久动漫 | 久久99精品久久只有精品| 99在线免费观看视频| 青青草免费在线| 成人免费一区二区三区视频 | а天堂中文在线资源| 欧美精品不卡| 国产成人在线亚洲欧美| 国产富婆一级全黄大片| 91色婷婷久久久久合中文| 亚洲欧美一区二区原创| 久久99亚洲网美利坚合众国| 色婷婷一区二区三区四区| 三级av免费看| 欧洲杯半决赛直播| 久久99精品视频一区97| 国产乱码在线观看| 不卡一区中文字幕| 亚洲精品在线免费看| 蜜桃麻豆av在线| 欧美一级日韩不卡播放免费| 蜜桃av免费看| 在线成人www免费观看视频| 国产精品嫩草影院一区二区| 欧洲av在线播放| 亚洲欧美一区二区视频| 久久久久免费精品| 国产一区丝袜| 久久成人精品电影| 国产精品国产精品国产| hitomi一区二区三区精品| 一区二区三区我不卡| 亚洲欧美电影| 亚洲精品福利视频| 青青草精品在线视频| 美女免费视频一区二区| 欧美日韩在线一区二区三区| 欧美xxxx少妇| 欧美一级久久久| 又嫩又硬又黄又爽的视频| 久久精品人人做人人爽电影蜜月| 国产成人精品免费视频大全最热| 麻豆视频在线| 欧美色视频在线| 亚洲午夜精品久久久久久高潮 | 麻豆一区二区三区视频| 久本草在线中文字幕亚洲| 欧美成人免费视频| 国产一区二区在线播放视频| 久久久www成人免费无遮挡大片| 熟女少妇在线视频播放| 精品嫩草影院| 69视频在线免费观看| www.日韩高清| 一区二区三区中文免费| 红桃视频一区二区三区免费| 忘忧草精品久久久久久久高清| 国产精品久久久久久久久久新婚| 欧美女v视频| 日本韩国欧美在线| 女女互磨互喷水高潮les呻吟| 久久久一二三| 日韩福利一区二区三区| 欧美精品资源| 色综合伊人色综合网站| 91麻豆一区二区| 亚洲美女淫视频| 韩国一区二区三区四区| 亚洲五月婷婷| 久久99精品国产99久久| 欧美电影免费观看高清完整| 亚洲欧洲日产国产网站| 精品国产www| 亚洲婷婷在线视频| 欧洲成人午夜精品无码区久久| 国产一区视频在线观看免费| 国产精品久久久久免费| 高清在线视频不卡| 精品网站999www| 亚洲中文字幕无码爆乳av | 青娱乐国产盛宴| aaa亚洲精品| 日本熟妇人妻中出| 91精品国产91久久久久久密臀| 亚洲最大的免费| av伦理在线| 国产亚洲精品久久久久久777 | 欧美大片一区二区| 久久久久久久久久影院| 国产日韩欧美激情| 九九九九九国产| 亚洲国产高清一区二区三区| 欧美日本韩国一区二区三区| 亚洲精品第一| 欧美激情亚洲精品| 国产69久久| 91精品国产综合久久国产大片| 五月天婷婷丁香| 中文在线免费一区三区高中清不卡| 污视频在线观看免费网站| 亚洲麻豆av| 中文字幕av日韩精品| 国产精品极品在线观看| 国产精品久久久久久久av电影| h网站久久久| 亚洲欧美另类人妖| 99久久久久成人国产免费| 精品久久久久久久久中文字幕 | 日韩欧美字幕| 国产一区二区久久久| 欧美午夜三级| 2019国产精品自在线拍国产不卡| 麻豆tv在线| 亚洲欧美一区二区三区久久| 精品久久无码中文字幕| 91福利国产精品| 久久激情免费视频| 国产精品每日更新在线播放网址 | 久久久久久久综合色一本| 自拍一级黄色片| 蜜臀久久99精品久久久久宅男| 日韩中字在线观看| 91高清一区| 亚洲国产精品久久久久婷婷老年| 激情亚洲另类图片区小说区| 91在线视频导航| 国产精品xxx| 国产福利成人在线| 日本а中文在线天堂| 欧美日韩福利视频| 久草免费在线| 色先锋资源久久综合5566| 免费在线看v| 亚洲第一页自拍| 亚洲欧美黄色片| 制服丝袜亚洲网站| 在线观看免费观看在线| 色综合久久99| 黄色一级视频免费看| 天天做天天摸天天爽国产一区 | 国产麻豆天美果冻无码视频| 国产高清在线精品| 亚洲高清av一区二区三区| 久久精品72免费观看| 簧片在线免费看| 视频一区视频二区中文字幕| 免费看又黄又无码的网站| 亚洲午夜在线| 懂色av一区二区三区四区五区| 欧美日韩激情在线一区二区三区| 欧美一区二区在线| 国产精品一区二区av日韩在线| 久久综合九色欧美狠狠| 久久久久观看| 久久99精品久久久久久青青日本 | 国产精品迅雷| 国产成一区二区| 国产精品久久久久av电视剧| 国产成人av在线播放| 婷婷六月国产精品久久不卡| 热久久美女精品天天吊色| 在线能看的av网址| 日本老师69xxx| 日本欧美一区| 成人a视频在线观看| www欧美在线观看| 成人av中文| 菁菁伊人国产精品| 欧美凹凸一区二区三区视频| 国产精品一区高清| 在线视频亚洲自拍| 欧美在线日韩| 秋霞无码一区二区| 久久不射2019中文字幕| a在线观看免费视频| 激情丁香综合五月| 精品国产免费久久久久久婷婷| 成人av资源在线观看| 加勒比一区二区| 国产精品欧美一区喷水| 激情小说中文字幕| 天天综合天天做天天综合| 成人毛片一区二区三区| 欧美久久久久久久久| 性中国xxx极品hd| 日韩成人久久久| 95在线视频| 欧美激情一区二区三区成人| 天堂8中文在线最新版在线| 国产精品国产三级国产aⅴ浪潮| gogo大尺度成人免费视频| 国产精品麻豆免费版| 免费精品国产| 老汉色影院首页| 亚洲综合三区| 午夜一级免费视频| av在线综合网| 天堂av免费在线| 午夜av一区二区三区| 曰批又黄又爽免费视频| 精品裸体舞一区二区三区| 国产在线电影| 久久久久久久激情视频| 欧美一级做a| 久久99精品久久久久久秒播放器 | 日韩最新av在线| 第一福利在线视频| 91亚洲精品在线| 国产精品嫩模av在线| 神马午夜伦理影院| 久久久精品午夜少妇| 久久发布国产伦子伦精品| 久久精品一区二区三区不卡| 欧美极品视频在线观看| 欧美午夜不卡在线观看免费| 你懂的网站在线| 精品国偷自产在线视频99| 午夜不卡影院| 国产99午夜精品一区二区三区 | 国产va亚洲va在线va| 久久av中文字幕片| 国产中年熟女高潮大集合| 亚洲第一激情av| av av片在线看| 日韩在线观看网站| 欧美一区久久久| 国产偷国产偷亚洲高清97cao| 欧美r级电影| 久久久精品三级| 久久综合九色欧美综合狠狠| 免费网站看av| 91麻豆精品国产自产在线观看一区| 日产精品久久久久久久性色| 国外色69视频在线观看| 日韩高清一区| 日韩精品第1页| 国内外成人在线| 日韩在线视频免费看| 欧美视频完全免费看| 精品福利视频导航大全| 2019中文字幕在线观看| 全球av集中精品导航福利| 人人妻人人澡人人爽欧美一区双| 精品夜夜嗨av一区二区三区| 国产一二三四区在线| 在线亚洲高清视频| 毛片在线免费| 国产成人精品久久亚洲高清不卡| 日韩精品a在线观看91| 日本www在线视频| 99精品黄色片免费大全| 久久国产精品系列| 亚洲精品久久久一区二区三区| hd国产人妖ts另类视频| 国产99在线免费| 国产精品视区| 泷泽萝拉在线播放| 91久久精品国产91性色tv| 国产主播福利在线| 国产精品色午夜在线观看| 日韩不卡一区| 欧美性受xxxxxx黑人xyx性爽| 国产精品女主播av| 国产精品国产一区二区三区四区| 久久国产一区二区三区| 久久av网站| 免费看欧美黑人毛片| 99久久久无码国产精品| 女人十八岁毛片| 亚洲性生活视频在线观看| 国产91亚洲精品久久久| 咪咪色在线视频| 成人在线综合网站| 久久国产黄色片| 最近2019年中文视频免费在线观看| 欧美亚洲黄色| 国产精品va在线观看无码| 99久久夜色精品国产网站| 在线观看日本网站| 日韩中文字幕视频| 999久久精品| 蜜臀av午夜一区二区三区| 国产精品乱码一区二区三区软件 | 一区二区三区视频免费看| 亚洲免费视频一区二区| 成人在线免费| 亚洲乱码日产精品bd在线观看| 91在线观看视频| 中文字幕久久网| 欧美激情亚洲精品| 制服丝袜日韩| 一级网站在线观看| 狠狠久久五月精品中文字幕| 成人高清网站| 国产69精品久久久久9999apgf | 天天久久综合网| 欧美日韩美女视频| 毛片免费不卡| 久久久久综合一区二区三区| 精品午夜久久福利影院| 天堂中文在线网| 欧美激情精品久久久久久蜜臀 | 久久―日本道色综合久久| 国产精品久久婷婷|