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

在分布式系統中,使用OTEL、Jaeger和Prometheus監控服務

譯文 精選
開發 前端
本文將OTEL、Jaeger和Prometheus相結合,在分布式系統中實現更快、更集中的可觀察性,從而快速排除故障。

譯者 | 李睿

審校 | 重樓

本文將深入探討一個至關重要的問題:當系統出現問題時,應當如何有效地監控服務

一方面,可以借助具備提醒功能的Prometheus,以及集成儀表板和其他實用功能的Kibana來增強監控能力。另一方面,在日志收集方面,ELK堆棧無疑是首選方案。然而,簡單的日志記錄往往不足以滿足需求,因為它無法提供覆蓋整個組件生態系統的請求流程的整體視圖。

如果直觀地展示請求流程呢?或者需要在系統間追蹤關聯的請求,該怎么辦?這既適用于微服務,也適用于單體服務——有多少服務并不重要;重要的是如何管理它們的延遲。

事實上,每個用戶請求可能要經過由獨立服務、數據庫、消息隊列和外部API組成的復雜鏈路。

在這種復雜的環境中,很難準確地確定延遲發生的位置,確定鏈路的哪一部分是性能瓶頸,并在發生故障時快速找到其根本原因。

為了有效地應對這些挑戰,需要一個集中的、一致的系統來收集遙測數據——包括跟蹤、指標和日志。這正是OpenTelemetry和Jaeger發揮重要作用的地方。

了解基礎知識

人們必須理解以下兩個主要術語:

Trace ID

Trace ID是一個16字節的標識符,通常表示為32個字符的十六進制字符串。它在跟蹤開始時自動生成,并在由特定請求創建的所有跨度中保持不變。這樣可以很容易地看到請求是如何通過系統中的不同服務或組件傳遞的。

Span ID

跟蹤中的每個單獨操作都有自己的Span ID,它通常是一個隨機生成的64位值。Span共享相同的Trace ID,但是每個Span都有一個唯一的Span ID,因此可以確定每個Span代表工作流的哪個部分(如數據庫查詢或對另一個微服務的調用)。

它們之間有何關聯?

Trace IDSpan ID是相輔相成的。

當發起請求時,會生成一個Trace ID,并將其傳遞給所有相關服務。每個服務又會創建一個與Trace ID關聯的、具有唯一Span ID的Span,從而能夠可視化請求從開始到結束的完整生命周期。

那么,為什么不直接使用Jaeger呢?為什么需要OpenTelemetry(OTEL)及其所有規范?這是一個很好的問題!以下逐步分析。

  • Jaeger是一個用于存儲和可視化分布式跟蹤的系統。它收集、存儲、搜索和顯示數據,顯示請求如何通過服務“傳輸”。
  • OpenTelemetry (OTEL)是一個標準(以及一組庫),用于從應用程序和基礎設施中收集遙測數據(跟蹤、指標、日志)。它不依賴于任何單一的可視化工具或后端。

簡而言之:

  • OTEL就像一種“通用語言”和一組遙測收集庫。
  • Jaeger是用于查看和分析分布式跟蹤的后端和用戶界面。

如果已經有了Jaeger,為什么還要OTEL?

1.單一的收集標準

在過去,有像OpenTracing和OpenCensus這樣的項目。OpenTelemetry將這些收集指標和跟蹤的方法統一到一個通用標準中。

2.易于集成

采用Go(或其他語言)編寫代碼,為自動注入攔截器和跨度添加OTEL庫,就這樣完成。之后,無論想把數據發送到哪里并不重要——Jaeger、Tempo、Zipkin、Datadog、自定義后端——OpenTelemetry都會負責管道。只需換導出器即可。

3.不僅僅是跟蹤

OpenTelemetry不僅涵蓋跟蹤,還處理指標和日志。最終,可以使用一個工具集來滿足所有遙測需求,而不僅僅是跟蹤。

4.以Jaeger為后端

如果主要對分布式跟蹤可視化感興趣,Jaeger是一個很好的選擇。但默認情況下,它不提供跨語言檢測。另一方面,OpenTetry提供了一種標準化的數據收集方式,然后可以決定將數據發送到哪里(包括Jaeger)。

在實踐中,它們經常協同工作

應用程序使用OpenTelemetry→通過OTLP協議通信→進入OpenTelemetry收集器(HTTP或gRPC)→導出到Jaeger進行可視化。

技術部分

系統設計(簡要介紹)

以下快速勾勒出幾個服務,這些服務將執行以下操作:

1.購買服務——處理付款并記錄在MongoDB中

2.CDC與Debezium——監聽MongoDB表中的更改,并將它們發送到Kafka

3.購買處理器——使用來自Kafka的消息并調用Auth服務查找user_id進行驗證

4.認證服務——一種簡單的用戶服務

總結:

  • 3 Go services
  • Kafka
  • CDC (Debezium)
  • MongoDB

代碼部分

從基礎設施開始。為了將所有內容匯集到一個系統中,將創建一個大型的DockerCompose文件從設置遙測開始。

注:所有代碼都可以通過本文末尾的鏈接獲得,包括基礎設施。

YAML 
 services:

 jaeger:
 image: jaegertracing/all-in-one:1.52
 ports:
 - "6831:6831/udp" # UDP port for the Jaeger agent
 - "16686:16686" # Web UI
 - "14268:14268" # HTTP port for spans
 networks:
 - internal

 prometheus:
 image: prom/prometheus:latest
 volumes:
 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
 ports:
 - "9090:9090"
 depends_on:
 - kafka
 - jaeger
 - otel-collector
 command:
 --config.file=/etc/prometheus/prometheus.yml
 networks:
 - internal

 otel-collector:
 image: otel/opentelemetry-collector-contrib:0.91.0
 command: ['--cnotallow=/etc/otel-collector.yaml']
 ports:
 - "4317:4317" # OTLP gRPC receiver
 volumes:
 - ./otel-collector.yaml:/etc/otel-collector.yaml
 depends_on:
 - jaeger
 networks:
 - internal

還將配置收集器——收集遙測數據的組件。

在這里選擇gRPC進行數據傳輸,這意味著通信將通過HTTP/2進行:

YAML 
 receivers:
 # Add the OTLP receiver listening on port 4317.
 otlp:
 protocols:
 grpc:
 endpoint: "0.0.0.0:4317"

 processors:
 batch:
 # https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/memorylimiterprocessor
 memory_limiter:
 check_interval: 1s
 limit_percentage: 80
 spike_limit_percentage: 15

 extensions:
 health_check: {}

 exporters:
 otlp:
 endpoint: "jaeger:4317"
 tls:
 insecure: true
 prometheus:
 endpoint: 0.0.0.0:9090
 debug:
 verbosity: detailed

 service:
 extensions: [health_check]
 pipelines:
 traces:
 receivers: [otlp]
 processors: [memory_limiter, batch]
 exporters: [otlp]

 metrics:
 receivers: [otlp]
 processors: [memory_limiter, batch]
 exporters: [prometheus]

確保根據需要調整任何地址,這樣就完成了基本配置。

OpenTelemetry (OTEL)使用兩個關鍵概念——Trace ID和Span ID,它們有助于跟蹤和監控分布式系統中的請求。

代碼實現

現在了解如何讓它在Go代碼中實現這一點。需要以下導入:

Go 
 "go.opentelemetry.io/otel"
 "go.opentelemetry.io/otel/exporters/otlp/otlptrace"
 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
 "go.opentelemetry.io/otel/sdk/resource"
 "go.opentelemetry.io/otel/sdk/trace"
 semconv "go.opentelemetry.io/otel/semconv/v1.17.0"

然后,當應用程序啟動時,在main()中添加一個函數來初始化跟蹤器:

Go 
 func InitTracer(ctx context.Context) func() {
 exp, err := otlptrace.New(
 ctx,
 otlptracegrpc.NewClient(
 otlptracegrpc.WithEndpoint(endpoint),
 otlptracegrpc.WithInsecure(),
 ),
 )
 if err != nil {
 log.Fatalf("failed to create OTLP trace exporter: %v", err)
 }

 res, err := resource.New(ctx,
 resource.WithAttributes(
 semconv.ServiceNameKey.String("auth-service"),
 semconv.ServiceVersionKey.String("1.0.0"),
 semconv.DeploymentEnvironmentKey.String("stg"),
 ),
 )
 if err != nil {
 log.Fatalf("failed to create resource: %v", err)
 }

 tp := trace.NewTracerProvider(
 trace.WithBatcher(exp),
 trace.WithResource(res),
 )

 otel.SetTracerProvider(tp)

 return func() {
 err := tp.Shutdown(ctx)
 if err != nil {
 log.Printf("error shutting down tracer provider: %v", err)
 }
 }
 }

在設置跟蹤之后,只需要在代碼中放置span來跟蹤調用。例如,如果想測量數據庫調用(因為這通常是尋找性能問題的第一個地方),可以這樣寫:

Go 
 tracer := otel.Tracer("auth-service")
 ctx, span := tracer.Start(ctx, "GetUserInfo")
 defer span.End()

 tracedLogger := logging.AddTraceContextToLogger(ctx)

 tracedLogger.Info("find user info",
 zap.String("operation", "find user"),
 zap.String("username", username),
 )


user, err := s.userRepo.GetUserInfo(ctx, username)
 if err != nil {
 s.logger.Error(errNotFound)
 span.RecordError(err)
 span.SetStatus(otelCodes.Error, "Failed to fetch user info")

 return nil, status.Errorf(grpcCodes.NotFound, errNotFound, err)
 }

 span.SetStatus(otelCodes.Ok, "User info retrieved successfully")

在服務層進行跟蹤,這太棒了!但可以更深入地分析數據庫層:

Go 
 func (r *UserRepository) GetUserInfo(ctx context.Context, username string) (*models.User, error) {
 tracer := otel.Tracer("auth-service")
 ctx, span := tracer.Start(ctx, "UserRepository.GetUserInfo",
 trace.WithAttributes(
 attribute.String("db.statement", query),
 attribute.String("db.user", username),
 ),
 )
 defer span.End()

 var user models.User
 
 // Some code that queries the DB...
 // err := doDatabaseCall()

 if err != nil {
 span.RecordError(err)
 span.SetStatus(codes.Error, "Failed to execute query")
 return nil, fmt.Errorf("failed to fetch user info: %w", err)
 }

 span.SetStatus(codes.Ok, "Query executed successfully")
 return &user, nil
 }

現在,對請求過程有了完整的了解。前往Jaeger UI,查詢auth-service下的最后20條跟蹤記錄將會在一個界面中看到所有的Span以及它們之間的關聯方式。

現在,一切都是可見的。如果需要,可以將整個查詢包含在標記中。需要記住,不應該使遙測過載——故意添加數據。在這里只是在演示什么是可能的,但包括完整的查詢,通常不推薦這種方式。

gRPC客戶機-服務器

如果希望查看跨越兩個gRPC服務的跟蹤,這很簡單。需要做的就是從庫中添加開箱即用的攔截器。例如,在服務器端:

Go 
 server := grpc.NewServer(
 grpc.StatsHandler(otelgrpc.NewServerHandler()),
 )

 pb.RegisterAuthServiceServer(server, authService)

在客戶端,代碼也很短:

Go 
 shutdown := tracing.InitTracer(ctx)
 defer shutdown()

 conn, err := grpc.Dial(
 "auth-service:50051",
 grpc.WithInsecure(),
 grpc.WithStatsHandler(otelgrpc.NewClientHandler()),
 )
 if err != nil {
 logger.Fatal("error", zap.Error(err))
 }

就是這樣!確保導出器配置正確,當客戶端調用服務器時,將看到這些服務上記錄的單個Trace ID。

處理CDC事件和跟蹤

也想變更數據捕獲 (CDC)的事嗎?一個簡單的方法是將Trace ID嵌入到MongoDB存儲的對象中。這樣,當Debezium捕獲更改并將其發送給Kafka時,Trace ID已經是記錄的一部分。

例如,如果使用的是MongoDB,可以這樣做:

Go 
 func (r *mongoPurchaseRepo) SavePurchase(ctx context.Context, purchase entity.Purchase) error {
 span := r.handleTracing(ctx, purchase)
 defer span.End()

 // Insert the record into MongoDB, including the current span's Trace ID
 _, err := r.collection.InsertOne(ctx, bson.M{
 "_id": purchase.ID,
 "user_id": purchase.UserID,
 "username": purchase.Username,
 "amount": purchase.Amount,
 "currency": purchase.Currency,
 "payment_method": purchase.PaymentMethod,
 // ...
 "trace_id": span.SpanContext().TraceID().String(),
 })

 return err
 }

然后Debezium拾取這個對象(包括trace_id)并將其發送給Kafka。在消費者端,只需解析傳入消息,提取trace_id,并將其合并到跟蹤上下文中:

Go 
 // If we find a Trace ID in the payload, attach it to the context
 newCtx := ctx
 if traceID != "" {
 log.Printf("Found Trace ID: %s", traceID)
 newCtx = context.WithValue(ctx, "trace-id", traceID)
 }

 // Create a new span
 tracer := otel.Tracer("purchase-processor")
 newCtx, span := tracer.Start(newCtx, "handler.processPayload")
 defer span.End()

 if traceID != "" {
 span.SetAttributes(
 attribute.String("trace.id", traceID),
 )
 }

 // Parse the "after" field into a Purchase struct...
 var purchase model.Purchase
 if err := mapstructure.Decode(afterDoc, &purchase); err != nil {
 log.Printf("Failed to map 'after' payload to Purchase struct: %v", err)
 return err
}

Go:

// If we find a Trace ID in the payload, attach it to the context
 newCtx := ctx
 if traceID != "" {
 log.Printf("Found Trace ID: %s", traceID)
 newCtx = context.WithValue(ctx, "trace-id", traceID)
 }

 // Create a new span
 tracer := otel.Tracer("purchase-processor")
 newCtx, span := tracer.Start(newCtx, "handler.processPayload")
 defer span.End()

 if traceID != "" {
 span.SetAttributes(
 attribute.String("trace.id", traceID),
 )
 }

 // Parse the "after" field into a Purchase struct...
 var purchase model.Purchase
 if err := mapstructure.Decode(afterDoc, &purchase); err != nil {
 log.Printf("Failed to map 'after' payload to Purchase struct: %v", err)
 return err
 }

替代方案:使用Kafka標頭

有時,將Trace ID存儲在Kafka標頭中比存儲在負載本身中更容易。對于CDC工作流來說,這可能無法開箱使用——Debezium可能限制添加到標題中的內容。但是如果控制了生產者端(或者如果使用的是標準的Kafka生產者),那么可以使用Sarama等工具執行以下操作:

Trace ID注入標頭

Go 
 // saramaHeadersCarrier is a helper to set/get headers in a Sarama message.
 type saramaHeadersCarrier *[]sarama.RecordHeader

 func (c saramaHeadersCarrier) Get(key string) string {
 for _, h := range *c {
 if string(h.Key) == key {
 return string(h.Value)
 }
 }
 return ""
 }

 func (c saramaHeadersCarrier) Set(key string, value string) {
 *c = append(*c, sarama.RecordHeader{
 Key: []byte(key),
 Value: []byte(value),
 })
 }

// Before sending a message to Kafka:
 func produceMessageWithTraceID(ctx context.Context, producer sarama.SyncProducer, topic string, value []byte) error {
 span := trace.SpanFromContext(ctx)
 traceID := span.SpanContext().TraceID().String()

 headers := make([]sarama.RecordHeader, 0)
 carrier := saramaHeadersCarrier(&headers)
 carrier.Set("trace-id", traceID)

 msg := &sarama.ProducerMessage{
 Topic: topic,
 Value: sarama.ByteEncoder(value),
 Headers: headers,
 }

 _, _, err := producer.SendMessage(msg)
 return err
 }

在消費者端提取Trace ID

Go 
 for message := range claim.Messages() {
 // Extract the trace ID from headers
 var traceID string
 for _, hdr := range message.Headers {
 if string(hdr.Key) == "trace-id" {
 traceID = string(hdr.Value)
 }
 }

 // Now continue your normal tracing workflow
 if traceID != "" {
 log.Printf("Found Trace ID in headers: %s", traceID)
 // Attach it to the context or create a new span with this info
 }
 }

根據用例和CDC管道的設置方式,可以選擇最有效的方法:

1.在數據庫記錄中嵌入Trace ID,使其通過CDC自然流動。

2.如果對生產者有更多的控制權,或者想避免增加消息有效載荷的大小,可以使用Kafka標頭。

無論哪種方式,都可以確保跨多個服務的跟蹤信息保持一致,即使事件是通過Kafka和Debezium異步處理的。

結論

使用OpenTelemetry和Jaeger提供詳細的請求跟蹤信息,幫助確定分布式系統中延遲發生的位置和原因。

在添加Prometheus之后,可以通過指標(性能和穩定性的關鍵指標)完善監控體系。這些工具共同構成了一個全面的可觀測性堆棧,能夠更快地檢測和解決問題、優化性能以及提高系統的整體可靠性。

可以說,這種方法在微服務環境中顯著加快了故障排除的速度,是在項目中最先實施的事項之一。

參考鏈接

a.MongoDB Connector Docs

b.Unwrap MongoDB SMT Example

原文標題:Control Your Services With OTEL, Jaeger, and Prometheus,作者:Ilia Ivankin

責任編輯:華軒 來源: 51CTO
相關推薦

2023-05-29 14:07:00

Zuul網關系統

2022-02-08 10:21:17

運維應用監控

2022-08-05 10:03:17

分布式微服務

2024-07-05 08:26:54

2022-03-01 16:26:09

鏈路監控日志監控分布式系統

2021-06-09 09:00:00

微服務架構技術

2011-04-01 10:18:12

zabbix

2023-09-19 21:09:40

可視化監控Skywalking

2023-05-12 08:23:03

分布式系統網絡

2017-01-16 14:51:26

京東分布式服務CallGraph

2018-06-08 08:46:14

RaftPaxos系統

2017-10-27 08:40:44

分布式存儲剪枝系統

2023-10-26 18:10:43

分布式并行技術系統

2023-02-11 00:04:17

分布式系統安全

2018-12-14 10:06:22

緩存分布式系統

2020-11-24 09:36:19

分布式監控系統

2024-10-18 08:00:00

分布式系統背壓數據庫

2017-03-14 08:57:10

CAP定理可用性

2023-07-19 08:22:01

分布式系統數據

2022-03-15 09:10:00

分布式訓練實踐
點贊
收藏

51CTO技術棧公眾號

av中文字幕第一页| 91中文字幕永久在线| 少女频道在线观看高清 | av免费在线观看不卡| 狠狠爱综合网| 中文字幕欧美亚洲| 真实乱偷全部视频| 国产精品扒开腿做爽爽爽视频软件| 国产精品家庭影院| 国产私拍一区| 国产精选久久久| 久久激情中文| 久久久久久亚洲精品中文字幕| 熟女俱乐部一区二区视频在线| 国产专区精品| 欧美在线色视频| 国产曰肥老太婆无遮挡| 米奇精品一区二区三区| 久久一二三国产| 国产精品免费在线| 国产精品欧美激情在线| 日日摸夜夜添夜夜添国产精品| 欧美高清在线观看| а天堂中文在线资源| 日韩最新在线| 精品久久国产老人久久综合| 中文字幕成人在线视频| 在线观看特色大片免费视频| 亚洲一区在线视频观看| 艳母动漫在线观看| 尤物网址在线观看| 国产欧美一区二区精品仙草咪| 国产在线播放一区二区| 亚洲不卡免费视频| 韩日欧美一区二区三区| 国产精品亚洲一区二区三区| 加勒比在线一区| 性高湖久久久久久久久| 国内自拍欧美激情| 精品无码一区二区三区电影桃花 | 国产午夜麻豆影院在线观看| 亚洲伦理一区| 2019国产精品自在线拍国产不卡| 欧美高清视频一区二区三区| 亚洲精品tv久久久久久久久久| 国产亚洲精品美女久久久| 中文字幕狠狠干| 欧美五码在线| 亚洲精品视频播放| 九色porny自拍视频| 日韩精品免费一区二区三区竹菊 | 91caoporn在线| 欧美激情资源网| 日韩亚洲视频| 69av在线| 亚洲黄网站在线观看| 日本一区二区三区四区五区六区| 好吊日视频在线观看| 一区二区三区中文免费| 中文字幕人妻熟女人妻洋洋| 1234区中文字幕在线观看| 亚洲成人激情综合网| 九色自拍视频在线观看| 国产欧美一区二区三区精品酒店| 欧美性少妇18aaaa视频| 爱情岛论坛vip永久入口| 国产精品蜜月aⅴ在线| 91精品综合久久久久久| 中文字幕第六页| 精品国产一区二区三区成人影院| 日韩高清不卡av| 欧美成人另类视频| 91精品蜜臀一区二区三区在线| 欧美另类极品videosbestfree| 久久香蕉精品视频| 久久狠狠婷婷| 91麻豆国产语对白在线观看| 蜜臀久久久久久999| 国产亚洲成年网址在线观看| 亚洲人一区二区| 日韩专区av| 欧美日韩在线观看视频| 亚洲最大综合网| 亚洲日本va| 国产一区二区三区在线播放免费观看| 99自拍偷拍视频| 欧美日韩mv| 日本高清+成人网在线观看| 五月激情丁香网| 国产精品456露脸| 久久婷婷国产综合尤物精品| 日韩在线免费电影| 午夜国产不卡在线观看视频| 国产精品拍拍拍| aaa国产精品| 夜夜嗨av一区二区三区免费区| 中文字幕在线2021| 久久激情婷婷| 国产传媒一区二区| 91ph在线| 日韩欧美精品网址| 国产免费无码一区二区| 日韩aaaa| 欧美在线观看视频| 国产夫妻在线观看| 日本一区二区在线不卡| 亚洲国产成人精品无码区99| 亚洲欧洲一二区| 亚洲欧美日韩精品久久亚洲区| 一级黄色录像视频| 蜜臂av日日欢夜夜爽一区| 国产精品入口免费| 麻豆传媒视频在线观看| 在线一区二区观看| 国产大学生视频| 久久精品亚洲人成影院| 日韩av成人在线观看| 亚洲国产成人在线观看| 中文字幕一区二区三区视频| 日本一本二本在线观看| 哺乳一区二区三区中文视频 | 懂色av一区| 欧美久久久久久久久中文字幕| 欧美多人猛交狂配| 国产精品毛片| 精品国产乱码久久久久久88av | 黄色小视频在线免费观看| 亚洲国产视频一区二区| 中文字幕55页| 久久精品青草| 国产区亚洲区欧美区| 国产视频福利在线| 日本韩国欧美一区| 亚洲av无码成人精品国产| 亚洲国产91| 风间由美久久久| 69xxx在线| 欧美一区二区三区在线电影| 多男操一女视频| 久久精品99国产国产精| 亚洲在线不卡| 日本a人精品| 日韩视频―中文字幕| 亚洲一二区视频| 国产精品电影一区二区三区| 在线观看日本一区二区| 成人羞羞网站| 91精品久久久久久久| 日本中文字幕在线播放| 欧美日韩免费观看一区三区| 国产白丝一区二区三区| 久久精品免费看| 三年中国中文在线观看免费播放| 日韩国产大片| 欧美成人合集magnet| 国内精品久久久久久久久久久| 亚洲美女免费视频| 在线播放第一页| 亚洲高清av| 六十路精品视频| 狠狠久久伊人中文字幕| 久久伊人色综合| 丁香六月天婷婷| 欧美日韩亚洲激情| 99精品全国免费观看| 黑人巨大精品欧美黑白配亚洲| www.99riav| 青青草原在线亚洲| 国产精品99久久久久久久久久久久| 免费播放片a高清在线观看| 欧美综合亚洲图片综合区| 国产精品麻豆免费版现看视频| 国产美女久久| 欧美视频一区在线| 午夜少妇久久久久久久久| 豆国产96在线|亚洲| 国产免费黄色av| 日韩dvd碟片| 99精彩视频在线观看免费| 国产丝袜在线观看视频| 亚洲精品一区在线观看香蕉| 亚洲性生活大片| 亚洲高清久久久| 欧美熟妇激情一区二区三区| 精品亚洲免费视频| 青青草精品视频在线| 不卡中文一二三区| 国产福利久久| 成人在线免费av| 欧美激情久久久久| 成年人在线免费观看| 日韩精品一区二区三区蜜臀| 五月天婷婷激情| 亚洲欧美日韩国产另类专区| 国产福利短视频| 久久精品国产精品亚洲红杏| 蜜臀av无码一区二区三区| 久久伦理在线| 狠狠色综合网站久久久久久久| 精品肉辣文txt下载| 久久久视频免费观看| a√资源在线| 日韩成人黄色av| 国产成人a人亚洲精品无码| 色哟哟国产精品| 久久人人爽人人爽人人| 亚洲国产精品t66y| 呦呦视频在线观看| 久久99国产精品免费网站| 国产精品丝袜久久久久久消防器材| 国产高清一区二区| 欧美一二三四五区| 国产精品xxxav免费视频| 日本在线观看天堂男亚洲| 国产第一页在线| 精品国产网站地址| 国产经典自拍视频在线观看| 日韩的一区二区| 性一交一乱一色一视频麻豆| 91亚洲国产成人久久精品| 国产日韩欧美日韩| 亚洲天堂资源| 国外成人性视频| а√天堂资源地址在线下载| 国产亚洲欧洲高清一区| 五月天久久久久久| 欧美成人女星排行榜| 国产精品久久久久精| 欧美专区亚洲专区| 久久精品国产成人av| 亚洲午夜久久久久久久久久久| 成人免费黄色小视频| 中文字幕乱码久久午夜不卡| 精品少妇人妻一区二区黑料社区| 97久久人人超碰| 中国免费黄色片| 成人美女视频在线观看| 极品白嫩的小少妇| 成人妖精视频yjsp地址| 久久人妻少妇嫩草av蜜桃| 国产乱国产乱300精品| 性久久久久久久久久久久久久| 日本女优在线视频一区二区| 国产成人精品视频ⅴa片软件竹菊| 毛片一区二区| 日韩精品一区二区三区不卡 | 国产精品久久久久久久岛一牛影视| 免费看污黄网站在线观看| 久久久久久久久久美女| 黄色在线观看av| 国产欧美日韩亚州综合| 免费网站在线高清观看| 亚洲国产岛国毛片在线| 日本黄区免费视频观看| 亚洲日穴在线视频| 九九视频免费看| 黄色成人av网| 最新中文字幕一区| 日本道在线观看一区二区| 中文字幕人成人乱码亚洲电影| 精品视频全国免费看| 国产精品一区二区免费视频| 91精品国产一区二区| 成人午夜视频一区二区播放| 日韩av在线一区二区| 国产伦精品一区二区三区四区视频_| 亚洲澳门在线| 97免费视频观看| 午夜在线精品| 一区二区三区韩国| 国产自产2019最新不卡| 无码人妻一区二区三区精品视频| www.久久久久久久久| aaaaa级少妇高潮大片免费看| 国产色一区二区| 性色av无码久久一区二区三区| 亚洲国产wwwccc36天堂| 欧美一区免费看| 欧美一区二区三区男人的天堂| 可以免费观看的毛片| 亚洲精品日韩在线| 久久综合之合合综合久久| 久久免费国产视频| 3d性欧美动漫精品xxxx软件| 成人有码在线视频| 欧美重口另类| 自拍偷拍99| 在线亚洲观看| 国产5g成人5g天天爽| 91香蕉视频污在线| 青青操在线视频观看| 精品久久香蕉国产线看观看gif| 在线观看黄色国产| 亚洲电影免费观看高清完整版在线观看 | 国产色综合一区二区三区| 精品视频免费| 欧美狂野激情性xxxx在线观| 蜜臀av在线播放一区二区三区 | 日韩av不卡一区| 在线视频不卡一区二区| 国产日韩亚洲| 能看毛片的网站| 国产日韩精品一区二区三区在线| 青青草手机视频在线观看| 在线观看一区二区精品视频| 亚洲xxxx天美| 久久久精品影院| 第84页国产精品| 国产精品.com| 亚洲一区二区日韩| 免费看污污网站| 91在线视频官网| 国产在线欧美在线| 欧美精品少妇一区二区三区 | 中文字幕免费不卡| 五月婷婷开心网| 日韩欧美自拍偷拍| 日本在线免费网| 国产精品福利观看| 日韩母乳在线| 国产人妻777人伦精品hd| 国产综合成人久久大片91| 夫妇交换中文字幕| 色婷婷久久综合| 亚洲美女福利视频| 久久综合久中文字幕青草| 福利一区二区免费视频| 欧美一卡2卡3卡4卡无卡免费观看水多多| 国内精品久久久久久久97牛牛| 日韩在线一区视频| 国产精品日韩精品欧美在线| 成人毛片一区二区三区| 亚洲美女又黄又爽在线观看| 福利影院在线看| 国产一级二级三级精品| 在线 亚洲欧美在线综合一区| 超碰在线超碰在线| 亚洲品质自拍视频| 国产美女自慰在线观看| 久久精品亚洲94久久精品| 久久天天久久| 亚洲最大色综合成人av| 久久精品999| 中国毛片直接看| 91麻豆精品国产91久久久久久 | 国产av一区二区三区传媒| 亚洲精品欧美在线| www视频在线| 久久久免费精品| 欧美日韩一本| 99精品视频在线看| 欧美国产精品中文字幕| 亚洲一级av毛片| 久久久精品2019中文字幕神马| a一区二区三区亚洲| 三级在线免费观看| 成人免费看视频| 亚洲另类欧美日韩| 亚洲欧美综合另类中字| 成人免费视频观看| 在线观看日韩羞羞视频| 国产美女精品一区二区三区| a级黄色片免费看| 亚洲电影成人av99爱色| 朝桐光一区二区| 亚洲一区3d动漫同人无遮挡| 韩日av一区二区| 国产大片中文字幕| 亚洲欧美国产另类| 欧美aaaaaaaa| 美女av免费观看| 91麻豆国产香蕉久久精品| 中国a一片一级一片| 久久久www成人免费精品| www.欧美| 动漫av网站免费观看| 欧美精品videossex少妇| 精品国产视频在线| jizz18欧美18| 无码少妇一区二区三区芒果| 国产精品福利电影一区二区三区四区| 国产按摩一区二区三区| 欧美一性一乱一交一视频| 99久久99久久精品国产片果冰| 特黄特色免费视频| 日本高清无吗v一区| 国产在线高清理伦片a| 精品国产一区二区三区麻豆免费观看完整版 | 欧美成人激情视频免费观看| 日韩av字幕| 欧美一级小视频| 亚洲va欧美va人人爽午夜| 成人在线免费看| 国产精品久久7| 男人操女人的视频在线观看欧美 | 91国产丝袜在线播放| 手机av免费在线| 亚洲人成77777| 91啪九色porn原创视频在线观看| 国产孕妇孕交大片孕|