From 3e2f8622f8b3e1b1d9ca4e9b954b960663ceea53 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 24 Aug 2022 11:04:39 +0800 Subject: [PATCH] APM: Support distributed tracing by Tencent Cloud APM. v5.0.63 --- trunk/conf/full.conf | 30 +- trunk/doc/CHANGELOG.md | 1 + trunk/doc/Features.md | 1 + trunk/research/http1-to-2/.gitignore | 2 + trunk/research/http1-to-2/Makefile | 9 + trunk/research/http1-to-2/go.mod | 5 + trunk/research/http1-to-2/go.sum | 8 + trunk/research/http1-to-2/main.go | 63 + trunk/research/proto/cls.proto | 33 + trunk/research/srs-apm-http-raw/.gitignore | 3 + trunk/research/srs-apm-http-raw/go.mod | 12 + trunk/research/srs-apm-http-raw/go.sum | 442 ++++++ trunk/research/srs-apm-http-raw/main.go | 197 +++ trunk/research/srs-apm-http1/.gitignore | 3 + trunk/research/srs-apm-http1/go.mod | 11 + trunk/research/srs-apm-http1/go.sum | 454 ++++++ trunk/research/srs-apm-http1/main.go | 80 + trunk/research/srs-apm-http2/.gitignore | 3 + trunk/research/srs-apm-http2/go.mod | 11 + trunk/research/srs-apm-http2/go.sum | 454 ++++++ trunk/research/srs-apm-http2/main.go | 80 + trunk/research/wireshark-plugin/otel.lua | 42 + trunk/src/app/srs_app_config.cpp | 104 +- trunk/src/app/srs_app_config.hpp | 5 + trunk/src/app/srs_app_conn.cpp | 4 +- trunk/src/app/srs_app_edge.cpp | 53 +- trunk/src/app/srs_app_edge.hpp | 4 + trunk/src/app/srs_app_hybrid.cpp | 9 + trunk/src/app/srs_app_rtmp_conn.cpp | 111 +- trunk/src/app/srs_app_rtmp_conn.hpp | 5 + trunk/src/app/srs_app_statistic.cpp | 24 +- trunk/src/app/srs_app_tencentcloud.cpp | 1358 ++++++++++++++++- trunk/src/app/srs_app_tencentcloud.hpp | 435 +++++- trunk/src/app/srs_app_threads.cpp | 1 + trunk/src/core/srs_core_version5.hpp | 2 +- trunk/src/kernel/srs_kernel_error.cpp | 70 + trunk/src/kernel/srs_kernel_error.hpp | 744 ++++----- trunk/src/kernel/srs_kernel_utility.cpp | 23 +- trunk/src/kernel/srs_kernel_utility.hpp | 2 + trunk/src/main/srs_main_server.cpp | 6 + trunk/src/protocol/srs_protocol_protobuf.cpp | 20 + trunk/src/protocol/srs_protocol_protobuf.hpp | 9 + trunk/src/protocol/srs_protocol_rtmp_conn.cpp | 15 +- trunk/src/protocol/srs_protocol_rtmp_conn.hpp | 4 + .../src/protocol/srs_protocol_rtmp_stack.cpp | 2 +- trunk/src/utest/srs_utest_kernel.cpp | 124 +- trunk/src/utest/srs_utest_protocol.cpp | 318 ++-- trunk/src/utest/srs_utest_protocol2.cpp | 118 +- trunk/src/utest/srs_utest_reload.cpp | 194 ++- 49 files changed, 4989 insertions(+), 719 deletions(-) create mode 100644 trunk/research/http1-to-2/.gitignore create mode 100644 trunk/research/http1-to-2/Makefile create mode 100644 trunk/research/http1-to-2/go.mod create mode 100644 trunk/research/http1-to-2/go.sum create mode 100644 trunk/research/http1-to-2/main.go create mode 100644 trunk/research/proto/cls.proto create mode 100644 trunk/research/srs-apm-http-raw/.gitignore create mode 100644 trunk/research/srs-apm-http-raw/go.mod create mode 100644 trunk/research/srs-apm-http-raw/go.sum create mode 100644 trunk/research/srs-apm-http-raw/main.go create mode 100644 trunk/research/srs-apm-http1/.gitignore create mode 100644 trunk/research/srs-apm-http1/go.mod create mode 100644 trunk/research/srs-apm-http1/go.sum create mode 100644 trunk/research/srs-apm-http1/main.go create mode 100644 trunk/research/srs-apm-http2/.gitignore create mode 100644 trunk/research/srs-apm-http2/go.mod create mode 100644 trunk/research/srs-apm-http2/go.sum create mode 100644 trunk/research/srs-apm-http2/main.go create mode 100644 trunk/research/wireshark-plugin/otel.lua diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index b174c96e0..d67ce904d 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -4,6 +4,9 @@ ############################################################################################# # Global sections ############################################################################################# +# Config file, specified by cli such as `-c conf/srs.conf`. +# Overwrite by env SRS_CONFIG_FILE + # The id of server, for stat and api identification. # Note that SRS will generate a random id if not configured. # Overwrite by env SRS_SERVER_ID @@ -575,10 +578,10 @@ circuit_breaker { dying_pulse 5; } -# TencentCloud CLS config, logging to cloud. +# TencentCloud CLS(Cloud Log Service) config, logging to cloud. # See https://cloud.tencent.com/document/product/614/11254 tencentcloud_cls { - # Whether heartbeat is enabled. + # Whether CLS is enabled. # Overwrite by env SRS_TENCENTCLOUD_CLS_ENABLED # default: off enabled off; @@ -625,6 +628,29 @@ tencentcloud_cls { streams_ratio 1; } +# TencentCloud APM(Application Performance Management) config. +# See https://cloud.tencent.com/document/product/1463/57462 +tencentcloud_apm { + # Whether APM is enabled. + # Overwrite by env SRS_TENCENTCLOUD_APM_ENABLED + # default: off + enabled on; + # The APM token for authentication. See https://console.cloud.tencent.com/apm/monitor/access + # Overwrite by env SRS_TENCENTCLOUD_APM_TOKEN + token xxxxxxxx; + # The APM endpoint. See https://github.com/open-telemetry/opentelemetry-go/tree/main/exporters/otlp/otlptrace + # Overwrite by env SRS_TENCENTCLOUD_APM_ENDPOINT + endpoint ap-guangzhou.apm.tencentcs.com:55681; + # The service.name of resource. + # Overwrite by env SRS_TENCENTCLOUD_APM_SERVICE_NAME + # Default: srs-server + service_name srs-server; + # Whether enable logging for each log sending. + # Overwrite by env SRS_TENCENTCLOUD_APM_DEBUG_LOGGING + # Default: off + debug_logging off; +} + ############################################################################################# # heartbeat/stats sections ############################################################################################# diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index b77f559e9..ce5b58d22 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-09-16, APM: Support distributed tracing by Tencent Cloud APM. v5.0.64 * v5.0, 2022-09-16, For [#3179](https://github.com/ossrs/srs/issues/3179): WebRTC: Make sure the same m-lines order for offer and answer. v5.0.63 * v5.0, 2022-09-10, For [#3174](https://github.com/ossrs/srs/issues/3174): WebRTC: Support Unity to publish or play stream. v5.0.62 * v5.0, 2022-09-06, Fix [#3170](https://github.com/ossrs/srs/issues/3170): WebRTC: Support WHIP(WebRTC-HTTP ingestion protocol). v5.0.61 diff --git a/trunk/doc/Features.md b/trunk/doc/Features.md index f2653f8f8..f353210d9 100644 --- a/trunk/doc/Features.md +++ b/trunk/doc/Features.md @@ -18,6 +18,7 @@ The features of SRS. - [x] System: [Experimental] Support DVR in MP4 format, read [#738](https://github.com/ossrs/srs/issues/738). - [x] System: [Experimental] Support loongarch, loongson CPU, [#2689](https://github.com/ossrs/srs/issues/2689). - [x] System: [Experimental] Support Apple Silicon M1(aarch64), [#2747](https://github.com/ossrs/srs/issues/2747). +- [x] System: [Experimental] Support distributed tracing by Tencent Cloud APM. - [x] API: Support HTTP API([CN](https://ossrs.net/lts/zh-cn/docs/v4/doc/http-api), [EN](https://ossrs.io/lts/en-us/docs/v4/doc/http-api)) for system management. - [x] API: Support HTTP callback([CN](https://ossrs.net/lts/zh-cn/docs/v4/doc/http-callback), [EN](https://ossrs.io/lts/en-us/docs/v4/doc/http-callback)) for authentication and integration. - [x] API: Support reuse HTTP Stream port for HTTP API, [#2881](https://github.com/ossrs/srs/issues/2881). diff --git a/trunk/research/http1-to-2/.gitignore b/trunk/research/http1-to-2/.gitignore new file mode 100644 index 000000000..acafda82d --- /dev/null +++ b/trunk/research/http1-to-2/.gitignore @@ -0,0 +1,2 @@ +.idea +/http1-to-2 diff --git a/trunk/research/http1-to-2/Makefile b/trunk/research/http1-to-2/Makefile new file mode 100644 index 000000000..b89529dbf --- /dev/null +++ b/trunk/research/http1-to-2/Makefile @@ -0,0 +1,9 @@ +.PHONY: default clean + +default: ./http1-to-2 + +./http1-to-2: *.go *.mod + go build -o ./http1-to-2 . + +clean: + rm -f ./http1-to-2 diff --git a/trunk/research/http1-to-2/go.mod b/trunk/research/http1-to-2/go.mod new file mode 100644 index 000000000..ffdfc0c09 --- /dev/null +++ b/trunk/research/http1-to-2/go.mod @@ -0,0 +1,5 @@ +module http1-to-2 + +go 1.16 + +require golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c diff --git a/trunk/research/http1-to-2/go.sum b/trunk/research/http1-to-2/go.sum new file mode 100644 index 000000000..be5dd5d8d --- /dev/null +++ b/trunk/research/http1-to-2/go.sum @@ -0,0 +1,8 @@ +golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6YKjdNT2bsvlayjqhes= +golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/trunk/research/http1-to-2/main.go b/trunk/research/http1-to-2/main.go new file mode 100644 index 000000000..6b9947d38 --- /dev/null +++ b/trunk/research/http1-to-2/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "context" + "crypto/tls" + "flag" + "fmt" + "golang.org/x/net/http2" + "net" + "net/http" + "net/http/httputil" + "net/url" + "os" + "strings" +) + +func main() { + var listen string + flag.StringVar(&listen, "listen", ":4317", "The listen endpoint, overwrite by env SRS_HTTP1TO2_LISTEN, such as :4317") + + var backend string + flag.StringVar(&backend, "backend", "ap-guangzhou.apm.tencentcs.com:4317", "The proxy backend, overwrite by env SRS_HTTP1TO2_BACKEND, such as ap-guangzhou.apm.tencentcs.com:4317") + + flag.Parse() + + if os.Getenv("SRS_HTTP1TO2_LISTEN") != "" { + listen = os.Getenv("SRS_HTTP1TO2_LISTEN") + } + if os.Getenv("SRS_HTTP1TO2_BACKEND") != "" { + backend = os.Getenv("SRS_HTTP1TO2_BACKEND") + } + + wrapURL := func(backend string) string { + if !strings.HasPrefix(backend, "http://") && !strings.HasPrefix(backend, "https://") { + return "http://" + backend + } + return backend + } + + u, err := url.Parse(wrapURL(backend)) + if err != nil { + panic(err) + } + fmt.Println(fmt.Sprintf("Proxy HTTP1 to HTTP2, listen=%v, backend=%v, url=%v", listen, backend, u)) + + // Proxy HTTP/1 requests to HTTP/2 server. + p := httputil.NewSingleHostReverseProxy(u) + p.Transport = &http2.Transport{ + AllowHTTP: true, + DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { + return (&net.Dialer{}).DialContext(ctx, network, addr) + }, + } + + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Println(fmt.Sprintf("Proxy to %v, req=%v", u, r.URL)) + p.ServeHTTP(w, r) + }) + + if err := http.ListenAndServe(listen, nil); err != nil { + panic(err) + } +} diff --git a/trunk/research/proto/cls.proto b/trunk/research/proto/cls.proto new file mode 100644 index 000000000..ead5c9e5c --- /dev/null +++ b/trunk/research/proto/cls.proto @@ -0,0 +1,33 @@ +// See https://cloud.tencent.com/document/api/614/16873 +package cls; + +message Log +{ + message Content + { + required string key = 1; // Field name or key + required string value = 2; // Field value + } + required int64 time = 1; // Timestamp in UNIX(seconds or milliseconds) + repeated Content contents = 2; // A group of contents +} + +message LogTag +{ + required string key = 1; + required string value = 2; +} + +message LogGroup +{ + repeated Log logs = 1; // A group of logs. + optional string contextFlow = 2; // Not used. + optional string filename = 3; // Log filename. + optional string source = 4; // Log source, such as server IP. + repeated LogTag logTags = 5; +} + +message LogGroupList +{ + repeated LogGroup logGroupList = 1; // A group of log group. +} \ No newline at end of file diff --git a/trunk/research/srs-apm-http-raw/.gitignore b/trunk/research/srs-apm-http-raw/.gitignore new file mode 100644 index 000000000..b2aaf06d4 --- /dev/null +++ b/trunk/research/srs-apm-http-raw/.gitignore @@ -0,0 +1,3 @@ +.idea +srs-apm + diff --git a/trunk/research/srs-apm-http-raw/go.mod b/trunk/research/srs-apm-http-raw/go.mod new file mode 100644 index 000000000..8236f95d0 --- /dev/null +++ b/trunk/research/srs-apm-http-raw/go.mod @@ -0,0 +1,12 @@ +module srs-apm + +go 1.16 + +require ( + github.com/golang/protobuf v1.5.2 + go.opentelemetry.io/otel v1.9.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0 + go.opentelemetry.io/otel/sdk v1.9.0 + go.opentelemetry.io/otel/trace v1.9.0 + go.opentelemetry.io/proto/otlp v0.18.0 +) diff --git a/trunk/research/srs-apm-http-raw/go.sum b/trunk/research/srs-apm-http-raw/go.sum new file mode 100644 index 000000000..2edf518a3 --- /dev/null +++ b/trunk/research/srs-apm-http-raw/go.sum @@ -0,0 +1,442 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= +go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0 h1:NN90Cuna0CnBg8YNu1Q0V35i2E8LDByFOwHRCq/ZP9I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0/go.mod h1:0EsCXjZAiiZGnLdEUXM9YjCKuuLZMYyglh2QDXcYKVA= +go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= +go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= +go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= +go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.18.0 h1:W5hyXNComRa23tGpKwG+FRAc4rfF6ZUg1JReK+QHS80= +go.opentelemetry.io/proto/otlp v0.18.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 h1:b9mVrqYfq3P4bCdaLg1qtBnPzUYgglsIdjZkL/fQVOE= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/trunk/research/srs-apm-http-raw/main.go b/trunk/research/srs-apm-http-raw/main.go new file mode 100644 index 000000000..e4eed66d5 --- /dev/null +++ b/trunk/research/srs-apm-http-raw/main.go @@ -0,0 +1,197 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "github.com/golang/protobuf/proto" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/trace" + coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1" + tracepb "go.opentelemetry.io/proto/otlp/trace/v1" + "net/http" + "os" + "time" +) + +type httpRawClientForAPM struct { + endpoint, urlPath string +} + +func (v *httpRawClientForAPM) Start(ctx context.Context) error { + fmt.Println("http1: Transport start") + return nil +} + +func (v *httpRawClientForAPM) Stop(ctx context.Context) error { + fmt.Println("http1: Transport stop") + return nil +} + +func (v *httpRawClientForAPM) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error { + // Wrap with request message. + m := &coltracepb.ExportTraceServiceRequest{ + ResourceSpans: protoSpans, + } + + // Marshal to bytes. + b, err := proto.Marshal(m) + if err != nil { + return err + } + + // Upload by HTTP/1 + url := fmt.Sprintf("http://%v%v", v.endpoint, v.urlPath) + r, err := http.NewRequest("POST", url, bytes.NewReader(b)) + if err != nil { + return err + } + r.Header.Set("Content-Type", "application/x-protobuf") // For http + + res, err := http.DefaultClient.Do(r) + if err != nil { + return err + } + defer res.Body.Close() + + var nn int + for _, span := range protoSpans { + for _, span2 := range span.ScopeSpans { + nn += len(span2.Spans) + } + } + + fmt.Println(fmt.Sprintf("http1: Upload %v/%v spans to %v%v, response is %v", len(protoSpans), nn, v.endpoint, v.urlPath, res.Status)) + return nil +} + +func main() { + if os.Getenv("TOKEN") == "" { + panic("no env TOKEN, see https://console.cloud.tencent.com/apm/monitor/access") + } + + // The gRPC client defaults to https://localhost:4317 and the HTTP client https://localhost:4318. + // See https://github.com/open-telemetry/opentelemetry-go/tree/main/exporters/otlp/otlptrace + endpoint := "ap-guangzhou.apm.tencentcs.com:55681" + urlPath := "/v1/traces" + service := "srs-server" + fmt.Println(fmt.Sprintf("main: APM endpoint=%v, urlPath=%v, token=%vB, service=%v", endpoint, urlPath, len(os.Getenv("TOKEN")), service)) + + // Create exporter to upload spans over HTTP/1.1 + ctx := context.Background() + exporter, err := otlptrace.New(ctx, &httpRawClientForAPM{endpoint, urlPath}) + if err != nil { + panic(err) + } + + // Create resource for tracer provider. + r, err := resource.New(ctx, []resource.Option{ + resource.WithAttributes(attribute.KeyValue{ + Key: "token", Value: attribute.StringValue(os.Getenv("TOKEN")), + }), + resource.WithAttributes(attribute.KeyValue{ + Key: "service.name", Value: attribute.StringValue(service), + }), + }...) + if err != nil { + panic(err) + } + + // Create tracer provider for tracing. + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(r), + ) + defer tp.Shutdown(ctx) + + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + fmt.Println("main: Init ok") + + // Create global tracer. + tracer := otel.GetTracerProvider().Tracer("app") + ctx, span := tracer.Start(context.Background(), "main", trace.WithSpanKind(trace.SpanKindServer)) + time.Sleep(100 * time.Millisecond) + defer span.End() + + ctx, span2 := tracer.Start(ctx, "sub", trace.WithSpanKind(trace.SpanKindInternal)) + time.Sleep(70 * time.Millisecond) + span2.End() + + sc := span.SpanContext() + fmt.Println(fmt.Sprintf("main: Done, trace=%v, span=%v", sc.TraceID().String(), sc.SpanID().String())) + + foo := func() { + _, span5 := tracer.Start(ctx, "failed") + span5.RecordError(fmt.Errorf("default err service=%v", service), trace.WithStackTrace(true)) + span5.SetStatus(codes.Error, fmt.Sprintf("failed span endpoint=%v", endpoint)) + span5.End() + } + foo() + + // Link for span. + _, span6 := tracer.Start(context.Background(), "linker", trace.WithSpanKind(trace.SpanKindServer), + trace.WithNewRoot(), trace.WithLinks(trace.LinkFromContext(ctx))) + defer span6.End() + + // Propagator over HTTP header, start a client span and inject HTTP header. + ctx, span3 := tracer.Start(ctx, "call", trace.WithSpanKind(trace.SpanKindClient)) + defer span3.End() + + header := make(http.Header) + propagators := otel.GetTextMapPropagator() + propagators.Inject(ctx, propagation.HeaderCarrier(header)) + fmt.Println(fmt.Sprintf("main: Save to header %v, span=%v", header, span3.SpanContext().SpanID().String())) + + // Mock another service. + mockServer(endpoint, urlPath, "origin", header) +} + +func mockServer(endpoint, urlPath, service string, header http.Header) { + // Create exporter to upload spans over HTTP/1.1 + ctx := context.Background() + exporter, err := otlptrace.New(ctx, &httpRawClientForAPM{endpoint, urlPath}) + if err != nil { + panic(err) + } + + // Create resource for tracer provider. + r, err := resource.New(ctx, []resource.Option{ + resource.WithAttributes(attribute.KeyValue{ + Key: "token", Value: attribute.StringValue(os.Getenv("TOKEN")), + }), + resource.WithAttributes(attribute.KeyValue{ + Key: "service.name", Value: attribute.StringValue(service), + }), + }...) + if err != nil { + panic(err) + } + + // Create tracer provider for tracing. + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(r), + ) + defer tp.Shutdown(ctx) + + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + fmt.Println("main: Init ok") + + tracer := otel.GetTracerProvider().Tracer("app") + propagators := otel.GetTextMapPropagator() + + ctx = propagators.Extract(context.Background(), propagation.HeaderCarrier(header)) + ctx, span4 := tracer.Start(ctx, "callee", trace.WithSpanKind(trace.SpanKindServer)) + defer span4.End() + fmt.Println(fmt.Sprintf("main: Restore from header %v, span=%v", header, span4.SpanContext().SpanID().String())) +} diff --git a/trunk/research/srs-apm-http1/.gitignore b/trunk/research/srs-apm-http1/.gitignore new file mode 100644 index 000000000..b2aaf06d4 --- /dev/null +++ b/trunk/research/srs-apm-http1/.gitignore @@ -0,0 +1,3 @@ +.idea +srs-apm + diff --git a/trunk/research/srs-apm-http1/go.mod b/trunk/research/srs-apm-http1/go.mod new file mode 100644 index 000000000..59bb8076d --- /dev/null +++ b/trunk/research/srs-apm-http1/go.mod @@ -0,0 +1,11 @@ +module srs-apm + +go 1.16 + +require ( + go.opentelemetry.io/otel v1.9.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0 + go.opentelemetry.io/otel/sdk v1.9.0 + go.opentelemetry.io/otel/trace v1.9.0 +) diff --git a/trunk/research/srs-apm-http1/go.sum b/trunk/research/srs-apm-http1/go.sum new file mode 100644 index 000000000..2f82e89bf --- /dev/null +++ b/trunk/research/srs-apm-http1/go.sum @@ -0,0 +1,454 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= +go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0 h1:ggqApEjDKczicksfvZUCxuvoyDmR6Sbm56LwiK8DVR0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0 h1:NN90Cuna0CnBg8YNu1Q0V35i2E8LDByFOwHRCq/ZP9I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0/go.mod h1:0EsCXjZAiiZGnLdEUXM9YjCKuuLZMYyglh2QDXcYKVA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0 h1:M0/hqGuJBLeIEu20f89H74RGtqV2dn+SFWEz9ATAAwY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0/go.mod h1:K5G92gbtCrYJ0mn6zj9Pst7YFsDFuvSYEhYKRMcufnM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0 h1:FAF9l8Wjxi9Ad2k/vLTfHZyzXYX72C62wBGpV3G6AIo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0/go.mod h1:smUdtylgc0YQiUr2PuifS4hBXhAS5xtR6WQhxP1wiNA= +go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= +go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= +go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= +go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.18.0 h1:W5hyXNComRa23tGpKwG+FRAc4rfF6ZUg1JReK+QHS80= +go.opentelemetry.io/proto/otlp v0.18.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 h1:b9mVrqYfq3P4bCdaLg1qtBnPzUYgglsIdjZkL/fQVOE= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/trunk/research/srs-apm-http1/main.go b/trunk/research/srs-apm-http1/main.go new file mode 100644 index 000000000..16c789973 --- /dev/null +++ b/trunk/research/srs-apm-http1/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "context" + "fmt" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/trace" + "os" + "time" +) + +func initTraceProvider(ctx context.Context, endpoint, token string) (*sdktrace.TracerProvider, error) { + opts := []otlptracehttp.Option{ + otlptracehttp.WithEndpoint(endpoint), + otlptracehttp.WithInsecure(), + } + exporter, err := otlptracehttp.New(ctx, opts...) + if err != nil { + return nil, err + } + + r, err := resource.New(ctx, []resource.Option{ + resource.WithAttributes(attribute.KeyValue{ + Key: "token", Value: attribute.StringValue(token), + }), + resource.WithAttributes(attribute.KeyValue{ + Key: "service.name", Value: attribute.StringValue("srs-server"), + }), + }...) + if err != nil { + return nil, err + } + + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(r), + ) + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + return tp, nil +} + +func main() { + if os.Getenv("TOKEN") == "" { + panic("no env TOKEN, see https://console.cloud.tencent.com/apm/monitor/access") + } + + // The gRPC client defaults to https://localhost:4317 and the HTTP client https://localhost:4318. + // See https://github.com/open-telemetry/opentelemetry-go/tree/main/exporters/otlp/otlptrace + endpoint := "ap-guangzhou.apm.tencentcs.com:55681" + fmt.Println(fmt.Sprintf("APM endpoint=%v, token=%vB", endpoint, len(os.Getenv("TOKEN")))) + + ctx := context.Background() + if tp, err := initTraceProvider(ctx, endpoint, os.Getenv("TOKEN")); err != nil { + panic(err) + } else { + defer tp.Shutdown(ctx) + } + + fmt.Println("init ok") + + //////////////////////////////////////////////// + // Create global tracer. + tracer := otel.Tracer("app") + ctx, span := tracer.Start(context.Background(), "main", trace.WithSpanKind(trace.SpanKindServer)) + time.Sleep(100 * time.Millisecond) + defer span.End() + + _, span2 := tracer.Start(ctx, "sub") + time.Sleep(70 * time.Millisecond) + span2.End() + + fmt.Println("done") +} diff --git a/trunk/research/srs-apm-http2/.gitignore b/trunk/research/srs-apm-http2/.gitignore new file mode 100644 index 000000000..b2aaf06d4 --- /dev/null +++ b/trunk/research/srs-apm-http2/.gitignore @@ -0,0 +1,3 @@ +.idea +srs-apm + diff --git a/trunk/research/srs-apm-http2/go.mod b/trunk/research/srs-apm-http2/go.mod new file mode 100644 index 000000000..59bb8076d --- /dev/null +++ b/trunk/research/srs-apm-http2/go.mod @@ -0,0 +1,11 @@ +module srs-apm + +go 1.16 + +require ( + go.opentelemetry.io/otel v1.9.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0 + go.opentelemetry.io/otel/sdk v1.9.0 + go.opentelemetry.io/otel/trace v1.9.0 +) diff --git a/trunk/research/srs-apm-http2/go.sum b/trunk/research/srs-apm-http2/go.sum new file mode 100644 index 000000000..2f82e89bf --- /dev/null +++ b/trunk/research/srs-apm-http2/go.sum @@ -0,0 +1,454 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= +go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0 h1:ggqApEjDKczicksfvZUCxuvoyDmR6Sbm56LwiK8DVR0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0 h1:NN90Cuna0CnBg8YNu1Q0V35i2E8LDByFOwHRCq/ZP9I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0/go.mod h1:0EsCXjZAiiZGnLdEUXM9YjCKuuLZMYyglh2QDXcYKVA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0 h1:M0/hqGuJBLeIEu20f89H74RGtqV2dn+SFWEz9ATAAwY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0/go.mod h1:K5G92gbtCrYJ0mn6zj9Pst7YFsDFuvSYEhYKRMcufnM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0 h1:FAF9l8Wjxi9Ad2k/vLTfHZyzXYX72C62wBGpV3G6AIo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0/go.mod h1:smUdtylgc0YQiUr2PuifS4hBXhAS5xtR6WQhxP1wiNA= +go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= +go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= +go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= +go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.18.0 h1:W5hyXNComRa23tGpKwG+FRAc4rfF6ZUg1JReK+QHS80= +go.opentelemetry.io/proto/otlp v0.18.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 h1:b9mVrqYfq3P4bCdaLg1qtBnPzUYgglsIdjZkL/fQVOE= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/trunk/research/srs-apm-http2/main.go b/trunk/research/srs-apm-http2/main.go new file mode 100644 index 000000000..f8f852b88 --- /dev/null +++ b/trunk/research/srs-apm-http2/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "context" + "fmt" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/trace" + "os" + "time" +) + +func initTraceProvider(ctx context.Context, endpoint, token string) (*sdktrace.TracerProvider, error) { + opts := []otlptracegrpc.Option{ + otlptracegrpc.WithEndpoint(endpoint), + otlptracegrpc.WithInsecure(), + } + exporter, err := otlptracegrpc.New(ctx, opts...) + if err != nil { + return nil, err + } + + r, err := resource.New(ctx, []resource.Option{ + resource.WithAttributes(attribute.KeyValue{ + Key: "token", Value: attribute.StringValue(token), + }), + resource.WithAttributes(attribute.KeyValue{ + Key: "service.name", Value: attribute.StringValue("srs-server"), + }), + }...) + if err != nil { + return nil, err + } + + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(r), + ) + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + return tp, nil +} + +func main() { + if os.Getenv("TOKEN") == "" { + panic("no env TOKEN, see https://console.cloud.tencent.com/apm/monitor/access") + } + + // The gRPC client defaults to https://localhost:4317 and the HTTP client https://localhost:4318. + // See https://github.com/open-telemetry/opentelemetry-go/tree/main/exporters/otlp/otlptrace + endpoint := "ap-guangzhou.apm.tencentcs.com:4317" + fmt.Println(fmt.Sprintf("APM endpoint=%v, token=%vB", endpoint, len(os.Getenv("TOKEN")))) + + ctx := context.Background() + if tp,err := initTraceProvider(ctx, endpoint, os.Getenv("TOKEN")); err != nil { + panic(err) + } else { + defer tp.Shutdown(ctx) + } + + fmt.Println("init ok") + + //////////////////////////////////////////////// + // Create global tracer. + tracer := otel.Tracer("app") + ctx, span := tracer.Start(context.Background(), "main", trace.WithSpanKind(trace.SpanKindServer)) + time.Sleep(100 * time.Millisecond) + defer span.End() + + _, span2 := tracer.Start(ctx, "sub") + time.Sleep(70 * time.Millisecond) + span2.End() + + fmt.Println("done") +} diff --git a/trunk/research/wireshark-plugin/otel.lua b/trunk/research/wireshark-plugin/otel.lua new file mode 100644 index 000000000..1c1ab3ebe --- /dev/null +++ b/trunk/research/wireshark-plugin/otel.lua @@ -0,0 +1,42 @@ +-- To apply this wireshark plugin: +-- mkdir -p ~/.local/lib/wireshark/plugins +-- ln -sf $(pwd)/otel.lua ~/.local/lib/wireshark/plugins/otel.lua +-- Download proto files for otel: +-- git clone https://github.com/open-telemetry/opentelemetry-proto.git +-- Setup Wireshark `Protobuf search paths` to load the proto files at `Preferences > Protocols > Protobuf`: +-- ~/git/opentelemetry-proto +-- ~/git/srs/trunk/research/proto +-- Start capture or parsing file. + +do + function string_starts_with(str, start) + return str ~= nil and str:sub(1, #start) == start + end + + -- See https://gitlab.com/wireshark/wireshark/-/wikis/Protobuf#write-your-own-protobuf-udp-or-tcp-dissectors + local protobuf_dissector = Dissector.get("protobuf") + -- Only parsing Protobuf over HTTP, with http uri. + local f_http_uri = Field.new("http.request.uri") + + local otel_proto = Proto("otel_proto", "Extra analysis of the HTTP protocol"); + function otel_proto.dissector(tvb, pinfo, tree) + local http_uri = f_http_uri() + if http_uri == nil then return end + + -- See https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/collector/trace/v1/trace_service.proto + if string_starts_with(http_uri.value, "/v1/traces") then + pinfo.private["pb_msg_type"] = "message," .. "opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest" + pcall(Dissector.call, protobuf_dissector, tvb, pinfo, tree) + end + + -- See https://cloud.tencent.com/document/api/614/16873 + if string_starts_with(http_uri.value, "/structuredlog") then + pinfo.private["pb_msg_type"] = "message," .. "cls.LogGroupList" + pcall(Dissector.call, protobuf_dissector, tvb, pinfo, tree) + end + end + + local tbl = DissectorTable.get("media_type") + tbl:add("application/x-protobuf", otel_proto) + print("Add application/x-protobuf dissector", otel_proto) +end \ No newline at end of file diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index d8e181134..6c6b3eba2 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -1826,6 +1826,13 @@ srs_error_t SrsConfig::parse_options(int argc, char** argv) } } + // Overwrite the config by env SRS_CONFIG_FILE. + if (::getenv("SRS_CONFIG_FILE")) { + string ov = config_file; + config_file = ::getenv("SRS_CONFIG_FILE"); + srs_trace("ENV: Overwrite config %s to %s", ov.c_str(), config_file.c_str()); + } + // Parse the matched config file. err = parse_file(config_file.c_str()); @@ -2211,7 +2218,7 @@ srs_error_t SrsConfig::check_normal_config() std::string n = conf->name; if (n != "listen" && n != "pid" && n != "chunk_size" && n != "ff_log_dir" && n != "srs_log_tank" && n != "srs_log_level" && n != "srs_log_file" - && n != "max_connections" && n != "daemon" && n != "heartbeat" + && n != "max_connections" && n != "daemon" && n != "heartbeat" && n != "tencentcloud_apm" && n != "http_api" && n != "stats" && n != "vhost" && n != "pithy_print_ms" && n != "http_server" && n != "stream_caster" && n != "rtc_server" && n != "srt_server" && n != "utc_time" && n != "work_dir" && n != "asprocess" && n != "server_id" @@ -3442,6 +3449,101 @@ string SrsConfig::get_tencentcloud_cls_topic_id() return conf->arg0(); } +bool SrsConfig::get_tencentcloud_apm_enabled() +{ + SRS_OVERWRITE_BY_ENV_BOOL("SRS_TENCENTCLOUD_APM_ENABLED"); + + static bool DEFAULT = false; + + SrsConfDirective* conf = root->get("tencentcloud_apm"); + if (!conf) { + return DEFAULT; + } + + conf = conf->get("enabled"); + if (!conf) { + return DEFAULT; + } + + return SRS_CONF_PERFER_FALSE(conf->arg0()); +} + +string SrsConfig::get_tencentcloud_apm_token() +{ + SRS_OVERWRITE_BY_ENV_STRING("SRS_TENCENTCLOUD_APM_TOKEN"); + + static string DEFAULT = ""; + + SrsConfDirective* conf = root->get("tencentcloud_apm"); + if (!conf) { + return DEFAULT; + } + + conf = conf->get("token"); + if (!conf) { + return DEFAULT; + } + + return conf->arg0(); +} + +string SrsConfig::get_tencentcloud_apm_endpoint() +{ + SRS_OVERWRITE_BY_ENV_STRING("SRS_TENCENTCLOUD_APM_ENDPOINT"); + + static string DEFAULT = ""; + + SrsConfDirective* conf = root->get("tencentcloud_apm"); + if (!conf) { + return DEFAULT; + } + + conf = conf->get("endpoint"); + if (!conf) { + return DEFAULT; + } + + return conf->arg0(); +} + +string SrsConfig::get_tencentcloud_apm_service_name() +{ + SRS_OVERWRITE_BY_ENV_STRING("SRS_TENCENTCLOUD_APM_SERVICE_NAME"); + + static string DEFAULT = "srs-server"; + + SrsConfDirective* conf = root->get("tencentcloud_apm"); + if (!conf) { + return DEFAULT; + } + + conf = conf->get("service_name"); + if (!conf) { + return DEFAULT; + } + + return conf->arg0(); +} + +bool SrsConfig::get_tencentcloud_apm_debug_logging() +{ + SRS_OVERWRITE_BY_ENV_BOOL("SRS_TENCENTCLOUD_APM_DEBUG_LOGGING"); + + static bool DEFAULT = false; + + SrsConfDirective* conf = root->get("tencentcloud_apm"); + if (!conf) { + return DEFAULT; + } + + conf = conf->get("debug_logging"); + if (!conf) { + return DEFAULT; + } + + return SRS_CONF_PERFER_FALSE(conf->arg0()); +} + vector SrsConfig::get_stream_casters() { srs_assert(root); diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index bb8920a1b..1967500cf 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -469,6 +469,11 @@ public: virtual std::string get_tencentcloud_cls_secret_key(); virtual std::string get_tencentcloud_cls_endpoint(); virtual std::string get_tencentcloud_cls_topic_id(); + virtual bool get_tencentcloud_apm_enabled(); + virtual std::string get_tencentcloud_apm_token(); + virtual std::string get_tencentcloud_apm_endpoint(); + virtual std::string get_tencentcloud_apm_service_name(); + virtual bool get_tencentcloud_apm_debug_logging(); // stream_caster section public: // Get all stream_caster in config file. diff --git a/trunk/src/app/srs_app_conn.cpp b/trunk/src/app/srs_app_conn.cpp index 8741fa22f..836e76513 100644 --- a/trunk/src/app/srs_app_conn.cpp +++ b/trunk/src/app/srs_app_conn.cpp @@ -614,7 +614,7 @@ srs_error_t SrsBufferedReadWriter::read(void* buf, size_t size, ssize_t* nread) return io_->read(buf, size, nread); } - int nn = srs_min(buf_->left(), size); + int nn = srs_min(buf_->left(), (int)size); *nread = nn; if (nn) { @@ -629,7 +629,7 @@ srs_error_t SrsBufferedReadWriter::read_fully(void* buf, size_t size, ssize_t* n return io_->read_fully(buf, size, nread); } - int nn = srs_min(buf_->left(), size); + int nn = srs_min(buf_->left(), (int)size); if (nn) { buf_->read_bytes((char*)buf, nn); } diff --git a/trunk/src/app/srs_app_edge.cpp b/trunk/src/app/srs_app_edge.cpp index 46dfcd3be..eedd359ce 100644 --- a/trunk/src/app/srs_app_edge.cpp +++ b/trunk/src/app/srs_app_edge.cpp @@ -34,6 +34,8 @@ using namespace std; #include #include #include +#include +#include // when edge timeout, retry next. #define SRS_EDGE_INGESTER_TIMEOUT (5 * SRS_UTIME_SECONDS) @@ -107,7 +109,11 @@ srs_error_t SrsEdgeRtmpUpstream::connect(SrsRequest* r, SrsLbRoundRobin* lb) srs_utime_t cto = SRS_EDGE_INGESTER_TIMEOUT; srs_utime_t sto = SRS_CONSTS_RTMP_PULSE; sdk = new SrsSimpleRtmpClient(url, cto, sto); - + + // Create a client span and store it to an AMF0 propagator. + ISrsApmSpan* span_client = _srs_apm->inject(_srs_apm->span("edge-pull")->set_kind(SrsApmKindClient)->as_child(_srs_apm->load()), sdk->extra_args()); + SrsAutoFree(ISrsApmSpan, span_client); + if ((err = sdk->connect()) != srs_success) { return srs_error_wrap(err, "edge pull %s failed, cto=%dms, sto=%dms.", url.c_str(), srsu2msi(cto), srsu2msi(sto)); } @@ -387,6 +393,7 @@ SrsEdgeIngester::SrsEdgeIngester() source = NULL; edge = NULL; req = NULL; + span_main_ = NULL; upstream = new SrsEdgeRtmpUpstream(""); lb = new SrsLbRoundRobin(); @@ -396,7 +403,8 @@ SrsEdgeIngester::SrsEdgeIngester() SrsEdgeIngester::~SrsEdgeIngester() { stop(); - + + srs_freep(span_main_); srs_freep(upstream); srs_freep(lb); srs_freep(trd); @@ -407,7 +415,12 @@ srs_error_t SrsEdgeIngester::initialize(SrsLiveSource* s, SrsPlayEdge* e, SrsReq source = s; edge = e; req = r; - + + // We create a dedicate span for edge ingester, and all players will link to this one. + // Note that we use a producer span and end it immediately. + srs_assert(!span_main_); + span_main_ = _srs_apm->span("edge")->set_kind(SrsApmKindProducer)->end(); + return srs_success; } @@ -445,12 +458,23 @@ string SrsEdgeIngester::get_curr_origin() return lb->selected(); } +ISrsApmSpan* SrsEdgeIngester::span() +{ + srs_assert(span_main_); + return span_main_; +} + // when error, edge ingester sleep for a while and retry. #define SRS_EDGE_INGESTER_CIMS (3 * SRS_UTIME_SECONDS) srs_error_t SrsEdgeIngester::cycle() { srs_error_t err = srs_success; + + // Save span from parent coroutine to current coroutine context, so that we can load if in this coroutine, for + // example to use it in SrsEdgeRtmpUpstream which use RTMP or FLV client to connect to upstream server. + _srs_apm->store(span_main_); + srs_assert(span_main_); while (true) { // We always check status first. @@ -459,11 +483,19 @@ srs_error_t SrsEdgeIngester::cycle() return srs_error_wrap(err, "edge ingester"); } + srs_assert(span_main_); + ISrsApmSpan* start = _srs_apm->span("edge-start")->set_kind(SrsApmKindConsumer)->as_child(span_main_)->end(); + srs_freep(start); + if ((err = do_cycle()) != srs_success) { srs_warn("EdgeIngester: Ignore error, %s", srs_error_desc(err).c_str()); srs_freep(err); } + srs_assert(span_main_); + ISrsApmSpan* stop = _srs_apm->span("edge-stop")->set_kind(SrsApmKindConsumer)->as_child(span_main_)->end(); + srs_freep(stop); + srs_usleep(SRS_EDGE_INGESTER_CIMS); } @@ -700,7 +732,7 @@ srs_error_t SrsEdgeForwarder::initialize(SrsLiveSource* s, SrsPublishEdge* e, Sr source = s; edge = e; req = r; - + return srs_success; } @@ -733,6 +765,11 @@ srs_error_t SrsEdgeForwarder::start() srs_utime_t cto = SRS_EDGE_FORWARDER_TIMEOUT; srs_utime_t sto = SRS_CONSTS_RTMP_TIMEOUT; sdk = new SrsSimpleRtmpClient(url, cto, sto); + + // Create a client span and store it to an AMF0 propagator. + // Note that we are able to load the span from coroutine context because in the same coroutine. + ISrsApmSpan* span_client = _srs_apm->inject(_srs_apm->span("edge-push")->set_kind(SrsApmKindClient)->as_child(_srs_apm->load()), sdk->extra_args()); + SrsAutoFree(ISrsApmSpan, span_client); if ((err = sdk->connect()) != srs_success) { return srs_error_wrap(err, "sdk connect %s failed, cto=%dms, sto=%dms.", url.c_str(), srsu2msi(cto), srsu2msi(sto)); @@ -919,6 +956,14 @@ srs_error_t SrsPlayEdge::on_client_play() } else if (state == SrsEdgeStateIngestStopping) { return srs_error_new(ERROR_RTMP_EDGE_PLAY_STATE, "state is stopping"); } + + // APM bind client span to edge span, which fetch stream from upstream server. + // We create a new span to link the two span, because these two spans might be ended. + if (ingester->span() && _srs_apm->load()) { + ISrsApmSpan* from = _srs_apm->span("play-link")->as_child(_srs_apm->load()); + ISrsApmSpan* to = _srs_apm->span("edge-link")->as_child(ingester->span())->link(from); + srs_freep(from); srs_freep(to); + } return err; } diff --git a/trunk/src/app/srs_app_edge.hpp b/trunk/src/app/srs_app_edge.hpp index 1c5425874..10aca9281 100644 --- a/trunk/src/app/srs_app_edge.hpp +++ b/trunk/src/app/srs_app_edge.hpp @@ -32,6 +32,7 @@ class SrsHttpClient; class ISrsHttpMessage; class SrsHttpFileReader; class SrsFlvDecoder; +class ISrsApmSpan; // The state of edge, auto machine enum SrsEdgeState @@ -142,6 +143,7 @@ private: SrsCoroutine* trd; SrsLbRoundRobin* lb; SrsEdgeUpstream* upstream; + ISrsApmSpan* span_main_; public: SrsEdgeIngester(); virtual ~SrsEdgeIngester(); @@ -150,6 +152,8 @@ public: virtual srs_error_t start(); virtual void stop(); virtual std::string get_curr_origin(); + // Get the current main span. Note that it might be NULL. + ISrsApmSpan* span(); // Interface ISrsReusableThread2Handler public: virtual srs_error_t cycle(); diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 0f285b487..d3bf71e31 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -185,6 +185,9 @@ srs_error_t SrsHybridServer::initialize() if ((err = _srs_cls->initialize()) != srs_success) { return srs_error_wrap(err, "cls client"); } + if ((err = _srs_apm->initialize()) != srs_success) { + return srs_error_wrap(err, "apm client"); + } // Register some timers. timer20ms_->subscribe(clock_monitor_); @@ -396,6 +399,12 @@ srs_error_t SrsHybridServer::on_timer(srs_utime_t interval) srs_freep(err); } + // Report logs to APM if enabled. + if ((err = _srs_apm->report()) != srs_success) { + srs_warn("ignore apm err %s", srs_error_desc(err).c_str()); + srs_freep(err); + } + return err; } diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index dc49fcb1a..7fee3736c 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -38,6 +38,7 @@ using namespace std; #include #include #include +#include // the timeout in srs_utime_t to wait encoder to republish // if timeout, close the connection. @@ -100,6 +101,9 @@ SrsRtmpConn::SrsRtmpConn(SrsServer* svr, srs_netfd_t c, string cip, int cport) ip = cip; port = cport; create_time = srsu2ms(srs_get_system_time()); + span_main_ = _srs_apm->dummy(); + span_connect_ = _srs_apm->dummy(); + span_client_ = _srs_apm->dummy(); trd = new SrsSTCoroutine("rtmp", this, _srs_context->get_id()); kbps = new SrsNetworkKbps(); @@ -145,6 +149,9 @@ SrsRtmpConn::~SrsRtmpConn() srs_freep(rtmp); srs_freep(refer); srs_freep(security); + srs_freep(span_main_); + srs_freep(span_connect_); + srs_freep(span_client_); } std::string SrsRtmpConn::desc() @@ -152,13 +159,27 @@ std::string SrsRtmpConn::desc() return "RtmpConn"; } +std::string srs_ipv4_string(uint32_t rip) +{ + return srs_fmt("%d.%d.%d.%d", uint8_t(rip>>24), uint8_t(rip>>16), uint8_t(rip>>8), uint8_t(rip)); +} + // TODO: return detail message when error for client. srs_error_t SrsRtmpConn::do_cycle() { srs_error_t err = srs_success; + + // We should keep the root span to alive util connection closed. + // Note that we use producer and consumer span because RTMP connection is long polling connection. + // Note that we also store this span in coroutine context, so that edge could load it. + srs_freep(span_main_); + span_main_ = _srs_apm->span("rtmp")->set_kind(SrsApmKindServer)->attr("cip", ip) + ->attr("cid", _srs_context->get_id().c_str()); - srs_trace("RTMP client ip=%s:%d, fd=%d", ip.c_str(), port, srs_netfd_fileno(stfd)); - + srs_trace("RTMP client ip=%s:%d, fd=%d, trace=%s, span=%s", ip.c_str(), port, srs_netfd_fileno(stfd), + span_main_->format_trace_id(), span_main_->format_span_id() + ); + rtmp->set_recv_timeout(SRS_CONSTS_RTMP_TIMEOUT); rtmp->set_send_timeout(SRS_CONSTS_RTMP_TIMEOUT); @@ -167,16 +188,23 @@ srs_error_t SrsRtmpConn::do_cycle() } uint32_t rip = rtmp->proxy_real_ip(); + std::string rips = srs_ipv4_string(rip); if (rip > 0) { - srs_trace("RTMP proxy real client ip=%d.%d.%d.%d", - uint8_t(rip>>24), uint8_t(rip>>16), uint8_t(rip>>8), uint8_t(rip)); + srs_trace("RTMP proxy real client ip=%s", rips.c_str()); } - + + // Update the real IP of client, also set the HTTP fields. + span_main_->attr("rip", rip ? rips : ip)->attr("http.client_ip", rip ? rips : ip); + + // The span for RTMP connecting to application. + srs_freep(span_connect_); + span_connect_ = _srs_apm->span("connect")->as_child(span_main_); + SrsRequest* req = info->req; if ((err = rtmp->connect_app(req)) != srs_success) { return srs_error_wrap(err, "rtmp connect tcUrl"); } - + // set client ip to request. req->ip = ip; @@ -210,6 +238,10 @@ srs_error_t SrsRtmpConn::do_cycle() srs_trace("edge-srs ip=%s, version=%s, pid=%d, id=%d", srs_server_ip.c_str(), srs_version.c_str(), srs_pid, srs_id); } + + // Load the span from the AMF0 object propagator. + // Note that we will update the trace id, so please make sure no spans are ended before this. + _srs_apm->extract(span_main_, req->args); } if ((err = service_cycle()) != srs_success) { @@ -381,6 +413,9 @@ srs_error_t SrsRtmpConn::service_cycle() if ((err = rtmp->response_connect_app(req, local_ip.c_str())) != srs_success) { return srs_error_wrap(err, "rtmp: response connect app"); } + + // Must be a connecting application span. + span_connect_->end(); if ((err = rtmp->on_bw_done()) != srs_success) { return srs_error_wrap(err, "rtmp: on bw down"); @@ -439,9 +474,8 @@ srs_error_t SrsRtmpConn::service_cycle() srs_error_t SrsRtmpConn::stream_service_cycle() { srs_error_t err = srs_success; - + SrsRequest* req = info->req; - if ((err = rtmp->identify_client(info->res->stream_id, info->type, req->stream, req->duration)) != srs_success) { return srs_error_wrap(err, "rtmp: identify client"); } @@ -458,12 +492,21 @@ srs_error_t SrsRtmpConn::stream_service_cycle() req->strip(); srs_trace("client identified, type=%s, vhost=%s, app=%s, stream=%s, param=%s, duration=%dms", srs_client_type_string(info->type).c_str(), req->vhost.c_str(), req->app.c_str(), req->stream.c_str(), req->param.c_str(), srsu2msi(req->duration)); + + // Start APM only when client is identified, because it might republish. + srs_freep(span_client_); + span_client_ = _srs_apm->span("client")->as_child(span_connect_)->attr("type", srs_client_type_string(info->type)) + ->attr("url", req->get_stream_url())->attr("http.url", req->get_stream_url()); + // We store the span to coroutine context, for edge to load it. + _srs_apm->store(span_client_); // discovery vhost, resolve the vhost from config SrsConfDirective* parsed_vhost = _srs_config->get_vhost(req->vhost); if (parsed_vhost) { req->vhost = parsed_vhost->arg0(); } + span_client_->attr("vhost", req->vhost)->attr("http.host", req->host)->attr("http.server_name", req->vhost) + ->attr("http.target", srs_fmt("/%s/%s", req->app.c_str(), req->stream.c_str())); if (req->schema.empty() || req->vhost.empty() || req->port == 0 || req->app.empty()) { return srs_error_new(ERROR_RTMP_REQ_TCURL, "discovery tcUrl failed, tcUrl=%s, schema=%s, vhost=%s, port=%d, app=%s", @@ -535,6 +578,11 @@ srs_error_t SrsRtmpConn::stream_service_cycle() if ((err = http_hooks_on_play()) != srs_success) { return srs_error_wrap(err, "rtmp: callback on play"); } + + // Must be a client span. + span_client_->set_name("play")->end(); + // We end the connection span because it's a producer and only trace the established. + span_main_->end(); err = playing(source); http_hooks_on_stop(); @@ -545,6 +593,11 @@ srs_error_t SrsRtmpConn::stream_service_cycle() if ((err = rtmp->start_fmle_publish(info->res->stream_id)) != srs_success) { return srs_error_wrap(err, "rtmp: start FMLE publish"); } + + // Must be a client span. + span_client_->set_name("publish")->end(); + // We end the connection span because it's a producer and only trace the established. + span_main_->end(); return publishing(source); } @@ -552,6 +605,11 @@ srs_error_t SrsRtmpConn::stream_service_cycle() if ((err = rtmp->start_haivision_publish(info->res->stream_id)) != srs_success) { return srs_error_wrap(err, "rtmp: start HAIVISION publish"); } + + // Must be a client span. + span_client_->set_name("publish")->end(); + // We end the connection span because it's a producer and only trace the established. + span_main_->end(); return publishing(source); } @@ -559,6 +617,11 @@ srs_error_t SrsRtmpConn::stream_service_cycle() if ((err = rtmp->start_flash_publish(info->res->stream_id)) != srs_success) { return srs_error_wrap(err, "rtmp: start FLASH publish"); } + + // Must be a client span. + span_client_->set_name("publish")->end(); + // We end the connection span because it's a producer and only trace the established. + span_main_->end(); return publishing(source); } @@ -719,6 +782,10 @@ srs_error_t SrsRtmpConn::do_playing(SrsLiveSource* source, SrsLiveConsumer* cons srs_trace("start play smi=%dms, mw_sleep=%d, mw_msgs=%d, realtime=%d, tcp_nodelay=%d", srsu2msi(send_min_interval), srsu2msi(mw_sleep), mw_msgs, realtime, tcp_nodelay); + + ISrsApmSpan* span = _srs_apm->span("play-cycle")->set_kind(SrsApmKindProducer)->as_child(span_client_) + ->attr("realtime", srs_fmt("%d", realtime))->end(); + SrsAutoFree(ISrsApmSpan, span); while (true) { // when source is set to expired, disconnect it. @@ -762,6 +829,11 @@ srs_error_t SrsRtmpConn::do_playing(SrsLiveSource* source, SrsLiveConsumer* cons srs_trace("-> " SRS_CONSTS_LOG_PLAY " time=%d, msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d, mw=%d/%d", (int)pprint->age(), count, kbps->get_send_kbps(), kbps->get_send_kbps_30s(), kbps->get_send_kbps_5m(), kbps->get_recv_kbps(), kbps->get_recv_kbps_30s(), kbps->get_recv_kbps_5m(), srsu2msi(mw_sleep), mw_msgs); + + // TODO: Do not use pithy print for frame span. + ISrsApmSpan* sample = _srs_apm->span("play-frame")->set_kind(SrsApmKindConsumer)->as_child(span) + ->attr("msgs", srs_fmt("%d", count))->attr("kbps", srs_fmt("%d", kbps->get_send_kbps_30s())); + srs_freep(sample); } if (count <= 0) { @@ -887,6 +959,10 @@ srs_error_t SrsRtmpConn::do_publishing(SrsLiveSource* source, SrsPublishRecvThre srs_utime_t mr_sleep = _srs_config->get_mr_sleep(req->vhost); srs_trace("start publish mr=%d/%d, p1stpt=%d, pnt=%d, tcp_nodelay=%d", mr, srsu2msi(mr_sleep), srsu2msi(publish_1stpkt_timeout), srsu2msi(publish_normal_timeout), tcp_nodelay); } + + ISrsApmSpan* span = _srs_apm->span("publish-cycle")->set_kind(SrsApmKindProducer)->as_child(span_client_) + ->attr("timeout", srs_fmt("%d", srsu2msi(publish_normal_timeout)))->end(); + SrsAutoFree(ISrsApmSpan, span); int64_t nb_msgs = 0; uint64_t nb_frames = 0; @@ -935,6 +1011,12 @@ srs_error_t SrsRtmpConn::do_publishing(SrsLiveSource* source, SrsPublishRecvThre (int)pprint->age(), kbps->get_send_kbps(), kbps->get_send_kbps_30s(), kbps->get_send_kbps_5m(), kbps->get_recv_kbps(), kbps->get_recv_kbps_30s(), kbps->get_recv_kbps_5m(), mr, srsu2msi(mr_sleep), srsu2msi(publish_1stpkt_timeout), srsu2msi(publish_normal_timeout)); + + // TODO: Do not use pithy print for frame span. + ISrsApmSpan* sample = _srs_apm->span("publish-frame")->set_kind(SrsApmKindConsumer)->as_child(span) + ->attr("msgs", srs_fmt("%" PRId64, nb_frames))->attr("kbps", srs_fmt("%d", kbps->get_recv_kbps_30s())); + srs_freep(sample); + } } @@ -1453,7 +1535,18 @@ srs_error_t SrsRtmpConn::start() srs_error_t SrsRtmpConn::cycle() { - srs_error_t err = do_cycle(); + srs_error_t err = srs_success; + + // Serve the client. + err = do_cycle(); + + // Final APM span, parent is the last span, not the root span. Note that only client or server kind will be filtered + // for error or exception report. + ISrsApmSpan* span_final = _srs_apm->span("final")->set_kind(SrsApmKindServer)->as_child(span_client_); + SrsAutoFree(ISrsApmSpan, span_final); + if (srs_error_code(err) != 0) { + span_final->record_error(err)->set_status(SrsApmStatusError, srs_fmt("fail code=%d", srs_error_code(err))); + } // Update statistic when done. SrsStatistic* stat = SrsStatistic::instance(); diff --git a/trunk/src/app/srs_app_rtmp_conn.hpp b/trunk/src/app/srs_app_rtmp_conn.hpp index 2f234b1c8..75d59dd00 100644 --- a/trunk/src/app/srs_app_rtmp_conn.hpp +++ b/trunk/src/app/srs_app_rtmp_conn.hpp @@ -38,6 +38,7 @@ class ISrsWakable; class SrsCommonMessage; class SrsPacket; class SrsNetworkDelta; +class ISrsApmSpan; // The simple rtmp client for SRS. class SrsSimpleRtmpClient : public SrsBasicRtmpClient @@ -117,6 +118,10 @@ private: // The create time in milliseconds. // for current connection to log self create time and calculate the living time. int64_t create_time; + // The span for tracing connection establishment. + ISrsApmSpan* span_main_; + ISrsApmSpan* span_connect_; + ISrsApmSpan* span_client_; public: SrsRtmpConn(SrsServer* svr, srs_netfd_t c, std::string cip, int port); virtual ~SrsRtmpConn(); diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp index e156ba442..6c35fa05f 100644 --- a/trunk/src/app/srs_app_statistic.cpp +++ b/trunk/src/app/srs_app_statistic.cpp @@ -618,13 +618,13 @@ void SrsStatistic::dumps_hints_kv(std::stringstream & ss) void SrsStatistic::dumps_cls_summaries(SrsClsSugar* sugar) { if (!vhosts.empty()) { - sugar->kvf("vhosts", "%d", (int) vhosts.size()); + sugar->kv("vhosts", srs_fmt("%d", (int)vhosts.size())); } if (!streams.empty()) { - sugar->kvf("streams", "%d", (int) streams.size()); + sugar->kv("streams", srs_fmt("%d", (int)streams.size())); } if (!clients.empty()) { - sugar->kvf("clients", "%d", (int) clients.size()); + sugar->kv("clients", srs_fmt("%d", (int)clients.size())); } } @@ -639,37 +639,37 @@ void SrsStatistic::dumps_cls_streams(SrsClsSugars* sugars) SrsClsSugar* sugar = sugars->create(); sugar->kv("hint", "stream"); sugar->kv("version", RTMP_SIG_SRS_VERSION); - sugar->kvf("pid", "%d", getpid()); + sugar->kv("pid", srs_fmt("%d", getpid())); sugar->kv("sid", stream->id); sugar->kv("url", stream->url); if (stream->frames->r30s()) { - sugar->kvf("fps", "%d", stream->frames->r30s()); + sugar->kv("fps", srs_fmt("%d", stream->frames->r30s())); } if (stream->width) { - sugar->kvf("width", "%d", stream->width); + sugar->kv("width", srs_fmt("%d", stream->width)); } if (stream->height) { - sugar->kvf("height", "%d", stream->height); + sugar->kv("height", srs_fmt("%d", stream->height)); } SrsStatisticClient* pub = find_client(stream->publisher_id); if (pub) { if (pub->kbps->get_recv_kbps_30s()) { - sugar->kvf("recv", "%d", pub->kbps->get_recv_kbps_30s()); + sugar->kv("recv", srs_fmt("%d", pub->kbps->get_recv_kbps_30s())); } if (pub->kbps->get_send_kbps_30s()) { - sugar->kvf("send", "%d", pub->kbps->get_send_kbps_30s()); + sugar->kv("send", srs_fmt("%d", pub->kbps->get_send_kbps_30s())); } } - sugar->kvf("clients", "%d", stream->nb_clients); + sugar->kv("clients", srs_fmt("%d", stream->nb_clients)); if (stream->kbps->get_recv_kbps_30s()) { - sugar->kvf("recv2", "%d", stream->kbps->get_recv_kbps_30s()); + sugar->kv("recv2", srs_fmt("%d", stream->kbps->get_recv_kbps_30s())); } if (stream->kbps->get_send_kbps_30s()) { - sugar->kvf("send2", "%d", stream->kbps->get_send_kbps_30s()); + sugar->kv("send2", srs_fmt("%d", stream->kbps->get_send_kbps_30s())); } } } diff --git a/trunk/src/app/srs_app_tencentcloud.cpp b/trunk/src/app/srs_app_tencentcloud.cpp index 82ae790c8..5280f18ca 100644 --- a/trunk/src/app/srs_app_tencentcloud.cpp +++ b/trunk/src/app/srs_app_tencentcloud.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -164,7 +165,9 @@ namespace tencentcloud_api_sign { class SrsClsLogContent : public ISrsEncoder { private: + // required string key = 1; std::string key_; + // required string value = 2; std::string value_; public: SrsClsLogContent(); @@ -181,7 +184,9 @@ public: class SrsClsLog : public ISrsEncoder { private: + // required int64 time = 1; int64_t time_; + // repeated Content contents= 2; std::vector contents_; public: SrsClsLog(); @@ -198,7 +203,9 @@ public: class SrsClsLogGroup : public ISrsEncoder { private: + // repeated Log logs= 1; std::vector logs_; + // optional string source = 4; std::string source_; public: SrsClsLogGroup(); @@ -215,6 +222,7 @@ public: class SrsClsLogGroupList { private: + // repeated LogGroup logGroupList = 1; std::vector groups_; public: SrsClsLogGroupList(); @@ -258,7 +266,7 @@ srs_error_t SrsClsLogContent::encode(SrsBuffer* b) { srs_error_t err = srs_success; - // required string key = 1; + // Encode the key. if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldString)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -267,7 +275,7 @@ srs_error_t SrsClsLogContent::encode(SrsBuffer* b) return srs_error_wrap(err, "encode key=%s", key_.c_str()); } - // required string value = 2; + // Encode the value. if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldString)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -320,7 +328,7 @@ srs_error_t SrsClsLog::encode(SrsBuffer* b) { srs_error_t err = srs_success; - // required int64 time = 1; + // Encode the time. if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldVarint)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -333,7 +341,6 @@ srs_error_t SrsClsLog::encode(SrsBuffer* b) for (std::vector::iterator it = contents_.begin(); it != contents_.end(); ++it) { SrsClsLogContent* content = *it; - // repeated Content contents= 2; if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldObject)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -391,7 +398,6 @@ srs_error_t SrsClsLogGroup::encode(SrsBuffer* b) for (std::vector::iterator it = logs_.begin(); it != logs_.end(); ++it) { SrsClsLog* log = *it; - // repeated Log logs= 1; if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldObject)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -401,7 +407,7 @@ srs_error_t SrsClsLogGroup::encode(SrsBuffer* b) } } - // optional string source = 4; + // Encode the optional source. if ((err = SrsProtobufKey::encode(b, 4, SrsProtobufFieldString)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -455,8 +461,7 @@ srs_error_t SrsClsLogGroupList::encode(SrsBuffer* b) for (std::vector::iterator it = groups_.begin(); it != groups_.end(); ++it) { SrsClsLogGroup* group = *it; - // repeated LogGroup logGroupList = 1; - if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldLengthDelimited)) != srs_success) { + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldObject)) != srs_success) { return srs_error_wrap(err, "key"); } @@ -520,27 +525,6 @@ SrsClsSugar* SrsClsSugar::kv(std::string k, std::string v) return this; } -SrsClsSugar* SrsClsSugar::kvf(std::string k, const char* fmt, ...) -{ - static int LOG_MAX_SIZE = 4096; - static char* buf = new char[LOG_MAX_SIZE]; - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(buf, LOG_MAX_SIZE, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. If error, it might be 0 or negative value. If greater or equals to the - // LOG_MAX_SIZE, means need more buffers to write the data and the last byte might be 0. If success, return the - // number of characters printed, not including the trailing 0. - if (r0 <= 0 || r0 >= LOG_MAX_SIZE) { - return this; - } - - string v = string(buf, r0); - return kv(k, v); -} - SrsClsSugars::SrsClsSugars() { } @@ -606,7 +590,7 @@ SrsClsSugars* SrsClsSugars::slice(int max_size) // Util exceed the max size. v_size += sugar->nb_bytes(); - if (v_size > max_size) { + if ((int)v_size > max_size) { break; } } @@ -869,7 +853,7 @@ srs_error_t SrsClsClient::dump_summaries(SrsClsSugars* sugars) SrsClsSugar* sugar = sugars->create(); sugar->kv("hint", "summary"); sugar->kv("version", RTMP_SIG_SRS_VERSION); - sugar->kvf("pid", "%d", getpid()); + sugar->kv("pid", srs_fmt("%d", getpid())); // Server ID to identify logs from a set of servers' logs. SrsStatistic::instance()->dumps_cls_summaries(sugar); @@ -878,7 +862,7 @@ srs_error_t SrsClsClient::dump_summaries(SrsClsSugars* sugars) if (u->ok) { // The cpu usage of SRS, 1 means 1/1000 if (u->percent > 0) { - sugar->kvf("cpu", "%d", (int) (u->percent * 1000)); + sugar->kv("cpu", srs_fmt("%d", (int)(u->percent * 1000))); } } @@ -886,11 +870,11 @@ srs_error_t SrsClsClient::dump_summaries(SrsClsSugars* sugars) if (p->ok) { // The uptime of SRS, in seconds. if (p->srs_startup_time > 0) { - sugar->kvf("uptime", "%d", (int) ((srs_get_system_time() - p->srs_startup_time) / SRS_UTIME_SECONDS)); + sugar->kv("uptime", srs_fmt("%d", (int)((srs_get_system_time() - p->srs_startup_time) / SRS_UTIME_SECONDS))); } // The load of system, load every 1 minute, 1 means 1/1000. if (p->load_one_minutes > 0) { - sugar->kvf("load", "%d", (int) (p->load_one_minutes * 1000)); + sugar->kv("load", srs_fmt("%d", (int)(p->load_one_minutes * 1000))); } } @@ -904,7 +888,7 @@ srs_error_t SrsClsClient::dump_summaries(SrsClsSugars* sugars) // The memory of SRS, 1 means 1/1000 if (self_mem_percent > 0) { - sugar->kvf("mem", "%d", (int) (self_mem_percent * 1000)); + sugar->kv("mem", srs_fmt("%d", (int)(self_mem_percent * 1000))); } } @@ -912,7 +896,7 @@ srs_error_t SrsClsClient::dump_summaries(SrsClsSugars* sugars) if (s->ok) { // The cpu usage of system, 1 means 1/1000 if (s->percent > 0) { - sugar->kvf("cpu2", "%d", (int) (s->percent * 1000)); + sugar->kv("cpu2", srs_fmt("%d", (int)(s->percent * 1000))); } } @@ -920,19 +904,19 @@ srs_error_t SrsClsClient::dump_summaries(SrsClsSugars* sugars) if (nrs->ok) { // The number of connections of SRS. if (nrs->nb_conn_srs > 0) { - sugar->kvf("conn", "%d", nrs->nb_conn_srs); + sugar->kv("conn", srs_fmt("%d", nrs->nb_conn_srs)); } // The number of connections of system. if (nrs->nb_conn_sys > 0) { - sugar->kvf("conn2", "%d", nrs->nb_conn_sys); + sugar->kv("conn2", srs_fmt("%d", nrs->nb_conn_sys)); } // The received kbps in 30s of SRS. if (nrs->rkbps_30s > 0) { - sugar->kvf("recv", "%d", nrs->rkbps_30s); + sugar->kv("recv", srs_fmt("%d", nrs->rkbps_30s)); } // The sending out kbps in 30s of SRS. if (nrs->skbps_30s > 0) { - sugar->kvf("send", "%d", nrs->skbps_30s); + sugar->kv("send", srs_fmt("%d", nrs->skbps_30s)); } } @@ -964,4 +948,1298 @@ srs_error_t SrsClsClient::dump_streams(SrsClsSugars* sugars) return err; } +SrsOtelExportTraceServiceRequest::SrsOtelExportTraceServiceRequest() +{ +} + +SrsOtelExportTraceServiceRequest::~SrsOtelExportTraceServiceRequest() +{ + for (vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelResourceSpans* span = *it; + srs_freep(span); + } +} + +SrsOtelResourceSpans* SrsOtelExportTraceServiceRequest::append() +{ + SrsOtelResourceSpans* v = new SrsOtelResourceSpans(); + spans_.push_back(v); + return v; +} + +uint64_t SrsOtelExportTraceServiceRequest::nb_bytes() +{ + uint64_t nn = 0; + for (vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelResourceSpans* span = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(span); + } + return nn; +} + +srs_error_t SrsOtelExportTraceServiceRequest::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode each span. + for (vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelResourceSpans* span = *it; + + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, span)) != srs_success) { + return srs_error_wrap(err, "encode span"); + } + } + + return err; +} + +SrsOtelResourceSpans::SrsOtelResourceSpans() +{ + resource_ = new SrsOtelResource(); +} + +SrsOtelResourceSpans::~SrsOtelResourceSpans() +{ + srs_freep(resource_); + + for (std::vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelScopeSpans* span = *it; + srs_freep(span); + } +} + +SrsOtelResource* SrsOtelResourceSpans::resource() +{ + return resource_; +} + +SrsOtelScopeSpans* SrsOtelResourceSpans::append() +{ + SrsOtelScopeSpans* v = new SrsOtelScopeSpans(); + spans_.push_back(v); + return v; +} + +uint64_t SrsOtelResourceSpans::nb_bytes() +{ + uint64_t nn = SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(resource_); + for (std::vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelScopeSpans* span = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(span); + } + return nn; +} + +srs_error_t SrsOtelResourceSpans::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the resource. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, resource_)) != srs_success) { + return srs_error_wrap(err, "encode resource"); + } + + // Encode scope spans. + + // Encode each group. + for (std::vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelScopeSpans* span = *it; + + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, span)) != srs_success) { + return srs_error_wrap(err, "encode span"); + } + } + + return err; +} + +SrsOtelResource::SrsOtelResource() +{ +} + +SrsOtelResource::~SrsOtelResource() +{ + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + srs_freep(attribute); + } +} + +SrsOtelResource* SrsOtelResource::add_addr(SrsOtelAttribute* v) +{ + attributes_.push_back(v); + return this; +} + +uint64_t SrsOtelResource::nb_bytes() +{ + uint64_t nn = 0; + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(attribute); + } + return nn; +} + +srs_error_t SrsOtelResource::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode attributes. + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, attribute)) != srs_success) { + return srs_error_wrap(err, "encode attribute"); + } + } + + return err; +} + +SrsOtelAttribute::SrsOtelAttribute() +{ + value_ = new SrsOtelAnyValue(); +} + +SrsOtelAttribute::~SrsOtelAttribute() +{ + srs_freep(value_); +} + +const std::string& SrsOtelAttribute::key() +{ + return key_; +} + +SrsOtelAttribute* SrsOtelAttribute::kv(std::string k, std::string v) +{ + SrsOtelAttribute* attr = new SrsOtelAttribute(); + attr->key_ = k; + attr->value_->set_string(v); + return attr; +} + +SrsOtelAttribute* SrsOtelAttribute::kvi(std::string k, int64_t v) +{ + SrsOtelAttribute* attr = new SrsOtelAttribute(); + attr->key_ = k; + attr->value_->set_int(v); + return attr; +} + +uint64_t SrsOtelAttribute::nb_bytes() +{ + uint64_t nn = SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(key_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(value_); + return nn; +} + +srs_error_t SrsOtelAttribute::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the key. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, key_)) != srs_success) { + return srs_error_wrap(err, "encode key=%s", key_.c_str()); + } + + // Encode the value. + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, value_)) != srs_success) { + return srs_error_wrap(err, "encode value"); + } + + return err; +} + +SrsOtelAnyValue::SrsOtelAnyValue() +{ + used_field_id_ = 1; + int_value_ = 0; +} + +SrsOtelAnyValue::~SrsOtelAnyValue() +{ +} + +SrsOtelAnyValue* SrsOtelAnyValue::set_string(const std::string& v) +{ + string_value_ = v; + used_field_id_ = 1; + return this; +} + +SrsOtelAnyValue* SrsOtelAnyValue::set_int(int64_t v) +{ + int_value_ = v; + used_field_id_ = 3; + return this; +} + +uint64_t SrsOtelAnyValue::nb_bytes() +{ + uint64_t nn = 0; + if (used_field_id_ == 1) nn = SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(string_value_); + if (used_field_id_ == 3) nn = SrsProtobufKey::sizeof_key() + SrsProtobufVarints::sizeof_varint(int_value_); + return nn; +} + +srs_error_t SrsOtelAnyValue::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + if (used_field_id_ == 1) { + // Encode the string value. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, string_value_)) != srs_success) { + return srs_error_wrap(err, "encode value=%s", string_value_.c_str()); + } + } else if (used_field_id_ == 3) { + // Encode the int value. + if ((err = SrsProtobufKey::encode(b, 3, SrsProtobufFieldVarint)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufVarints::encode(b, int_value_)) != srs_success) { + return srs_error_wrap(err, "encode value=%" PRId64, int_value_); + } + } + + return err; +} + +SrsOtelScopeSpans::SrsOtelScopeSpans() +{ + scope_ = new SrsOtelScope(); +} + +SrsOtelScopeSpans::~SrsOtelScopeSpans() +{ + srs_freep(scope_); + for (std::vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelSpan* span = *it; + srs_freep(span); + } +} + +SrsOtelScope* SrsOtelScopeSpans::scope() +{ + return scope_; +} + +SrsOtelScopeSpans* SrsOtelScopeSpans::swap(std::vector& spans) +{ + spans_.swap(spans); + return this; +} + +int SrsOtelScopeSpans::size() +{ + return (int)spans_.size(); +} + +uint64_t SrsOtelScopeSpans::nb_bytes() +{ + uint64_t nn = SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(scope_); + for (std::vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelSpan* span = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(span); + } + return nn; +} + +srs_error_t SrsOtelScopeSpans::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the scope. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, scope_)) != srs_success) { + return srs_error_wrap(err, "encode scope"); + } + + // Encode each span. + for (std::vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelSpan* span = *it; + + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, span)) != srs_success) { + return srs_error_wrap(err, "encode span"); + } + } + return err; +} + +SrsOtelScope::SrsOtelScope() +{ +} + +SrsOtelScope::~SrsOtelScope() +{ +} + +uint64_t SrsOtelScope::nb_bytes() +{ + uint64_t nn = 0; + nn = SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(name_); + return nn; +} + +srs_error_t SrsOtelScope::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the name. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, name_)) != srs_success) { + return srs_error_wrap(err, "encode name=%s", name_.c_str()); + } + + return err; +} + +SrsOtelSpan::SrsOtelSpan() +{ + start_time_unix_nano_ = 0; + end_time_unix_nano_ = 0; + status_ = new SrsOtelStatus(); +} + +SrsOtelSpan::~SrsOtelSpan() +{ + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + srs_freep(attribute); + } + + for (vector::iterator it = events_.begin(); it != events_.end(); ++it) { + SrsOtelEvent* event = *it; + srs_freep(event); + } + + for (vector::iterator it = links_.begin(); it != links_.end(); ++it) { + SrsOtelLink* link = *it; + srs_freep(link); + } + + srs_freep(status_); +} + +SrsOtelAttribute* SrsOtelSpan::attr(const std::string k) +{ + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + if (attribute->key() == k) { + return attribute; + } + } + return NULL; +} + +uint64_t SrsOtelSpan::nb_bytes() +{ + uint64_t nn = 0; + + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(trace_id_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(span_id_); + if (!parent_span_id_.empty()) { + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(parent_span_id_); + } + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(name_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufVarints::sizeof_varint(kind_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufFixed64::sizeof_int(start_time_unix_nano_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufFixed64::sizeof_int(end_time_unix_nano_); + + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(attribute); + } + + for (vector::iterator it = events_.begin(); it != events_.end(); ++it) { + SrsOtelEvent* event = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(event); + } + + for (vector::iterator it = links_.begin(); it != links_.end(); ++it) { + SrsOtelLink* link = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(link); + } + + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(status_); + + return nn; +} + +srs_error_t SrsOtelSpan::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the trace id. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, trace_id_)) != srs_success) { + return srs_error_wrap(err, "encode trace_id=%s", trace_id_.c_str()); + } + + // Encode the span id. + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, span_id_)) != srs_success) { + return srs_error_wrap(err, "encode span_id=%s", span_id_.c_str()); + } + + // Encode the parent span id. + if (!parent_span_id_.empty()) { + if ((err = SrsProtobufKey::encode(b, 4, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, parent_span_id_)) != srs_success) { + return srs_error_wrap(err, "encode parent_span_id=%s", parent_span_id_.c_str()); + } + } + + // Encode the name. + if ((err = SrsProtobufKey::encode(b, 5, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, name_)) != srs_success) { + return srs_error_wrap(err, "encode name=%s", name_.c_str()); + } + + // Encode the kind. + if ((err = SrsProtobufKey::encode(b, 6, SrsProtobufFieldEnum)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufVarints::encode(b, kind_)) != srs_success) { + return srs_error_wrap(err, "encode kind=%d", (int)kind_); + } + + // Encode the start time. + if ((err = SrsProtobufKey::encode(b, 7, SrsProtobufField64bit)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufFixed64::encode(b, start_time_unix_nano_)) != srs_success) { + return srs_error_wrap(err, "encode start_time=%" PRId64, start_time_unix_nano_); + } + + // Encode the end time. + if ((err = SrsProtobufKey::encode(b, 8, SrsProtobufField64bit)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufFixed64::encode(b, end_time_unix_nano_)) != srs_success) { + return srs_error_wrap(err, "encode end_time=%" PRId64, end_time_unix_nano_); + } + + // Encode attribute if not empty. + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + + if ((err = SrsProtobufKey::encode(b, 9, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, attribute)) != srs_success) { + return srs_error_wrap(err, "encode attribute"); + } + } + + // Encode the events if not empty. + for (vector::iterator it = events_.begin(); it != events_.end(); ++it) { + SrsOtelEvent* event = *it; + + if ((err = SrsProtobufKey::encode(b, 11, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, event)) != srs_success) { + return srs_error_wrap(err, "encode event"); + } + } + + // Encode the links if not empty. + for (vector::iterator it = links_.begin(); it != links_.end(); ++it) { + SrsOtelLink* link = *it; + + if ((err = SrsProtobufKey::encode(b, 13, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, link)) != srs_success) { + return srs_error_wrap(err, "encode link"); + } + } + + // Encode the status. + if ((err = SrsProtobufKey::encode(b, 15, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, status_)) != srs_success) { + return srs_error_wrap(err, "encode status"); + } + + return err; +} + +SrsOtelEvent::SrsOtelEvent() +{ + time_ = srs_update_system_time(); +} + +SrsOtelEvent::~SrsOtelEvent() +{ + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + srs_freep(attribute); + } +} + +SrsOtelEvent* SrsOtelEvent::create(std::string v) +{ + SrsOtelEvent* e = new SrsOtelEvent(); + e->name_ = v; + return e; +} + +SrsOtelEvent* SrsOtelEvent::add_attr(SrsOtelAttribute* v) +{ + attributes_.push_back(v); + return this; +} + +uint64_t SrsOtelEvent::nb_bytes() +{ + uint64_t nn = 0; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufFixed64::sizeof_int(time_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(name_); + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufObject::sizeof_object(attribute); + } + return nn; +} + +srs_error_t SrsOtelEvent::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the time. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufField64bit)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufFixed64::encode(b, time_)) != srs_success) { + return srs_error_wrap(err, "encode time=%" PRId64, time_); + } + + // Encode the name. + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, name_)) != srs_success) { + return srs_error_wrap(err, "encode key=%s", name_.c_str()); + } + + // Encode attributes. + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + + if ((err = SrsProtobufKey::encode(b, 3, SrsProtobufFieldObject)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufObject::encode(b, attribute)) != srs_success) { + return srs_error_wrap(err, "encode attribute"); + } + } + + return err; +} + +SrsOtelLink::SrsOtelLink() +{ +} + +SrsOtelLink::~SrsOtelLink() +{ +} + +SrsOtelLink* SrsOtelLink::create() +{ + return new SrsOtelLink(); +} + +SrsOtelLink* SrsOtelLink::set_id(const std::string& trace_id, const std::string& span_id) +{ + trace_id_ = trace_id; + span_id_ = span_id; + return this; +} + +uint64_t SrsOtelLink::nb_bytes() +{ + uint64_t nn = 0; + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(trace_id_); + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(span_id_); + return nn; +} + +srs_error_t SrsOtelLink::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the trace id. + if ((err = SrsProtobufKey::encode(b, 1, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, trace_id_)) != srs_success) { + return srs_error_wrap(err, "encode trace_id=%s", trace_id_.c_str()); + } + + // Encode the span id. + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, span_id_)) != srs_success) { + return srs_error_wrap(err, "encode span_id=%s", span_id_.c_str()); + } + + return err; +} + +SrsOtelStatus::SrsOtelStatus() +{ + code_ = SrsApmStatusUnset; +} + +SrsOtelStatus::~SrsOtelStatus() +{ +} + +uint64_t SrsOtelStatus::nb_bytes() +{ + uint64_t nn = 0; + if (!message_.empty()) { + nn += SrsProtobufKey::sizeof_key() + SrsProtobufString::sizeof_string(message_); + } + if (code_ != SrsApmStatusUnset) { + nn += SrsProtobufKey::sizeof_key() + SrsProtobufVarints::sizeof_varint(code_); + } + return nn; +} + +srs_error_t SrsOtelStatus::encode(SrsBuffer* b) +{ + srs_error_t err = srs_success; + + // Encode the message. + if (!message_.empty()) { + if ((err = SrsProtobufKey::encode(b, 2, SrsProtobufFieldString)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufString::encode(b, message_)) != srs_success) { + return srs_error_wrap(err, "encode message=%s", message_.c_str()); + } + } + + // Encode the status. + if (code_ != SrsApmStatusUnset) { + if ((err = SrsProtobufKey::encode(b, 3, SrsProtobufFieldEnum)) != srs_success) { + return srs_error_wrap(err, "key"); + } + + if ((err = SrsProtobufVarints::encode(b, code_)) != srs_success) { + return srs_error_wrap(err, "encode kind=%d", (int) code_); + } + } + + return err; +} + +SrsApmClient* _srs_apm = NULL; + +SrsApmContext::SrsApmContext(const std::string& name) +{ + name_ = name; + kind_ = SrsApmKindUnspecified; + + set_trace_id(srs_random_str(16)); + set_span_id(srs_random_str(8)); + // We must not use time cache, or span render might fail. + start_time_ = srs_update_system_time(); + ended_ = false; + status_ = SrsApmStatusUnset; + err_ = srs_success; + + span_ = NULL; + parent_ = NULL; +} + +SrsApmContext::~SrsApmContext() +{ + srs_freep(err_); + + // Span is not created by context, so should never free it here. + if (span_) { + span_->ctx_ = NULL; + span_ = NULL; + } + + // Free all child context. + for (vector::iterator it = childs_.begin(); it != childs_.end(); ++it) { + SrsApmContext* ctx = *it; + srs_freep(ctx); + } + + for (vector::iterator it = attributes_.begin(); it != attributes_.end(); ++it) { + SrsOtelAttribute* attribute = *it; + srs_freep(attribute); + } + + for (vector::iterator it = links_.begin(); it != links_.end(); ++it) { + SrsOtelLink* link = *it; + srs_freep(link); + } +} + +void SrsApmContext::set_trace_id(std::string v) +{ + trace_id_ = v; + str_trace_id_ = srs_string_dumps_hex(trace_id_.data(), trace_id_.length(), INT_MAX, 0, INT_MAX, 0); +} + +void SrsApmContext::set_span_id(std::string v) +{ + span_id_ = v; + str_span_id_ = srs_string_dumps_hex(span_id_.data(), span_id_.length(), INT_MAX, 0, INT_MAX, 0); +} + +const char* SrsApmContext::format_trace_id() +{ + return str_trace_id_.c_str(); +} + +const char* SrsApmContext::format_span_id() +{ + return str_span_id_.c_str(); +} + +SrsApmContext* SrsApmContext::root() +{ + // Root is node that has no parent. + if (!parent_) return this; + + // Use cached root or parent root, literally they should be the same. + return parent_->root(); +} + +void SrsApmContext::set_parent(SrsApmContext* parent) +{ + if (ended_) return; + + parent_ = parent; + if (parent) { + set_trace_id(parent->trace_id_); + parent_span_id_ = parent->span_id_; + parent->childs_.push_back(this); + } +} + +void SrsApmContext::set_status(SrsApmStatus status, const std::string& description) +{ + if (ended_) return; + + status_ = status; + if (status == SrsApmStatusError) { + description_ = description; + } +} + +bool SrsApmContext::all_ended() +{ + if (!ended_) return false; + + for (vector::iterator it = childs_.begin(); it != childs_.end(); ++it) { + SrsApmContext* ctx = *it; + if (!ctx->all_ended()) return false; + } + + return true; +} + +int SrsApmContext::count_spans() +{ + int nn = span_ ? 1 : 0; + + for (vector::iterator it = childs_.begin(); it != childs_.end(); ++it) { + SrsApmContext* ctx = *it; + nn += ctx->count_spans(); + } + + return nn; +} + +void SrsApmContext::update_trace_id(std::string v) +{ + if (ended_) return; + + set_trace_id(v); + + for (vector::iterator it = childs_.begin(); it != childs_.end(); ++it) { + SrsApmContext* ctx = *it; + ctx->set_trace_id(v); + } +} + +void SrsApmContext::link(SrsApmContext* to) +{ + if (ended_) return; + + links_.push_back(SrsOtelLink::create()->set_id(to->trace_id_, to->span_id_)); + attributes_.push_back(SrsOtelAttribute::kv("link_trace", to->str_trace_id_)); + attributes_.push_back(SrsOtelAttribute::kv("link_span", to->str_span_id_)); + + to->links_.push_back(SrsOtelLink::create()->set_id(trace_id_, span_id_)); + to->attributes_.push_back(SrsOtelAttribute::kv("link_trace", str_trace_id_)); + to->attributes_.push_back(SrsOtelAttribute::kv("link_span", str_span_id_)); + + srs_trace("APM: Link span %s(trace=%s, span=%s) with %s(trace=%s, span=%s)", + name_.c_str(), str_trace_id_.c_str(), str_span_id_.c_str(), to->name_.c_str(), + to->str_trace_id_.c_str(), to->str_span_id_.c_str() + ); +} + +void SrsApmContext::end() +{ + if (ended_) return; + ended_ = true; + + SrsOtelSpan* otel = new SrsOtelSpan(); + + otel->name_ = name_; + otel->trace_id_ = trace_id_; + otel->span_id_ = span_id_; + otel->parent_span_id_ = parent_span_id_; + otel->kind_ = kind_; + otel->start_time_unix_nano_ = start_time_ * 1000; + // We must not use time cache, or span render might fail. + otel->end_time_unix_nano_ = srs_update_system_time() * 1000; + + otel->status_->code_ = status_; + otel->status_->message_ = description_; + + otel->attributes_.swap(attributes_); + otel->links_.swap(links_); + + // Insert server ip if not exists. + if (!otel->attr("ip")) { + otel->attributes_.push_back(SrsOtelAttribute::kv("ip", srs_get_public_internet_address())); + } + if (!otel->attr("component")) { + otel->attributes_.push_back(SrsOtelAttribute::kv("component", "srs")); + } + + // See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/exceptions.md + if (err_ != srs_success) { + // Set the events for detail about the error. + otel->events_.push_back(SrsOtelEvent::create("exception") + ->add_attr(SrsOtelAttribute::kv("exception.type", srs_fmt("code_%d_%s", srs_error_code(err_), srs_error_code_str(err_).c_str()))) + ->add_attr(SrsOtelAttribute::kv("exception.message", srs_error_summary(err_))) + ->add_attr(SrsOtelAttribute::kv("exception.stacktrace", srs_error_desc(err_))) + ); + + // We also use HTTP status code for APM to class the error. Note that it also works for non standard HTTP status + // code, for example, SRS error codes. + otel->attributes_.push_back(SrsOtelAttribute::kv("http.status_code", srs_fmt("%d", srs_error_code(err_)))); + } + + _srs_apm->snapshot(otel); + srs_info("APM: Snapshot name=%s, trace=%s, span=%s", name_.c_str(), trace_id_.c_str(), span_id_.c_str()); +} + +SrsApmSpan::SrsApmSpan(const std::string& name) +{ + child_ = false; + + // Create the context for this span. + ctx_ = new SrsApmContext(name); + ctx_->span_ = this; + + // Default to internal span. + ctx_->kind_ = SrsApmKindInternal; +} + +SrsApmSpan::~SrsApmSpan() +{ + end(); + + // Context might be freed by other span. + if (!ctx_) return; + + // Span is not available. + ctx_->span_ = NULL; + + // Dispose the context tree when all spans are ended. + SrsApmContext* root = ctx_->root(); + + // Only free the tree when free the last span, because we might create new span even all spans are ended only if the + // root span has not been freed, for example, when RTMP client cycle done, we create a final span. + if (root->count_spans() == 0 && root->all_ended()) { + srs_freep(root); + } +} + +const char* SrsApmSpan::format_trace_id() +{ + return ctx_ ? ctx_->format_trace_id() : ""; +} + +const char* SrsApmSpan::format_span_id() +{ + return ctx_ ? ctx_->format_span_id() : ""; +} + +ISrsApmSpan* SrsApmSpan::set_name(const std::string& name) +{ + if (ctx_) ctx_->name_ = name; + return this; +} + +ISrsApmSpan* SrsApmSpan::set_kind(SrsApmKind kind) +{ + if (ctx_) ctx_->kind_ = kind; + return this; +} + +ISrsApmSpan* SrsApmSpan::as_child(ISrsApmSpan* parent) +{ + // Should be child of different parents. + if (child_) return this; + + // For child, always load parent from context. + SrsApmSpan* span = dynamic_cast(parent); + if (span) { + ctx_->set_parent(span->ctx_); + child_ = true; + } + + return this; +} + +ISrsApmSpan* SrsApmSpan::set_status(SrsApmStatus status, const std::string& description) +{ + if (ctx_) ctx_->set_status(status, description); + return this; +} + +ISrsApmSpan* SrsApmSpan::record_error(srs_error_t err) +{ + if (ctx_) ctx_->err_ = srs_error_copy(err); + return this; +} + +ISrsApmSpan* SrsApmSpan::attr(const std::string& k, const std::string& v) +{ + if (ctx_) ctx_->attributes_.push_back(SrsOtelAttribute::kv(k, v)); + return this; +} + +ISrsApmSpan* SrsApmSpan::link(ISrsApmSpan* span) +{ + SrsApmSpan* to = dynamic_cast(span); + if (ctx_ && span) ctx_->link(to->ctx_); + return this; +} + +ISrsApmSpan* SrsApmSpan::end() +{ + if (ctx_) ctx_->end(); + return this; +} + +ISrsApmSpan* SrsApmSpan::extract(SrsAmf0Object* h) +{ + if (!ctx_) return this; + + SrsAmf0Any* prop = h->ensure_property_string("Traceparent"); + if (!prop) return this; + + std::string trace_parent = prop->to_str(); + vector vs = srs_string_split(trace_parent, "-"); + if (vs.size() != 4) return this; + + // Update trace id for span and all its child spans. + ctx_->update_trace_id(vs[1]); + + // Update the parent span id of span, note that the parent is NULL. + ctx_->parent_span_id_ = vs[2]; + + return this; +} + +ISrsApmSpan* SrsApmSpan::inject(SrsAmf0Object* h) +{ + if (!ctx_) return this; + + string v = text_propagator(); + if (!v.empty()) h->set("Traceparent", SrsAmf0Any::str(v.c_str())); + + return this; +} + +std::string SrsApmSpan::text_propagator() +{ + // FlagsSampled is a bitmask with the sampled bit set. A SpanContext + // with the sampling bit set means the span is sampled. + const uint8_t FlagsSampled = 0x01; + const uint8_t supportedVersion = 0; + static char buf[256]; + + // For text based propagation, for example, HTTP header "Traceparent: 00-bb8dedf16c53ab4b6ceb1f4ca6d985bb-29247096662468ab-01" + // About the "%.2x", please see https://www.quora.com/What-does-2x-do-in-C-code for detail. + int nn = snprintf(buf, sizeof(buf), "%.2x-%s-%s-%.2x", supportedVersion, ctx_->trace_id_.c_str(), ctx_->span_id_.c_str(), FlagsSampled); + if (nn > 0 && nn < sizeof(buf)) { + return string(buf, nn); + } + + return ""; +} + +static int _srs_apm_key = -1; +void _srs_apm_destructor(void* arg) +{ + // We don't free the span, because it's not created by us. + // Note that it's safe because keys will be reset when coroutine is terminated. + //SrsApmSpan* span = (SrsApmSpan*)arg; +} + +ISrsApmSpan* SrsApmSpan::store() +{ + ISrsApmSpan* span = _srs_apm->load(); + if (span == this) return this; + + int r0 = srs_thread_setspecific(_srs_apm_key, this); + srs_assert(r0 == 0); + return this; +} + +ISrsApmSpan* SrsApmSpan::load() +{ + if (_srs_apm_key < 0) { + int r0 = srs_key_create(&_srs_apm_key, _srs_apm_destructor); + srs_assert(r0 == 0); + } + + void* span = srs_thread_getspecific(_srs_apm_key); + return (ISrsApmSpan*)span; +} + +SrsApmClient::SrsApmClient() +{ + enabled_ = false; +} + +SrsApmClient::~SrsApmClient() +{ + for (vector::iterator it = spans_.begin(); it != spans_.end(); ++it) { + SrsOtelSpan* span = *it; + srs_freep(span); + } +} + +srs_error_t SrsApmClient::initialize() +{ + srs_error_t err = srs_success; + + enabled_ = _srs_config->get_tencentcloud_apm_enabled(); + if (!enabled_) { + srs_trace("TencentCloud APM is disabled"); + return err; + } + + token_ = _srs_config->get_tencentcloud_apm_token(); + endpoint_ = _srs_config->get_tencentcloud_apm_endpoint(); + service_name_ = _srs_config->get_tencentcloud_apm_service_name(); + debug_logging_ = _srs_config->get_tencentcloud_apm_debug_logging(); + srs_trace("Initialize TencentCloud APM, token=%dB, endpoint=%s, service_name=%s, debug_logging=%d", token_.length(), endpoint_.c_str(), service_name_.c_str(), debug_logging_); + + return err; +} + +srs_error_t SrsApmClient::report() +{ + srs_error_t err = srs_success; + + if (spans_.empty()) return err; + + SrsOtelExportTraceServiceRequest* sugar = new SrsOtelExportTraceServiceRequest(); + SrsAutoFree(SrsOtelExportTraceServiceRequest, sugar); + + SrsOtelResourceSpans* rs = sugar->append(); + // See https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions + rs->resource()->add_addr(SrsOtelAttribute::kv("service.name", service_name_)); + // For Tencent Cloud APM authentication, see https://console.cloud.tencent.com/apm/monitor/access + rs->resource()->add_addr(SrsOtelAttribute::kv("token", token_)); + + SrsOtelScopeSpans* spans = rs->append(); + spans->scope()->name_ = "srs"; + spans->swap(spans_); + + // Send out over HTTP1. + uint64_t size = sugar->nb_bytes(); + if (size >= 5 * 1024 * 1024) { + return srs_error_new(ERROR_APM_EXCEED_SIZE, "exceed 5MB actual %d", size); + } + + char* buf = new char[size]; + SrsAutoFreeA(char, buf); + + memset(buf, 0, size); + SrsBuffer b(buf, size); + if ((err = sugar->encode(&b)) != srs_success) { + return srs_error_wrap(err, "encode log"); + } + + string body(buf, size); + + // Write a CLS log to service specified by url. + string url = "http://" + endpoint_ + "/v1/traces"; + + SrsHttpUri uri; + if ((err = uri.initialize(url)) != srs_success) { + return srs_error_wrap(err, "http: post failed. url=%s", url.c_str()); + } + + SrsHttpClient http; + if ((err = http.initialize(uri.get_schema(), uri.get_host(), uri.get_port())) != srs_success) { + return srs_error_wrap(err, "http: init client"); + } + + // Setup the request. + if (true) { + http.set_header("Content-Type", "application/x-protobuf"); + } + + string path = uri.get_path(); + if (!uri.get_query().empty()) { + path += "?" + uri.get_query(); + } + + // Start request and parse response. + ISrsHttpMessage* msg = NULL; + if ((err = http.post(path, body, &msg)) != srs_success) { + return srs_error_wrap(err, "http: client post"); + } + SrsAutoFree(ISrsHttpMessage, msg); + + string res; + uint16_t code = msg->status_code(); + if ((err = msg->body_read_all(res)) != srs_success) { + return srs_error_wrap(err, "http: body read"); + } + + // ensure the http status is ok. + if (code != SRS_CONSTS_HTTP_OK && code != SRS_CONSTS_HTTP_Created) { + return srs_error_new(ERROR_HTTP_STATUS_INVALID, "http: status %d, body is %s", code, res.c_str()); + } + + if (debug_logging_) { + string server_id = SrsStatistic::instance()->server_id(); + srs_trace("APM write logs=%d, size=%dB, server_id=%s", spans->size(), body.length(), server_id.c_str()); + } + + return err; +} + +ISrsApmSpan* SrsApmClient::span(const std::string& name) +{ + if (!enabled_) return new ISrsApmSpan(); + return new SrsApmSpan(name); +} + +ISrsApmSpan* SrsApmClient::dummy() +{ + return new ISrsApmSpan(); +} + +ISrsApmSpan* SrsApmClient::extract(ISrsApmSpan* v, SrsAmf0Object* h) +{ + SrsApmSpan* span = dynamic_cast(v); + if (span) span->extract(h); + return v; +} + +ISrsApmSpan* SrsApmClient::inject(ISrsApmSpan* v, SrsAmf0Object* h) +{ + SrsApmSpan* span = dynamic_cast(v); + if (span) span->inject(h); + return v; +} + +void SrsApmClient::store(ISrsApmSpan* v) +{ + SrsApmSpan* span = dynamic_cast(v); + if (span) span->store(); +} + +ISrsApmSpan* SrsApmClient::load() +{ + static ISrsApmSpan* dummy = new ISrsApmSpan(); + ISrsApmSpan* span = SrsApmSpan::load(); + return span ? span : dummy; +} + +void SrsApmClient::snapshot(SrsOtelSpan* span) +{ + spans_.push_back(span); +} diff --git a/trunk/src/app/srs_app_tencentcloud.hpp b/trunk/src/app/srs_app_tencentcloud.hpp index f68058c30..16c31fbcc 100644 --- a/trunk/src/app/srs_app_tencentcloud.hpp +++ b/trunk/src/app/srs_app_tencentcloud.hpp @@ -18,6 +18,19 @@ class SrsBuffer; class SrsClsLogGroupList; class SrsClsLogGroup; class SrsClsLog; +class SrsOtelSpan; +class SrsApmContext; +class SrsAmf0Object; +class SrsApmSpan; +class SrsOtelResourceSpans; +class SrsOtelResource; +class SrsOtelScopeSpans; +class SrsOtelAttribute; +class SrsOtelAnyValue; +class SrsOtelScope; +class SrsOtelStatus; +class SrsOtelEvent; +class SrsOtelLink; class SrsClsSugar : public ISrsEncoder { @@ -34,7 +47,6 @@ public: public: bool empty(); SrsClsSugar* kv(std::string k, std::string v); - SrsClsSugar* kvf(std::string k, const char* fmt, ...); }; class SrsClsSugars : public ISrsEncoder @@ -92,5 +104,426 @@ private: extern SrsClsClient* _srs_cls; +enum SrsApmKind +{ + SrsApmKindUnspecified = 0, + SrsApmKindInternal = 1, + SrsApmKindServer = 2, + SrsApmKindClient = 3, + SrsApmKindProducer = 4, + SrsApmKindConsumer = 5, +}; + +enum SrsApmStatus +{ + SrsApmStatusUnset = 0, + SrsApmStatusOk = 1, + SrsApmStatusError = 2, +}; + +class SrsOtelExportTraceServiceRequest : public ISrsEncoder +{ +private: + // repeated opentelemetry.proto.trace.v1.ResourceSpans resource_spans = 1; + std::vector spans_; +public: + SrsOtelExportTraceServiceRequest(); + virtual ~SrsOtelExportTraceServiceRequest(); +public: + SrsOtelResourceSpans* append(); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelResourceSpans : public ISrsEncoder +{ +private: + // opentelemetry.proto.resource.v1.Resource resource = 1; + SrsOtelResource* resource_; + // repeated ScopeSpans scope_spans = 2; + std::vector spans_; +public: + SrsOtelResourceSpans(); + virtual ~SrsOtelResourceSpans(); +public: + SrsOtelResource* resource(); + SrsOtelScopeSpans* append(); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelResource : public ISrsEncoder +{ +private: + // repeated opentelemetry.proto.common.v1.KeyValue attributes = 1; + std::vector attributes_; +public: + SrsOtelResource(); + virtual ~SrsOtelResource(); +public: + SrsOtelResource* add_addr(SrsOtelAttribute* v); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelAttribute : public ISrsEncoder +{ +private: + // string key = 1; + std::string key_; + // AnyValue value = 2; + SrsOtelAnyValue* value_; +private: + SrsOtelAttribute(); +public: + virtual ~SrsOtelAttribute(); +public: + const std::string& key(); +public: + static SrsOtelAttribute* kv(std::string k, std::string v); + static SrsOtelAttribute* kvi(std::string k, int64_t v); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelAnyValue : public ISrsEncoder +{ +private: + // Default to string(1). Please change it if use other value, such as int(3). + uint8_t used_field_id_; +private: + // string string_value = 1; + std::string string_value_; + // bool bool_value = 2; + // int64 int_value = 3; + int64_t int_value_; + // double double_value = 4; + // ArrayValue array_value = 5; + // KeyValueList kvlist_value = 6; + // bytes bytes_value = 7; +public: + SrsOtelAnyValue(); + virtual ~SrsOtelAnyValue(); +public: + SrsOtelAnyValue* set_string(const std::string& v); + SrsOtelAnyValue* set_int(int64_t v); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelScopeSpans : public ISrsEncoder +{ +private: + // opentelemetry.proto.common.v1.InstrumentationScope scope = 1; + SrsOtelScope* scope_; + // repeated Span spans = 2; + std::vector spans_; +public: + SrsOtelScopeSpans(); + virtual ~SrsOtelScopeSpans(); +public: + SrsOtelScope* scope(); + SrsOtelScopeSpans* swap(std::vector& spans); + int size(); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelScope : public ISrsEncoder +{ +public: + //string name = 1; + std::string name_; + //string version = 2; + //repeated KeyValue attributes = 3; + //uint32 dropped_attributes_count = 4; +public: + SrsOtelScope(); + virtual ~SrsOtelScope(); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelSpan : public ISrsEncoder +{ +public: + //bytes trace_id = 1; // This field is required. + std::string trace_id_; + //bytes span_id = 2; // This field is required. + std::string span_id_; + //string trace_state = 3; + //bytes parent_span_id = 4; + std::string parent_span_id_; + //string name = 5; // This field is required. + std::string name_; + //SpanKind kind = 6; + SrsApmKind kind_; + //fixed64 start_time_unix_nano = 7; + int64_t start_time_unix_nano_; + //fixed64 end_time_unix_nano = 8; + int64_t end_time_unix_nano_; + //repeated opentelemetry.proto.common.v1.KeyValue attributes = 9; + std::vector attributes_; + //uint32 dropped_attributes_count = 10; + //repeated Event events = 11; + std::vector events_; + //uint32 dropped_events_count = 12; + //repeated Link links = 13; + std::vector links_; + //uint32 dropped_links_count = 14; + //Status status = 15; + SrsOtelStatus* status_; +public: + SrsOtelSpan(); + virtual ~SrsOtelSpan(); +public: + SrsOtelAttribute* attr(const std::string k); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelEvent : public ISrsEncoder +{ +public: + // fixed64 time_unix_nano = 1; + int64_t time_; + // string name = 2; + std::string name_; + // repeated opentelemetry.proto.common.v1.KeyValue attributes = 3; + std::vector attributes_; + // uint32 dropped_attributes_count = 4; +public: + SrsOtelEvent(); + virtual ~SrsOtelEvent(); +public: + static SrsOtelEvent* create(std::string v); + SrsOtelEvent* add_attr(SrsOtelAttribute* v); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelLink : public ISrsEncoder +{ +private: + // bytes trace_id = 1; + std::string trace_id_; + // bytes span_id = 2; + std::string span_id_; + // string trace_state = 3; + // repeated opentelemetry.proto.common.v1.KeyValue attributes = 4; + // uint32 dropped_attributes_count = 5; +private: + SrsOtelLink(); +public: + virtual ~SrsOtelLink(); +public: + static SrsOtelLink* create(); + SrsOtelLink* set_id(const std::string& trace_id, const std::string& span_id); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsOtelStatus : public ISrsEncoder +{ +public: + //string message = 2; + std::string message_; + //StatusCode code = 3; + SrsApmStatus code_; +public: + SrsOtelStatus(); + virtual ~SrsOtelStatus(); +public: + virtual uint64_t nb_bytes(); + srs_error_t encode(SrsBuffer* b); +}; + +class SrsApmContext +{ +private: + friend class SrsApmSpan; +private: + SrsApmSpan* span_; + SrsApmContext* parent_; + std::vector childs_; + // Encode the id in hex string. + std::string str_trace_id_; + std::string str_span_id_; +private: + std::string name_; + SrsApmKind kind_; + std::string trace_id_; + std::string span_id_; + // Note that parent span id might not be empty, while parent might be NULL, when extract span from propagator. + std::string parent_span_id_; + srs_utime_t start_time_; + SrsApmStatus status_; + std::string description_; + srs_error_t err_; + std::vector attributes_; + std::vector links_; +private: + bool ended_; +private: + SrsApmContext(const std::string& name); +public: + virtual ~SrsApmContext(); +private: + // Update the trace id and format it as hex string id. + void set_trace_id(std::string v); + // Update the span id and format it as hex string id. + void set_span_id(std::string v); +public: + const char* format_trace_id(); + const char* format_span_id(); + SrsApmContext* root(); + void set_parent(SrsApmContext* parent); + void set_status(SrsApmStatus status, const std::string& description); + bool all_ended(); + int count_spans(); + void update_trace_id(std::string v); + void link(SrsApmContext* to); + void end(); +}; + +class ISrsApmSpan +{ +private: + friend class SrsApmClient; +public: + ISrsApmSpan() { + } + virtual ~ISrsApmSpan() { + } +public: + // Get the formatted trace ID in hex string. + virtual const char* format_trace_id() { + return ""; + } + // Get the formatted span ID in hex string. + virtual const char* format_span_id() { + return ""; + } +public: + // Set the name of span. + virtual ISrsApmSpan* set_name(const std::string& name) { + return this; + } + // Set the kind of span. + virtual ISrsApmSpan* set_kind(SrsApmKind kind) { + return this; + } + // Set span as child span of parent span. + virtual ISrsApmSpan* as_child(ISrsApmSpan* parent) { + return this; + } + // Set the status of span, and error description by fmt. + // Note that ignore description except for error status. + virtual ISrsApmSpan* set_status(SrsApmStatus status, const std::string& description) { + return this; + } + // RecordError will record err as an exception span event for this span. An + // additional call to SetStatus is required if the Status of the Span should + // be set to Error, as this method does not change the Span status. If this + // span is not being recorded or err is nil then this method does nothing. + virtual ISrsApmSpan* record_error(srs_error_t err) { + return this; + } + // Add an attribute with all string kv to span. + virtual ISrsApmSpan* attr(const std::string& k, const std::string& v) { + return this; + } + // Link with another span. + virtual ISrsApmSpan* link(ISrsApmSpan* span) { + return this; + } + // End the span, snapshot and upload(in a while) a otel span to APM server. + virtual ISrsApmSpan* end() { + return this; + } +}; + +class SrsApmSpan : public ISrsApmSpan +{ +private: + friend class SrsApmContext; + friend class SrsApmClient; +private: + bool child_; + SrsApmContext* ctx_; +private: + SrsApmSpan(const std::string& name); +public: + virtual ~SrsApmSpan(); +// Span operations. +public: + const char* format_trace_id(); + const char* format_span_id(); + ISrsApmSpan* set_name(const std::string& name); + ISrsApmSpan* set_kind(SrsApmKind kind); + ISrsApmSpan* as_child(ISrsApmSpan* parent); + ISrsApmSpan* set_status(SrsApmStatus status, const std::string& description); + ISrsApmSpan* record_error(srs_error_t err); + ISrsApmSpan* attr(const std::string& k, const std::string& v); + ISrsApmSpan* link(ISrsApmSpan* span); + ISrsApmSpan* end(); +// Inject or extract for propagator. +private: + ISrsApmSpan* extract(SrsAmf0Object* h); + ISrsApmSpan* inject(SrsAmf0Object* h); + std::string text_propagator(); +// Store or load with coroutine context. +private: + ISrsApmSpan* store(); + static ISrsApmSpan* load(); +}; + +class SrsApmClient +{ +private: + bool enabled_; + std::string token_; + std::string endpoint_; + std::string service_name_; + bool debug_logging_; + std::vector spans_; +public: + SrsApmClient(); + virtual ~SrsApmClient(); +public: + srs_error_t initialize(); + srs_error_t report(); +public: + // Create a span with specified name. + ISrsApmSpan* span(const std::string& name); + // Create dummy span for default. + ISrsApmSpan* dummy(); +public: + // Extract and inject for propagator. + ISrsApmSpan* extract(ISrsApmSpan* v, SrsAmf0Object* h); + ISrsApmSpan* inject(ISrsApmSpan* v, SrsAmf0Object* h); + // Store the span to coroutine context. + void store(ISrsApmSpan* span); + // Get or load span from coroutine context. + // Note that a dummy span will be returned if no span in coroutine context. + // Note that user should never free the returned span. + ISrsApmSpan* load(); +// Internal APIs. +public: + void snapshot(SrsOtelSpan* span); +}; + +extern SrsApmClient* _srs_apm; + #endif diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index 01450ffa0..503e77db5 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -441,6 +441,7 @@ srs_error_t srs_global_initialize() // Initialize global TencentCloud CLS object. _srs_cls = new SrsClsClient(); + _srs_apm = new SrsApmClient(); return err; } diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 5571d027a..a8748cd84 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 63 +#define VERSION_REVISION 64 #endif diff --git a/trunk/src/kernel/srs_kernel_error.cpp b/trunk/src/kernel/srs_kernel_error.cpp index c1f315989..545e301ae 100644 --- a/trunk/src/kernel/srs_kernel_error.cpp +++ b/trunk/src/kernel/srs_kernel_error.cpp @@ -12,6 +12,8 @@ #include #include #include + +#include using namespace std; bool srs_is_system_control_error(srs_error_t err) @@ -53,6 +55,12 @@ std::string SrsCplxError::description() { stringstream ss; ss << "code=" << code; + string code_str = srs_error_code_str(this); + if (!code_str.empty()) ss << "(" << code_str << ")"; + + string code_longstr = srs_error_code_longstr(this); + if (!code_longstr.empty()) ss << "(" << code_longstr << ")"; + SrsCplxError* next = this; while (next) { ss << " : " << next->msg; @@ -191,3 +199,65 @@ int SrsCplxError::error_code(SrsCplxError* err) return err? err->code : ERROR_SUCCESS; } +#define SRS_STRERRNO_GEN(n, v, m, s) {(SrsErrorCode)v, m, s}, +static struct +{ + SrsErrorCode code; + const char* name; + const char* descripton; +} _srs_strerror_tab[] = { +#ifndef _WIN32 + {ERROR_SUCCESS, "Success", "Success"}, +#endif + SRS_ERRNO_MAP_SYSTEM(SRS_STRERRNO_GEN) + SRS_ERRNO_MAP_RTMP(SRS_STRERRNO_GEN) + SRS_ERRNO_MAP_APP(SRS_STRERRNO_GEN) + SRS_ERRNO_MAP_HTTP(SRS_STRERRNO_GEN) + SRS_ERRNO_MAP_RTC(SRS_STRERRNO_GEN) + SRS_ERRNO_MAP_SRT(SRS_STRERRNO_GEN) + SRS_ERRNO_MAP_USER(SRS_STRERRNO_GEN) +}; +#undef SRS_STRERRNO_GEN + +std::string SrsCplxError::error_code_str(SrsCplxError* err) +{ + static string not_found = ""; + static std::map error_map; + + // Build map if empty. + if (error_map.empty()) { + for (int i = 0; i < (int)(sizeof(_srs_strerror_tab) / sizeof(_srs_strerror_tab[0])); i++) { + SrsErrorCode code = _srs_strerror_tab[i].code; + error_map[code] = _srs_strerror_tab[i].name; + } + } + + std::map::iterator it = error_map.find((SrsErrorCode)srs_error_code(err)); + if (it == error_map.end()) { + return not_found; + } + + return it->second; +} + +std::string SrsCplxError::error_code_longstr(SrsCplxError* err) +{ + static string not_found = ""; + static std::map error_map; + + // Build map if empty. + if (error_map.empty()) { + for (int i = 0; i < (int)(sizeof(_srs_strerror_tab) / sizeof(_srs_strerror_tab[0])); i++) { + SrsErrorCode code = _srs_strerror_tab[i].code; + error_map[code] = _srs_strerror_tab[i].descripton; + } + } + + std::map::iterator it = error_map.find((SrsErrorCode)srs_error_code(err)); + if (it == error_map.end()) { + return not_found; + } + + return it->second; +} + diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 1b73dab8d..0491e12a7 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -11,378 +11,378 @@ #include -// For srs-librtmp, @see https://github.com/ossrs/srs/issues/213 +/**************************************************/ +/* The system error. */ +#define SRS_ERRNO_MAP_SYSTEM(XX) \ + XX(ERROR_SOCKET_CREATE , 1000, "SocketCreate", "Create socket fd failed") \ + XX(ERROR_SOCKET_SETREUSE , 1001, "SocketReuse", "Setup socket reuse option failed") \ + XX(ERROR_SOCKET_BIND , 1002, "SocketBind", "Bind socket failed") \ + XX(ERROR_SOCKET_LISTEN , 1003, "SocketListen", "Listen at specified port failed") \ + XX(ERROR_SOCKET_CLOSED , 1004, "SocketClosed", "Socket is closed") \ + XX(ERROR_SOCKET_GET_PEER_NAME , 1005, "SocketPeerName", "Socket get peer name failed") \ + XX(ERROR_SOCKET_GET_PEER_IP , 1006, "SocketPeerIp", "Socket get peer ip failed") \ + XX(ERROR_SOCKET_READ , 1007, "SocketRead", "Socket read data failed") \ + XX(ERROR_SOCKET_READ_FULLY , 1008, "SocketReadFully", "Socket fully read data failed") \ + XX(ERROR_SOCKET_WRITE , 1009, "SocketWrite", "Socket write data failed") \ + XX(ERROR_SOCKET_WAIT , 1010, "SocketWait", "Socket wait for ready") \ + XX(ERROR_SOCKET_TIMEOUT , 1011, "SocketTimeout", "Socket io timeout") \ + XX(ERROR_SOCKET_CONNECT , 1012, "SocketConnect", "Connect to server by socket failed") \ + XX(ERROR_ST_SET_EPOLL , 1013, "StSetEpoll", "Setup ST with epoll failed") \ + XX(ERROR_ST_INITIALIZE , 1014, "StInitialize", "Initialize ST failed") \ + XX(ERROR_ST_OPEN_SOCKET , 1015, "StOpenSocket", "ST open socket failed") \ + XX(ERROR_ST_CREATE_LISTEN_THREAD , 1016, "StListenThread", "ST create listen thread") \ + XX(ERROR_ST_CREATE_CYCLE_THREAD , 1017, "StCycleThread", "ST create cycle thread") \ + XX(ERROR_ST_CONNECT , 1018, "StConnect", "ST connect server failed") \ + XX(ERROR_SYSTEM_PACKET_INVALID , 1019, "RtmpInvalidPacket", "Got invalid RTMP packet to codec") \ + XX(ERROR_SYSTEM_CLIENT_INVALID , 1020, "RtmpInvalidClient", "Got invalid RTMP client neither publisher nor player") \ + XX(ERROR_SYSTEM_ASSERT_FAILED , 1021, "SystemAssert", "System assert failed for fatal error") \ + XX(ERROR_READER_BUFFER_OVERFLOW , 1022, "FastStreamGrow", "Fast stream buffer grow failed") \ + XX(ERROR_SYSTEM_CONFIG_INVALID , 1023, "ConfigInvalid", "Configuration is invalid") \ + XX(ERROR_SYSTEM_STREAM_BUSY , 1028, "StreamBusy", "Stream already exists or busy") \ + XX(ERROR_SYSTEM_IP_INVALID , 1029, "IpInvalid", "Retrieve IP failed") \ + XX(ERROR_SYSTEM_FORWARD_LOOP , 1030, "RtmpForwardLoop", "Infinity loop for RTMP forwarding") \ + XX(ERROR_SYSTEM_WAITPID , 1031, "DaemonWaitPid", "Wait pid failed for daemon process") \ + XX(ERROR_SYSTEM_BANDWIDTH_KEY , 1032, "BandwidthKey", "Invalid key for RTMP bandwidth check") \ + XX(ERROR_SYSTEM_BANDWIDTH_DENIED , 1033, "BandwidthDenied", "Denied for RTMP bandwidth check") \ + XX(ERROR_SYSTEM_PID_ACQUIRE , 1034, "PidFileAcquire", "SRS process exists so that acquire pid file failed") \ + XX(ERROR_SYSTEM_PID_ALREADY_RUNNING , 1035, "PidFileProcessExists", "Exists SRS process specified by pid file") \ + XX(ERROR_SYSTEM_PID_LOCK , 1036, "PidFileLock", "SRS process exists so that lock pid file failed") \ + XX(ERROR_SYSTEM_PID_TRUNCATE_FILE , 1037, "PidFileTruncate", "SRS process exists so that truncate pid file failed") \ + XX(ERROR_SYSTEM_PID_WRITE_FILE , 1038, "PidFileWrite", "SRS process exists so that write pid file failed") \ + XX(ERROR_SYSTEM_PID_GET_FILE_INFO , 1039, "PidFileQuery", "SRS process exists so that query pid file failed") \ + XX(ERROR_SYSTEM_PID_SET_FILE_INFO , 1040, "PidFileUpdate", "SRS process exists so that update pid file failed") \ + XX(ERROR_SYSTEM_FILE_ALREADY_OPENED , 1041, "FileOpened", "File open failed for already opened") \ + XX(ERROR_SYSTEM_FILE_OPENE , 1042, "FileOpen", "Failed to open file") \ + XX(ERROR_SYSTEM_FILE_CLOSE , 1043, "FileClose", "Failed to close file") \ + XX(ERROR_SYSTEM_FILE_READ , 1044, "FileRead", "Failed to read data from file") \ + XX(ERROR_SYSTEM_FILE_WRITE , 1045, "FileWrite", "Failed to write data to file") \ + XX(ERROR_SYSTEM_FILE_EOF , 1046, "FileEof", "File is EOF or end of file") \ + XX(ERROR_SYSTEM_FILE_RENAME , 1047, "FileRename", "Failed to rename file") \ + XX(ERROR_SYSTEM_CREATE_PIPE , 1048, "PipeCreate", "Create pipe for signal failed") \ + XX(ERROR_SYSTEM_FILE_SEEK , 1049, "FileSeek", "Failed to seek in file") \ + XX(ERROR_SYSTEM_IO_INVALID , 1050, "IOInvalid", "Invalid IO operation") \ + XX(ERROR_ST_EXCEED_THREADS , 1051, "StThreadsExceed", "ST exceed max threads") \ + XX(ERROR_SYSTEM_SECURITY , 1052, "SecurityCheck", "Referer security check failed") \ + XX(ERROR_SYSTEM_SECURITY_DENY , 1053, "SecurityDeny", "Referer security failed for deny rules") \ + XX(ERROR_SYSTEM_SECURITY_ALLOW , 1054, "SecurityAllow", "Referer security failed for allow rules") \ + XX(ERROR_SYSTEM_TIME , 1055, "SystemTime", "Invalid system time") \ + XX(ERROR_SYSTEM_DIR_EXISTS , 1056, "DirExists", "Directory already exists") \ + XX(ERROR_SYSTEM_CREATE_DIR , 1057, "DirCreate", "Create directory failed") \ + XX(ERROR_SYSTEM_KILL , 1058, "ProcessKill", "Send signal to process by kill failed") \ + XX(ERROR_SYSTEM_CONFIG_PERSISTENCE , 1059, "ConfigPersistence", "Failed to persistence configuration") \ + XX(ERROR_SYSTEM_CONFIG_RAW , 1060, "ConfigRaw", "RAW API serves failed") \ + XX(ERROR_SYSTEM_CONFIG_RAW_DISABLED , 1061, "ConfigRawDisable", "RAW API is disabled") \ + XX(ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED , 1062, "ConfigRawNotAllowed", "RAW API is not allowed") \ + XX(ERROR_SYSTEM_CONFIG_RAW_PARAMS , 1063, "ConfigRawParams", "RAW API parameters are invalid") \ + XX(ERROR_SYSTEM_FILE_NOT_EXISTS , 1064, "FileNotFound", "Request file does not exists") \ + XX(ERROR_SYSTEM_HOURGLASS_RESOLUTION , 1065, "TimerResolution", "Resolution for timer or hourglass is invalid") \ + XX(ERROR_SYSTEM_DNS_RESOLVE , 1066, "DnsResolve", "Failed to parse domain name by DNS") \ + XX(ERROR_SYSTEM_FRAGMENT_UNLINK , 1067, "FileRemove", "Failed to remove or unlink file") \ + XX(ERROR_SYSTEM_FRAGMENT_RENAME , 1068, "FileRename", "Failed to rename file segment") \ + XX(ERROR_THREAD_DISPOSED , 1069, "StThreadDispose", "Failed for ST thread is disposed") \ + XX(ERROR_THREAD_INTERRUPED , 1070, "StThreadInterrupt", "ST thread is interrupted") \ + XX(ERROR_THREAD_TERMINATED , 1071, "StThreadTerminate", "ST thread is terminated") \ + XX(ERROR_THREAD_DUMMY , 1072, "StThreadDummy", "Can not operate ST dummy thread") \ + XX(ERROR_ASPROCESS_PPID , 1073, "SystemAsProcess", "As-process does not support pid change") \ + XX(ERROR_EXCEED_CONNECTIONS , 1074, "ConnectionsExceed", "Failed for exceed system max connections") \ + XX(ERROR_SOCKET_SETKEEPALIVE , 1075, "SocketKeepAlive", "Failed to set socket option SO_KEEPALIVE") \ + XX(ERROR_SOCKET_NO_NODELAY , 1076, "SocketNoDelay", "Failed to set socket option TCP_NODELAY") \ + XX(ERROR_SOCKET_SNDBUF , 1077, "SocketSendBuffer", "Failed to set socket option SO_SNDBUF") \ + XX(ERROR_THREAD_STARTED , 1078, "StThreadStarted", "ST thread is already started") \ + XX(ERROR_SOCKET_SETREUSEADDR , 1079, "SocketReuseAddr", "Failed to set socket option SO_REUSEADDR") \ + XX(ERROR_SOCKET_SETCLOSEEXEC , 1080, "SocketCloseExec", "Failed to set socket option FD_CLOEXEC") \ + XX(ERROR_SOCKET_ACCEPT , 1081, "SocketAccept", "Accpet client socket failed") \ + XX(ERROR_THREAD_CREATE , 1082, "StThreadCreate", "Create ST thread failed") \ + XX(ERROR_THREAD_FINISHED , 1083, "StThreadFinished", "ST thread finished without error") \ + XX(ERROR_PB_NO_SPACE , 1084, "ProtobufNoSpace", "Failed to encode protobuf for no buffer space left") \ + XX(ERROR_CLS_INVALID_CONFIG , 1085, "ClsConfig", "Invalid configuration for TencentCloud CLS") \ + XX(ERROR_CLS_EXCEED_SIZE , 1086, "ClsExceedSize", "CLS logs exceed max size 5MB") \ + XX(ERROR_APM_EXCEED_SIZE , 1087, "ApmExceedSize", "APM logs exceed max size 5MB") + +/**************************************************/ +/* RTMP protocol error. */ +#define SRS_ERRNO_MAP_RTMP(XX) \ + XX(ERROR_RTMP_PLAIN_REQUIRED , 2000, "RtmpPlainRequired", "RTMP handshake requires plain text") \ + XX(ERROR_RTMP_CHUNK_START , 2001, "RtmpChunkStart", "RTMP packet must be fresh chunk") \ + XX(ERROR_RTMP_MSG_INVALID_SIZE , 2002, "RtmpMsgSize", "Invalid RTMP message size") \ + XX(ERROR_RTMP_AMF0_DECODE , 2003, "Amf0Decode", "Decode AMF0 message failed") \ + XX(ERROR_RTMP_AMF0_INVALID , 2004, "Amf0Invalid", "Invalid AMF0 message type") \ + XX(ERROR_RTMP_REQ_CONNECT , 2005, "RtmpConnect", "Invalid RTMP connect packet without tcUrl") \ + XX(ERROR_RTMP_REQ_TCURL , 2006, "RtmpTcUrl", "Failed to discover tcUrl from request") \ + XX(ERROR_RTMP_MESSAGE_DECODE , 2007, "RtmpDecode", "Failed to decode RTMP packet") \ + XX(ERROR_RTMP_MESSAGE_ENCODE , 2008, "RtmpEncode", "Failed to encode RTMP packet") \ + XX(ERROR_RTMP_AMF0_ENCODE , 2009, "Amf0Encode", "Encode AMF0 message failed") \ + XX(ERROR_RTMP_CHUNK_SIZE , 2010, "RtmpChunkSize", "Invalid RTMP chunk size") \ + XX(ERROR_RTMP_TRY_SIMPLE_HS , 2011, "RtmpTrySimple", "Handshake failed please try simple strategy") \ + XX(ERROR_RTMP_CH_SCHEMA , 2012, "RtmpSchema", "RTMP handshake failed for schema changed") \ + XX(ERROR_RTMP_PACKET_SIZE , 2013, "RtmpPacketSize", "RTMP packet size changed in chunks") \ + XX(ERROR_RTMP_VHOST_NOT_FOUND , 2014, "NoVhost", "Request vhost not found") \ + XX(ERROR_RTMP_ACCESS_DENIED , 2015, "SecurityDenied", "Referer check failed and access denied") \ + XX(ERROR_RTMP_HANDSHAKE , 2016, "RtmpHandshake", "RTMP handshake failed") \ + XX(ERROR_RTMP_NO_REQUEST , 2017, "RtmpNoRequest", "Invalid RTMP response for no request found") \ + XX(ERROR_RTMP_HS_SSL_REQUIRE , 2018, "RtmpSslRequire", "RTMP handshake failed for SSL required") \ + XX(ERROR_RTMP_DURATION_EXCEED , 2019, "DurationExceed", "Failed for exceed max service duration") \ + XX(ERROR_RTMP_EDGE_PLAY_STATE , 2020, "EdgePlayState", "Invalid edge state for play") \ + XX(ERROR_RTMP_EDGE_PUBLISH_STATE , 2021, "EdgePublishState", "Invalid edge state for publish") \ + XX(ERROR_RTMP_EDGE_PROXY_PULL , 2022, "EdgeProxyPull", "Failed for edge pull state") \ + XX(ERROR_RTMP_EDGE_RELOAD , 2023, "EdgeReload", "Vhost with edge does not support reload") \ + XX(ERROR_RTMP_AGGREGATE , 2024, "RtmpAggregate", "Failed to handle RTMP aggregate message") \ + XX(ERROR_RTMP_BWTC_DATA , 2025, "BandwidthData", "Invalid data for bandwidth check") \ + XX(ERROR_OpenSslCreateDH , 2026, "SslCreateDh", "Failed to create DH for SSL") \ + XX(ERROR_OpenSslCreateP , 2027, "SslCreateP", "Failed to create P by BN for SSL") \ + XX(ERROR_OpenSslCreateG , 2028, "SslCreateG", "Failed to create G by BN for SSL") \ + XX(ERROR_OpenSslParseP1024 , 2029, "SslParseP1024", "Failed to parse P1024 for SSL") \ + XX(ERROR_OpenSslSetG , 2030, "SslSetG", "Failed to set G by BN for SSL") \ + XX(ERROR_OpenSslGenerateDHKeys , 2031, "SslDhKeys", "Failed to generate DH keys for SSL") \ + XX(ERROR_OpenSslCopyKey , 2032, "SslCopyKey", "Failed to copy key for SSL") \ + XX(ERROR_OpenSslSha256Update , 2033, "SslSha256Update", "Failed to update HMAC sha256 for SSL") \ + XX(ERROR_OpenSslSha256Init , 2034, "SslSha256Init", "Failed to init HMAC sha256 for SSL") \ + XX(ERROR_OpenSslSha256Final , 2035, "SslSha256Final", "Failed to final HMAC sha256 for SSL") \ + XX(ERROR_OpenSslSha256EvpDigest , 2036, "SslSha256Digest", "Failed to calculate evp digest of HMAC sha256 for SSL") \ + XX(ERROR_OpenSslSha256DigestSize , 2037, "SslSha256Size", "Invalid digest size of HMAC sha256 of SSL") \ + XX(ERROR_OpenSslGetPeerPublicKey , 2038, "SslPublicKey", "Failed to get peer public key of SSL") \ + XX(ERROR_OpenSslComputeSharedKey , 2039, "SslShareKey", "Failed to get shared key of SSL") \ + XX(ERROR_RTMP_MIC_CHUNKSIZE_CHANGED , 2040, "RtmpMicChunk", "Invalid RTMP mic for chunk size changed") \ + XX(ERROR_RTMP_MIC_CACHE_OVERFLOW , 2041, "RtmpMicCache", "Invalid RTMP mic for cache overflow") \ + XX(ERROR_RTSP_TOKEN_NOT_NORMAL , 2042, "RtspToken", "Invalid RTSP token state not normal") \ + XX(ERROR_RTSP_REQUEST_HEADER_EOF , 2043, "RtspHeaderEof", "Invalid RTSP request for header EOF") \ + XX(ERROR_RTP_HEADER_CORRUPT , 2044, "RtspHeaderCorrupt", "Invalid RTSP RTP packet for header corrupt") \ + XX(ERROR_RTP_TYPE96_CORRUPT , 2045, "RtspP96Corrupt", "Invalid RTSP RTP packet for P96 corrupt") \ + XX(ERROR_RTP_TYPE97_CORRUPT , 2046, "RtspP97Corrupt", "Invalid RTSP RTP packet for P97 corrupt") \ + XX(ERROR_RTSP_AUDIO_CONFIG , 2047, "RtspAudioConfig", "RTSP no audio sequence header config") \ + XX(ERROR_RTMP_STREAM_NOT_FOUND , 2048, "StreamNotFound", "Request stream is not found") \ + XX(ERROR_RTMP_CLIENT_NOT_FOUND , 2049, "ClientNotFound", "Request client is not found") \ + XX(ERROR_OpenSslCreateHMAC , 2050, "SslCreateHmac", "Failed to create HMAC for SSL") \ + XX(ERROR_RTMP_STREAM_NAME_EMPTY , 2051, "StreamNameEmpty", "Invalid stream for name is empty") \ + XX(ERROR_HTTP_HIJACK , 2052, "HttpHijack", "Failed to hijack HTTP handler") \ + XX(ERROR_RTMP_MESSAGE_CREATE , 2053, "MessageCreate", "Failed to create shared pointer message") \ + XX(ERROR_RTMP_PROXY_EXCEED , 2054, "RtmpProxy", "Failed to decode message of RTMP proxy") \ + XX(ERROR_RTMP_CREATE_STREAM_DEPTH , 2055, "RtmpIdentify", "Failed to identify RTMP client") \ + XX(ERROR_CONTROL_REDIRECT , 2997, "RtmpRedirect", "RTMP 302 redirection") \ + XX(ERROR_CONTROL_RTMP_CLOSE , 2998, "RtmpClose", "RTMP connection is closed") \ + XX(ERROR_CONTROL_REPUBLISH , 2999, "RtmpRepublish", "RTMP stream is republished") + +/**************************************************/ +/* The application level errors. */ +#define SRS_ERRNO_MAP_APP(XX) \ + XX(ERROR_HLS_METADATA , 3000, "HlsMetadata", "HLS metadata is invalid") \ + XX(ERROR_HLS_DECODE_ERROR , 3001, "HlsDecode", "HLS decode av stream failed") \ + XX(ERROR_HLS_CREATE_DIR , 3002, "HlsCreateDir", "HLS create directory failed") \ + XX(ERROR_HLS_OPEN_FAILED , 3003, "HlsOpenFile", "HLS open m3u8 file failed") \ + XX(ERROR_HLS_WRITE_FAILED , 3004, "HlsWriteFile", "HLS write m3u8 file failed") \ + XX(ERROR_HLS_AAC_FRAME_LENGTH , 3005, "HlsAacFrame", "HLS decode aac frame size failed") \ + XX(ERROR_HLS_AVC_SAMPLE_SIZE , 3006, "HlsAvcFrame", "HLS decode avc sample size failed") \ + XX(ERROR_HTTP_PARSE_URI , 3007, "HttpParseUrl", "HTTP parse url failed") \ + XX(ERROR_HTTP_DATA_INVALID , 3008, "HttpResponseData", "HTTP response data invalid") \ + XX(ERROR_HTTP_PARSE_HEADER , 3009, "HttpParseHeader", "HTTP parse header failed") \ + XX(ERROR_HTTP_HANDLER_MATCH_URL , 3010, "HttpHandlerUrl", "HTTP handler invalid url") \ + XX(ERROR_HTTP_HANDLER_INVALID , 3011, "HttpHandlerInvalid", "HTTP handler invalid") \ + XX(ERROR_HTTP_API_LOGS , 3012, "HttpApiLogs", "HTTP API logs invalid") \ + XX(ERROR_HTTP_REMUX_SEQUENCE_HEADER , 3013, "VodNoSequence", "HTTP VoD sequence header not found") \ + XX(ERROR_HTTP_REMUX_OFFSET_OVERFLOW , 3014, "VodOffset", "HTTP VoD request offset overflow") \ + XX(ERROR_ENCODER_VCODEC , 3015, "FFmpegNoCodec", "FFmpeg no audio and video codec") \ + XX(ERROR_ENCODER_OUTPUT , 3016, "FFmpegNoOutput", "FFmpeg no output url") \ + XX(ERROR_ENCODER_ACHANNELS , 3017, "FFmpegChannels", "Invalid audio channels for FFmpeg") \ + XX(ERROR_ENCODER_ASAMPLE_RATE , 3018, "FFmpegSampleRate", "Invalid audio sample rate for FFmpeg") \ + XX(ERROR_ENCODER_ABITRATE , 3019, "FFmpegAudioBitrate", "Invalid audio bitrate for FFmpeg") \ + XX(ERROR_ENCODER_ACODEC , 3020, "FFmpegAudioCodec", "Invalid audio codec for FFmpeg") \ + XX(ERROR_ENCODER_VPRESET , 3021, "FFmpegPreset", "Invalid video preset for FFmpeg") \ + XX(ERROR_ENCODER_VPROFILE , 3022, "FFmpegProfile", "Invalid video profile for FFmpeg") \ + XX(ERROR_ENCODER_VTHREADS , 3023, "FFmpegThreads", "Invalid threads config for FFmpeg") \ + XX(ERROR_ENCODER_VHEIGHT , 3024, "FFmpegHeight", "Invalid video height for FFmpeg") \ + XX(ERROR_ENCODER_VWIDTH , 3025, "FFmpegWidth", "Invalid video width for FFmpeg") \ + XX(ERROR_ENCODER_VFPS , 3026, "FFmpegFps", "Invalid video FPS for FFmpeg") \ + XX(ERROR_ENCODER_VBITRATE , 3027, "FFmpegVideoBitrate", "Invalid video bitrate for FFmpeg") \ + XX(ERROR_ENCODER_FORK , 3028, "FFmpegFork", "Failed to fork FFmpeg trancoder process") \ + XX(ERROR_ENCODER_LOOP , 3029, "FFmpegLoop", "FFmpeg transcoder infinite loop detected") \ + XX(ERROR_FORK_OPEN_LOG , 3030, "FFmpegLog", "Open log file failed for FFmpeg") \ + XX(ERROR_FORK_DUP2_LOG , 3031, "FFmpegDup2", "Dup2 redirect log failed for FFmpeg") \ + XX(ERROR_ENCODER_PARSE , 3032, "FFmpegBinary", "FFmpeg binary not found") \ + XX(ERROR_ENCODER_NO_INPUT , 3033, "FFmpegNoInput", "No input url for FFmpeg") \ + XX(ERROR_ENCODER_NO_OUTPUT , 3034, "FFmpegNoOutput", "No output url for FFmpeg") \ + XX(ERROR_ENCODER_INPUT_TYPE , 3035, "FFmpegInputType", "Invalid input type for FFmpeg") \ + XX(ERROR_KERNEL_FLV_HEADER , 3036, "FlvHeader", "FLV decode header failed") \ + XX(ERROR_KERNEL_FLV_STREAM_CLOSED , 3037, "VodFlvClosed", "FLV file closed for HTTP VoD") \ + XX(ERROR_KERNEL_STREAM_INIT , 3038, "StreamInit", "Init kernel stream failed") \ + XX(ERROR_EDGE_VHOST_REMOVED , 3039, "EdgeVhostRemoved", "Vhost is removed for edge") \ + XX(ERROR_HLS_AVC_TRY_OTHERS , 3040, "AvcTryOthers", "Should try other strategies for AVC decoder") \ + XX(ERROR_H264_API_NO_PREFIXED , 3041, "AvcAnnexbPrefix", "No annexb prefix for AVC decoder") \ + XX(ERROR_FLV_INVALID_VIDEO_TAG , 3042, "FlvInvalidTag", "Invalid video tag for FLV") \ + XX(ERROR_H264_DROP_BEFORE_SPS_PPS , 3043, "DropBeforeSequence", "Drop frames before get sps and pps") \ + XX(ERROR_H264_DUPLICATED_SPS , 3044, "SpsDuplicate", "Got duplicated sps for video") \ + XX(ERROR_H264_DUPLICATED_PPS , 3045, "PpsDuplicate", "Got duplicated pps for video") \ + XX(ERROR_AAC_REQUIRED_ADTS , 3046, "AacAdtsRequire", "ADTS header is required for AAC") \ + XX(ERROR_AAC_ADTS_HEADER , 3047, "AacAdtsHeader", "Failed to parse ADTS header for AAC") \ + XX(ERROR_AAC_DATA_INVALID , 3048, "AacData", "Failed to parse data for AAC") \ + XX(ERROR_HLS_TRY_MP3 , 3049, "HlsTryMp3", "Should try mp3 when codec detected") \ + XX(ERROR_HTTP_DVR_DISABLED , 3050, "DvrDisabled", "Failed for DVR disabled") \ + XX(ERROR_HTTP_DVR_REQUEST , 3051, "DvrRequest", "Failed for DVR request") \ + XX(ERROR_HTTP_JSON_REQUIRED , 3052, "JsonRequired", "Failed for JSON required") \ + XX(ERROR_HTTP_DVR_CREATE_REQUEST , 3053, "DvrCreate", "Failed for DVR create request") \ + XX(ERROR_HTTP_DVR_NO_TAEGET , 3054, "DvrNoTarget", "Failed for DVR no target") \ + XX(ERROR_ADTS_ID_NOT_AAC , 3055, "AacAdtsId", "Failed for ADTS id not AAC") \ + XX(ERROR_HDS_OPEN_F4M_FAILED , 3056, "HdsOpenF4m", "Failed to open F4m file for HDS") \ + XX(ERROR_HDS_WRITE_F4M_FAILED , 3057, "HdsWriteF4m", "Failed to write F4m file for HDS") \ + XX(ERROR_HDS_OPEN_BOOTSTRAP_FAILED , 3058, "HdsOpenBoot", "Failed to open bootstrap for HDS") \ + XX(ERROR_HDS_WRITE_BOOTSTRAP_FAILED , 3059, "HdsWriteBoot", "Failed to write bootstrap for HDS") \ + XX(ERROR_HDS_OPEN_FRAGMENT_FAILED , 3060, "HdsOpenFragment", "Failed to open fragment file for HDS") \ + XX(ERROR_HDS_WRITE_FRAGMENT_FAILED , 3061, "HdsWriteFragment", "Failed to write fragment file for HDS") \ + XX(ERROR_HLS_NO_STREAM , 3062, "HlsNoStream", "No stream configured for HLS") \ + XX(ERROR_JSON_LOADS , 3063, "JsonLoads", "Failed for JSOn loads") \ + XX(ERROR_RESPONSE_CODE , 3064, "HttpResponseCode", "No code in HTTP response json object") \ + XX(ERROR_RESPONSE_DATA , 3065, "HttpResponseData", "Invalid HTTP response body data") \ + XX(ERROR_REQUEST_DATA , 3066, "HttpRequestData", "Invalid HTTP request body data") \ + XX(ERROR_EDGE_PORT_INVALID , 3067, "EdgePort", "Invalid edge port") \ + XX(ERROR_EXPECT_FILE_IO , 3068, "VodNotFile", "HTTP VoD not file stream") \ + XX(ERROR_MP4_BOX_OVERFLOW , 3069, "Mp4BoxOverflow", "Only support 32 bits box for MP4") \ + XX(ERROR_MP4_BOX_REQUIRE_SPACE , 3070, "Mp4BoxNoSpace", "Failed to decode MP4 box for no buffer space") \ + XX(ERROR_MP4_BOX_ILLEGAL_TYPE , 3071, "Mp4BoxType", "Invalid box type for MP4") \ + XX(ERROR_MP4_BOX_ILLEGAL_SCHEMA , 3072, "Mp4BoxNoFtyp", "Missing box FTYP for MP4") \ + XX(ERROR_MP4_BOX_STRING , 3073, "Mp4BoxString", "MP4 string corrupt") \ + XX(ERROR_MP4_BOX_ILLEGAL_BRAND , 3074, "Mp4BoxBrand", "Invalid FTYP brand for MP4") \ + XX(ERROR_MP4_ESDS_SL_Config , 3075, "Mp4BoxEsdsSl", "Invalid SL config for ESDS box for MP4") \ + XX(ERROR_MP4_ILLEGAL_MOOV , 3076, "Mp4BoxMoov", "Invalid MOOV box for MP4") \ + XX(ERROR_MP4_ILLEGAL_HANDLER , 3077, "Mp4BoxHandler", "Invalid handler for MP4") \ + XX(ERROR_MP4_ILLEGAL_TRACK , 3078, "Mp4BoxTrack", "Invalid track box for MP4") \ + XX(ERROR_MP4_MOOV_OVERFLOW , 3079, "Mp4StszOverflow", "STSZ box size overflow for MP4") \ + XX(ERROR_MP4_ILLEGAL_SAMPLES , 3080, "Mp4StszSamples", "STSZ box samples invalid") \ + XX(ERROR_MP4_ILLEGAL_TIMESTAMP , 3081, "Mp4Timestamp", "Invalid timestamp of ctts or stts for MP4") \ + XX(ERROR_DVR_CANNOT_APPEND , 3082, "DvrAppend", "DVR append data to file failed") \ + XX(ERROR_DVR_ILLEGAL_PLAN , 3083, "DvrPlan", "Invalid DVR plan") \ + XX(ERROR_FLV_REQUIRE_SPACE , 3084, "FlvNoSpace", "Failed to decode FLV for no buffer space") \ + XX(ERROR_MP4_AVCC_CHANGE , 3085, "Mp4AvccChange", "MP4 does not support video AVCC change") \ + XX(ERROR_MP4_ASC_CHANGE , 3086, "Mp4AscChange", "MP4 does not support audio ASC change") \ + XX(ERROR_DASH_WRITE_FAILED , 3087, "DashMpdWrite", "DASH write mpd file failed") \ + XX(ERROR_TS_CONTEXT_NOT_READY , 3088, "TsContexNotReady", "TS context not ready") \ + XX(ERROR_MP4_ILLEGAL_MOOF , 3089, "Mp4BoxNoMoof", "Missing MP4 box MOOF or no audio video track") \ + XX(ERROR_MP4_ILLEGAL_MDAT , 3090, "Mp4BoxMdat", "Invalid MDAT header size") \ + XX(ERROR_OCLUSTER_DISCOVER , 3091, "OriginClusterDiscover", "Failed to discover origin cluster service") \ + XX(ERROR_OCLUSTER_REDIRECT , 3092, "OriginClusterRedirect", "Failed to redirect origin cluster node") \ + XX(ERROR_INOTIFY_CREATE , 3093, "InotifyCreate", "Failed to create inotify for config listener") \ + XX(ERROR_INOTIFY_OPENFD , 3094, "InotifyOpenFd", "Failed to open inotify fd for config listener") \ + XX(ERROR_INOTIFY_WATCH , 3095, "InotfyWatch", "Failed to watch inotify for config listener") \ + XX(ERROR_HTTP_URL_UNESCAPE , 3096, "HttpUrlUnescape", "Failed to unescape URL for HTTP") \ + XX(ERROR_HTTP_WITH_BODY , 3097, "HttpWithBody", "Failed for HTTP body") + +/**************************************************/ +/* HTTP/StreamCaster protocol error. */ +#define SRS_ERRNO_MAP_HTTP(XX) \ + XX(ERROR_HTTP_PATTERN_EMPTY , 4000, "HttpPatternEmpty", "Failed to handle HTTP request for no pattern") \ + XX(ERROR_HTTP_PATTERN_DUPLICATED , 4001, "HttpPatternDuplicated", "Failed to handle HTTP request for pattern duplicated") \ + XX(ERROR_HTTP_URL_NOT_CLEAN , 4002, "HttpUrlNotClean", "Failed to handle HTTP request for URL not clean") \ + XX(ERROR_HTTP_CONTENT_LENGTH , 4003, "HttpContentLength", "Exceed HTTP content length") \ + XX(ERROR_HTTP_LIVE_STREAM_EXT , 4004, "HttpStreamExt", "Invalid HTTP stream extension") \ + XX(ERROR_HTTP_STATUS_INVALID , 4005, "HttpStatus", "Invalid HTTP status code") \ + XX(ERROR_KERNEL_AAC_STREAM_CLOSED , 4006, "AacStreamClosed", "AAC stream is closed") \ + XX(ERROR_AAC_DECODE_ERROR , 4007, "AacStreamDecode", "Failed to decode AAC stream") \ + XX(ERROR_KERNEL_MP3_STREAM_CLOSED , 4008, "Mp3StreamClosed", "MP3 stream is closed") \ + XX(ERROR_MP3_DECODE_ERROR , 4009, "Mp3StreamDecode", "Failed to decode MP3 stream") \ + XX(ERROR_STREAM_CASTER_ENGINE , 4010, "CasterEngine", "Invalid engine config for stream caster") \ + XX(ERROR_STREAM_CASTER_PORT , 4011, "CasterPort", "Invalid port config for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_HEADER , 4012, "CasterTsHeader", "Invalid ts header for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_SYNC_BYTE , 4013, "CasterTsSync", "Invalid ts sync byte for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_AF , 4014, "CasterTsAdaption", "Invalid ts adaption field for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_CRC32 , 4015, "CasterTsCrc32", "Invalid ts CRC32 checksum for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_PSI , 4016, "CasterTsPsi", "Invalid ts PSI payload for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_PAT , 4017, "CasterTsPat", "Invalid ts PAT program for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_PMT , 4018, "CasterTsPmt", "Invalid ts PMT information for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_PSE , 4019, "CasterTsPse", "Invalid ts PSE payload for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_ES , 4020, "CasterTsEs", "Invalid ts ES stream for stream caster") \ + XX(ERROR_STREAM_CASTER_TS_CODEC , 4021, "CasterTsCodec", "Invalid ts codec for stream caster") \ + XX(ERROR_STREAM_CASTER_AVC_SPS , 4022, "CasterTsAvcSps", "Invalid ts AVC SPS for stream caster") \ + XX(ERROR_STREAM_CASTER_AVC_PPS , 4023, "CasterTsAvcPps", "Invalid ts AVC PPS for stream caster") \ + XX(ERROR_STREAM_CASTER_FLV_TAG , 4024, "CasterFlvTag", "Invalid flv tag for stream caster") \ + XX(ERROR_HTTP_RESPONSE_EOF , 4025, "HttpResponseEof", "HTTP response stream is EOF") \ + XX(ERROR_HTTP_INVALID_CHUNK_HEADER , 4026, "HttpChunkHeader", "Invalid HTTP chunk header") \ + XX(ERROR_AVC_NALU_UEV , 4027, "AvcNaluUev", "Failed to read UEV for AVC NALU") \ + XX(ERROR_AAC_BYTES_INVALID , 4028, "AacBytesInvalid", "Invalid bytes for AAC stream") \ + XX(ERROR_HTTP_REQUEST_EOF , 4029, "HttpRequestEof", "HTTP request stream is EOF") \ + XX(ERROR_HTTP_302_INVALID , 4038, "HttpRedirectDepth", "Exceed max depth for HTTP redirect") \ + XX(ERROR_BASE64_DECODE , 4039, "Base64Decode", "Failed to decode the BASE64 content") \ + XX(ERROR_HTTP_STREAM_EOF , 4040, "HttpStreamEof", "HTTP stream is EOF") \ + XX(ERROR_HTTPS_NOT_SUPPORTED , 4041, "HttpsNotSupported", "HTTPS is not supported") \ + XX(ERROR_HTTPS_HANDSHAKE , 4042, "HttpsHandshake", "Failed to do handshake for HTTPS") \ + XX(ERROR_HTTPS_READ , 4043, "HttpsRead", "Failed to read data from HTTPS stream") \ + XX(ERROR_HTTPS_WRITE , 4044, "HttpsWrite", "Failed to write data to HTTPS stream") \ + XX(ERROR_HTTPS_KEY_CRT , 4045, "HttpsSslFile", "Failed to load SSL key or crt file for HTTPS") + +/**************************************************/ +/* RTC protocol error. */ +#define SRS_ERRNO_MAP_RTC(XX) \ + XX(ERROR_RTC_PORT , 5000, "RtcPort", "Invalid RTC config for listen port") \ + XX(ERROR_RTP_PACKET_CREATE , 5001, "RtcPacketCreate", "Failed to create RTP packet for RTC") \ + XX(ERROR_OpenSslCreateSSL , 5002, "RtcSslCreate", "RTC create SSL context failed") \ + XX(ERROR_OpenSslBIOReset , 5003, "RtcSslReset", "RTC reset SSL BIO context failed") \ + XX(ERROR_OpenSslBIOWrite , 5004, "RtcSslWrite", "RTC write SSL BIO stream failed") \ + XX(ERROR_OpenSslBIONew , 5005, "RtcSslNew", "RTC create new SSL BIO context failed") \ + XX(ERROR_RTC_RTP , 5006, "RtcRtpHeader", "Invalid RTP header of packet for RTC") \ + XX(ERROR_RTC_RTCP , 5007, "RtcRtcpType", "Invalid RTCP packet type for RTC") \ + XX(ERROR_RTC_STUN , 5008, "RtcStun", "RTC do STUN or ICE failed") \ + XX(ERROR_RTC_DTLS , 5009, "RtcDtls", "RTC do DTLS handshake failed") \ + XX(ERROR_RTC_UDP , 5010, "RtcUdpPacket", "Invalid UDP packet for RTC") \ + XX(ERROR_RTC_RTP_MUXER , 5011, "RtcRtpMuxer", "Failed to mux RTP packet for RTC") \ + XX(ERROR_RTC_SDP_DECODE , 5012, "RtcSdpDecode", "Failed to decode SDP for RTC") \ + XX(ERROR_RTC_SRTP_INIT , 5013, "RtcSrtpInit", "Failed to init SRTP context for RTC") \ + XX(ERROR_RTC_SRTP_PROTECT , 5014, "RtcSrtpProtect", "Failed to crypt data by SRTP for RTC") \ + XX(ERROR_RTC_SRTP_UNPROTECT , 5015, "RtcSrtpUnprotect", "Failed to decrypt data by SRTP for RTC") \ + XX(ERROR_RTC_RTCP_CHECK , 5016, "RtcRtcpPacket", "Invalid RTCP packet for RTC") \ + XX(ERROR_RTC_SOURCE_CHECK , 5017, "RtcSourceCheck", "Invalid source for RTC") \ + XX(ERROR_RTC_SDP_EXCHANGE , 5018, "RtcSdpNegotiate", "RTC do SDP negotiate failed") \ + XX(ERROR_RTC_API_BODY , 5019, "RtcApiJson", "Body of RTC API should be JSON format") \ + XX(ERROR_RTC_SOURCE_BUSY , 5020, "RtcStreamBusy", "RTC stream already exists or busy") \ + XX(ERROR_RTC_DISABLED , 5021, "RtcDisabled", "RTC is disabled by configuration") \ + XX(ERROR_RTC_NO_SESSION , 5022, "RtcNoSession", "Invalid packet for no RTC session matched") \ + XX(ERROR_RTC_INVALID_PARAMS , 5023, "RtcInvalidParams", "Invalid API parameters for RTC") \ + XX(ERROR_RTC_DUMMY_BRIDGER , 5024, "RtcDummyBridger", "RTC dummy bridger error") \ + XX(ERROR_RTC_STREM_STARTED , 5025, "RtcStreamStarted", "RTC stream already started") \ + XX(ERROR_RTC_TRACK_CODEC , 5026, "RtcTrackCodec", "RTC track codec error") \ + XX(ERROR_RTC_NO_PLAYER , 5027, "RtcNoPlayer", "RTC player not found") \ + XX(ERROR_RTC_NO_PUBLISHER , 5028, "RtcNoPublisher", "RTC publisher not found") \ + XX(ERROR_RTC_DUPLICATED_SSRC , 5029, "RtcSsrcDuplicated", "Invalid RTC packet for SSRC is duplicated") \ + XX(ERROR_RTC_NO_TRACK , 5030, "RtcNoTrack", "Drop RTC packet for track not found") \ + XX(ERROR_RTC_RTCP_EMPTY_RR , 5031, "RtcEmptyRr", "Invalid RTCP packet for RR is empty") \ + XX(ERROR_RTC_TCP_SIZE , 5032, "RtcTcpSize", "RTC TCP packet size is invalid") \ + XX(ERROR_RTC_TCP_PACKET , 5033, "RtcTcpStun", "RTC TCP first packet must be STUN") \ + XX(ERROR_RTC_TCP_STUN , 5034, "RtcTcpSession", "RTC TCP packet is invalid for session not found") \ + XX(ERROR_RTC_TCP_UNIQUE , 5035, "RtcUnique", "RTC only support one UDP or TCP network") + +/**************************************************/ +/* SRT protocol error. */ +#define SRS_ERRNO_MAP_SRT(XX) \ + XX(ERROR_SRT_EPOLL , 6000, "SrtEpoll", "SRT epoll operation failed") \ + XX(ERROR_SRT_IO , 6001, "SrtIo", "SRT read or write failed") \ + XX(ERROR_SRT_TIMEOUT , 6002, "SrtTimeout", "SRT connection is timeout") \ + XX(ERROR_SRT_INTERRUPT , 6003, "SrtInterrupt", "SRT connection is interrupted") \ + XX(ERROR_SRT_LISTEN , 6004, "SrtListen", "SRT listen failed") \ + XX(ERROR_SRT_SOCKOPT , 6005, "SrtSetSocket", "SRT set socket option failed") \ + XX(ERROR_SRT_CONN , 6006, "SrtConnection", "SRT connectin level error") \ + XX(ERROR_SRT_SOURCE_BUSY , 6007, "SrtStreamBusy", "SRT stream already exists or busy") \ + XX(ERROR_RTMP_TO_SRT , 6008, "SrtFromRtmp", "Covert RTMP to SRT failed") \ + XX(ERROR_SRT_STATS , 6009, "SrtStats", "SRT get statistic data failed") + +/**************************************************/ +/* For user-define error. */ +#define SRS_ERRNO_MAP_USER(XX) \ + XX(ERROR_USER_START , 9000, "UserStart", "Start error code for user") \ + XX(ERROR_USER_DISCONNECT , 9001, "UserDisconnect", "User requires to disconnect connection") \ + XX(ERROR_SOURCE_NOT_FOUND , 9002, "UserNoSource", "Stream source not found") \ + XX(ERROR_USER_END , 9999, "UserEnd", "The last error code of user") + +// For human readable error generation. Generate integer error code. +#define SRS_ERRNO_GEN(n, v, m, s) n = v, +enum SrsErrorCode { #ifndef _WIN32 -#define ERROR_SUCCESS 0 + ERROR_SUCCESS = 0, #endif - -/////////////////////////////////////////////////////// -// The system error. -/////////////////////////////////////////////////////// -#define ERROR_SOCKET_CREATE 1000 -#define ERROR_SOCKET_SETREUSE 1001 -#define ERROR_SOCKET_BIND 1002 -#define ERROR_SOCKET_LISTEN 1003 -#define ERROR_SOCKET_CLOSED 1004 -#define ERROR_SOCKET_GET_PEER_NAME 1005 -#define ERROR_SOCKET_GET_PEER_IP 1006 -#define ERROR_SOCKET_READ 1007 -#define ERROR_SOCKET_READ_FULLY 1008 -#define ERROR_SOCKET_WRITE 1009 -#define ERROR_SOCKET_WAIT 1010 -#define ERROR_SOCKET_TIMEOUT 1011 -#define ERROR_SOCKET_CONNECT 1012 -#define ERROR_ST_SET_EPOLL 1013 -#define ERROR_ST_INITIALIZE 1014 -#define ERROR_ST_OPEN_SOCKET 1015 -#define ERROR_ST_CREATE_LISTEN_THREAD 1016 -#define ERROR_ST_CREATE_CYCLE_THREAD 1017 -#define ERROR_ST_CONNECT 1018 -#define ERROR_SYSTEM_PACKET_INVALID 1019 -#define ERROR_SYSTEM_CLIENT_INVALID 1020 -#define ERROR_SYSTEM_ASSERT_FAILED 1021 -#define ERROR_READER_BUFFER_OVERFLOW 1022 -#define ERROR_SYSTEM_CONFIG_INVALID 1023 -#define ERROR_SYSTEM_STREAM_BUSY 1028 -#define ERROR_SYSTEM_IP_INVALID 1029 -#define ERROR_SYSTEM_FORWARD_LOOP 1030 -#define ERROR_SYSTEM_WAITPID 1031 -#define ERROR_SYSTEM_BANDWIDTH_KEY 1032 -#define ERROR_SYSTEM_BANDWIDTH_DENIED 1033 -#define ERROR_SYSTEM_PID_ACQUIRE 1034 -#define ERROR_SYSTEM_PID_ALREADY_RUNNING 1035 -#define ERROR_SYSTEM_PID_LOCK 1036 -#define ERROR_SYSTEM_PID_TRUNCATE_FILE 1037 -#define ERROR_SYSTEM_PID_WRITE_FILE 1038 -#define ERROR_SYSTEM_PID_GET_FILE_INFO 1039 -#define ERROR_SYSTEM_PID_SET_FILE_INFO 1040 -#define ERROR_SYSTEM_FILE_ALREADY_OPENED 1041 -#define ERROR_SYSTEM_FILE_OPENE 1042 -//#define ERROR_SYSTEM_FILE_CLOSE 1043 -#define ERROR_SYSTEM_FILE_READ 1044 -#define ERROR_SYSTEM_FILE_WRITE 1045 -#define ERROR_SYSTEM_FILE_EOF 1046 -#define ERROR_SYSTEM_FILE_RENAME 1047 -#define ERROR_SYSTEM_CREATE_PIPE 1048 -#define ERROR_SYSTEM_FILE_SEEK 1049 -#define ERROR_SYSTEM_IO_INVALID 1050 -#define ERROR_ST_EXCEED_THREADS 1051 -#define ERROR_SYSTEM_SECURITY 1052 -#define ERROR_SYSTEM_SECURITY_DENY 1053 -#define ERROR_SYSTEM_SECURITY_ALLOW 1054 -#define ERROR_SYSTEM_TIME 1055 -#define ERROR_SYSTEM_DIR_EXISTS 1056 -#define ERROR_SYSTEM_CREATE_DIR 1057 -#define ERROR_SYSTEM_KILL 1058 -#define ERROR_SYSTEM_CONFIG_PERSISTENCE 1059 -#define ERROR_SYSTEM_CONFIG_RAW 1060 -#define ERROR_SYSTEM_CONFIG_RAW_DISABLED 1061 -#define ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED 1062 -#define ERROR_SYSTEM_CONFIG_RAW_PARAMS 1063 -#define ERROR_SYSTEM_FILE_NOT_EXISTS 1064 -#define ERROR_SYSTEM_HOURGLASS_RESOLUTION 1065 -#define ERROR_SYSTEM_DNS_RESOLVE 1066 -#define ERROR_SYSTEM_FRAGMENT_UNLINK 1067 -#define ERROR_SYSTEM_FRAGMENT_RENAME 1068 -#define ERROR_THREAD_DISPOSED 1069 -#define ERROR_THREAD_INTERRUPED 1070 -#define ERROR_THREAD_TERMINATED 1071 -#define ERROR_THREAD_DUMMY 1072 -#define ERROR_ASPROCESS_PPID 1073 -#define ERROR_EXCEED_CONNECTIONS 1074 -#define ERROR_SOCKET_SETKEEPALIVE 1075 -#define ERROR_SOCKET_NO_NODELAY 1076 -#define ERROR_SOCKET_SNDBUF 1077 -#define ERROR_THREAD_STARTED 1078 -#define ERROR_SOCKET_SETREUSEADDR 1079 -#define ERROR_SOCKET_SETCLOSEEXEC 1080 -#define ERROR_SOCKET_ACCEPT 1081 -#define ERROR_THREAD_CREATE 1082 -#define ERROR_THREAD_FINISHED 1083 -#define ERROR_PB_NO_SPACE 1084 -#define ERROR_CLS_INVALID_CONFIG 1085 -#define ERROR_CLS_EXCEED_SIZE 1086 - -/////////////////////////////////////////////////////// -// RTMP protocol error. -/////////////////////////////////////////////////////// -#define ERROR_RTMP_PLAIN_REQUIRED 2000 -#define ERROR_RTMP_CHUNK_START 2001 -#define ERROR_RTMP_MSG_INVALID_SIZE 2002 -#define ERROR_RTMP_AMF0_DECODE 2003 -#define ERROR_RTMP_AMF0_INVALID 2004 -#define ERROR_RTMP_REQ_CONNECT 2005 -#define ERROR_RTMP_REQ_TCURL 2006 -#define ERROR_RTMP_MESSAGE_DECODE 2007 -#define ERROR_RTMP_MESSAGE_ENCODE 2008 -#define ERROR_RTMP_AMF0_ENCODE 2009 -#define ERROR_RTMP_CHUNK_SIZE 2010 -#define ERROR_RTMP_TRY_SIMPLE_HS 2011 -#define ERROR_RTMP_CH_SCHEMA 2012 -#define ERROR_RTMP_PACKET_SIZE 2013 -#define ERROR_RTMP_VHOST_NOT_FOUND 2014 -#define ERROR_RTMP_ACCESS_DENIED 2015 -#define ERROR_RTMP_HANDSHAKE 2016 -#define ERROR_RTMP_NO_REQUEST 2017 -#define ERROR_RTMP_HS_SSL_REQUIRE 2018 -#define ERROR_RTMP_DURATION_EXCEED 2019 -#define ERROR_RTMP_EDGE_PLAY_STATE 2020 -#define ERROR_RTMP_EDGE_PUBLISH_STATE 2021 -#define ERROR_RTMP_EDGE_PROXY_PULL 2022 -#define ERROR_RTMP_EDGE_RELOAD 2023 -#define ERROR_RTMP_AGGREGATE 2024 -#define ERROR_RTMP_BWTC_DATA 2025 -#define ERROR_OpenSslCreateDH 2026 -#define ERROR_OpenSslCreateP 2027 -#define ERROR_OpenSslCreateG 2028 -#define ERROR_OpenSslParseP1024 2029 -#define ERROR_OpenSslSetG 2030 -#define ERROR_OpenSslGenerateDHKeys 2031 -#define ERROR_OpenSslCopyKey 2032 -#define ERROR_OpenSslSha256Update 2033 -#define ERROR_OpenSslSha256Init 2034 -#define ERROR_OpenSslSha256Final 2035 -#define ERROR_OpenSslSha256EvpDigest 2036 -#define ERROR_OpenSslSha256DigestSize 2037 -#define ERROR_OpenSslGetPeerPublicKey 2038 -#define ERROR_OpenSslComputeSharedKey 2039 -#define ERROR_RTMP_MIC_CHUNKSIZE_CHANGED 2040 -#define ERROR_RTMP_MIC_CACHE_OVERFLOW 2041 -#define ERROR_RTSP_TOKEN_NOT_NORMAL 2042 -#define ERROR_RTSP_REQUEST_HEADER_EOF 2043 -#define ERROR_RTP_HEADER_CORRUPT 2044 -#define ERROR_RTP_TYPE96_CORRUPT 2045 -#define ERROR_RTP_TYPE97_CORRUPT 2046 -#define ERROR_RTSP_AUDIO_CONFIG 2047 -#define ERROR_RTMP_STREAM_NOT_FOUND 2048 -#define ERROR_RTMP_CLIENT_NOT_FOUND 2049 -#define ERROR_OpenSslCreateHMAC 2050 -#define ERROR_RTMP_STREAM_NAME_EMPTY 2051 -#define ERROR_HTTP_HIJACK 2052 -#define ERROR_RTMP_MESSAGE_CREATE 2053 -#define ERROR_RTMP_PROXY_EXCEED 2054 -#define ERROR_RTMP_CREATE_STREAM_DEPTH 2055 -// -// The system control message, -// It's not an error, but special control logic. -// -// When connection is redirect to another server. -#define ERROR_CONTROL_REDIRECT 2997 -// For sys ctl: rtmp close stream, support replay. -#define ERROR_CONTROL_RTMP_CLOSE 2998 -// When FMLE stop publish and republish. -#define ERROR_CONTROL_REPUBLISH 2999 - -/////////////////////////////////////////////////////// -// The application level errors. -/////////////////////////////////////////////////////// -#define ERROR_HLS_METADATA 3000 -#define ERROR_HLS_DECODE_ERROR 3001 -//#define ERROR_HLS_CREATE_DIR 3002 -#define ERROR_HLS_OPEN_FAILED 3003 -#define ERROR_HLS_WRITE_FAILED 3004 -#define ERROR_HLS_AAC_FRAME_LENGTH 3005 -#define ERROR_HLS_AVC_SAMPLE_SIZE 3006 -#define ERROR_HTTP_PARSE_URI 3007 -#define ERROR_HTTP_DATA_INVALID 3008 -#define ERROR_HTTP_PARSE_HEADER 3009 -#define ERROR_HTTP_HANDLER_MATCH_URL 3010 -#define ERROR_HTTP_HANDLER_INVALID 3011 -#define ERROR_HTTP_API_LOGS 3012 -#define ERROR_HTTP_REMUX_SEQUENCE_HEADER 3013 -#define ERROR_HTTP_REMUX_OFFSET_OVERFLOW 3014 -#define ERROR_ENCODER_VCODEC 3015 -#define ERROR_ENCODER_OUTPUT 3016 -#define ERROR_ENCODER_ACHANNELS 3017 -#define ERROR_ENCODER_ASAMPLE_RATE 3018 -#define ERROR_ENCODER_ABITRATE 3019 -#define ERROR_ENCODER_ACODEC 3020 -#define ERROR_ENCODER_VPRESET 3021 -#define ERROR_ENCODER_VPROFILE 3022 -#define ERROR_ENCODER_VTHREADS 3023 -#define ERROR_ENCODER_VHEIGHT 3024 -#define ERROR_ENCODER_VWIDTH 3025 -#define ERROR_ENCODER_VFPS 3026 -#define ERROR_ENCODER_VBITRATE 3027 -#define ERROR_ENCODER_FORK 3028 -#define ERROR_ENCODER_LOOP 3029 -#define ERROR_FORK_OPEN_LOG 3030 -#define ERROR_FORK_DUP2_LOG 3031 -#define ERROR_ENCODER_PARSE 3032 -#define ERROR_ENCODER_NO_INPUT 3033 -#define ERROR_ENCODER_NO_OUTPUT 3034 -#define ERROR_ENCODER_INPUT_TYPE 3035 -#define ERROR_KERNEL_FLV_HEADER 3036 -#define ERROR_KERNEL_FLV_STREAM_CLOSED 3037 -#define ERROR_KERNEL_STREAM_INIT 3038 -#define ERROR_EDGE_VHOST_REMOVED 3039 -#define ERROR_HLS_AVC_TRY_OTHERS 3040 -#define ERROR_H264_API_NO_PREFIXED 3041 -#define ERROR_FLV_INVALID_VIDEO_TAG 3042 -#define ERROR_H264_DROP_BEFORE_SPS_PPS 3043 -#define ERROR_H264_DUPLICATED_SPS 3044 -#define ERROR_H264_DUPLICATED_PPS 3045 -#define ERROR_AAC_REQUIRED_ADTS 3046 -#define ERROR_AAC_ADTS_HEADER 3047 -#define ERROR_AAC_DATA_INVALID 3048 -#define ERROR_HLS_TRY_MP3 3049 -#define ERROR_HTTP_DVR_DISABLED 3050 -#define ERROR_HTTP_DVR_REQUEST 3051 -#define ERROR_HTTP_JSON_REQUIRED 3052 -#define ERROR_HTTP_DVR_CREATE_REQUEST 3053 -#define ERROR_HTTP_DVR_NO_TAEGET 3054 -#define ERROR_ADTS_ID_NOT_AAC 3055 -#define ERROR_HDS_OPEN_F4M_FAILED 3056 -#define ERROR_HDS_WRITE_F4M_FAILED 3057 -#define ERROR_HDS_OPEN_BOOTSTRAP_FAILED 3058 -#define ERROR_HDS_WRITE_BOOTSTRAP_FAILED 3059 -#define ERROR_HDS_OPEN_FRAGMENT_FAILED 3060 -#define ERROR_HDS_WRITE_FRAGMENT_FAILED 3061 -#define ERROR_HLS_NO_STREAM 3062 -#define ERROR_JSON_LOADS 3063 -#define ERROR_RESPONSE_CODE 3064 -#define ERROR_RESPONSE_DATA 3065 -#define ERROR_REQUEST_DATA 3066 -#define ERROR_EDGE_PORT_INVALID 3067 -#define ERROR_EXPECT_FILE_IO 3068 -#define ERROR_MP4_BOX_OVERFLOW 3069 -#define ERROR_MP4_BOX_REQUIRE_SPACE 3070 -#define ERROR_MP4_BOX_ILLEGAL_TYPE 3071 -#define ERROR_MP4_BOX_ILLEGAL_SCHEMA 3072 -#define ERROR_MP4_BOX_STRING 3073 -#define ERROR_MP4_BOX_ILLEGAL_BRAND 3074 -#define ERROR_MP4_ESDS_SL_Config 3075 -#define ERROR_MP4_ILLEGAL_MOOV 3076 -#define ERROR_MP4_ILLEGAL_HANDLER 3077 -#define ERROR_MP4_ILLEGAL_TRACK 3078 -#define ERROR_MP4_MOOV_OVERFLOW 3079 -#define ERROR_MP4_ILLEGAL_SAMPLES 3080 -#define ERROR_MP4_ILLEGAL_TIMESTAMP 3081 -#define ERROR_DVR_CANNOT_APPEND 3082 -#define ERROR_DVR_ILLEGAL_PLAN 3083 -#define ERROR_FLV_REQUIRE_SPACE 3084 -#define ERROR_MP4_AVCC_CHANGE 3085 -#define ERROR_MP4_ASC_CHANGE 3086 -#define ERROR_DASH_WRITE_FAILED 3087 -#define ERROR_TS_CONTEXT_NOT_READY 3088 -#define ERROR_MP4_ILLEGAL_MOOF 3089 -#define ERROR_MP4_ILLEGAL_MDAT 3090 -#define ERROR_OCLUSTER_DISCOVER 3091 -#define ERROR_OCLUSTER_REDIRECT 3092 -#define ERROR_INOTIFY_CREATE 3093 -#define ERROR_INOTIFY_OPENFD 3094 -#define ERROR_INOTIFY_WATCH 3095 -#define ERROR_HTTP_URL_UNESCAPE 3096 -#define ERROR_HTTP_WITH_BODY 3097 - -/////////////////////////////////////////////////////// -// HTTP/StreamCaster protocol error. -/////////////////////////////////////////////////////// -#define ERROR_HTTP_PATTERN_EMPTY 4000 -#define ERROR_HTTP_PATTERN_DUPLICATED 4001 -#define ERROR_HTTP_URL_NOT_CLEAN 4002 -#define ERROR_HTTP_CONTENT_LENGTH 4003 -#define ERROR_HTTP_LIVE_STREAM_EXT 4004 -#define ERROR_HTTP_STATUS_INVALID 4005 -#define ERROR_KERNEL_AAC_STREAM_CLOSED 4006 -#define ERROR_AAC_DECODE_ERROR 4007 -#define ERROR_KERNEL_MP3_STREAM_CLOSED 4008 -#define ERROR_MP3_DECODE_ERROR 4009 -#define ERROR_STREAM_CASTER_ENGINE 4010 -#define ERROR_STREAM_CASTER_PORT 4011 -#define ERROR_STREAM_CASTER_TS_HEADER 4012 -#define ERROR_STREAM_CASTER_TS_SYNC_BYTE 4013 -#define ERROR_STREAM_CASTER_TS_AF 4014 -#define ERROR_STREAM_CASTER_TS_CRC32 4015 -#define ERROR_STREAM_CASTER_TS_PSI 4016 -#define ERROR_STREAM_CASTER_TS_PAT 4017 -#define ERROR_STREAM_CASTER_TS_PMT 4018 -#define ERROR_STREAM_CASTER_TS_PSE 4019 -#define ERROR_STREAM_CASTER_TS_ES 4020 -#define ERROR_STREAM_CASTER_TS_CODEC 4021 -#define ERROR_STREAM_CASTER_AVC_SPS 4022 -#define ERROR_STREAM_CASTER_AVC_PPS 4023 -#define ERROR_STREAM_CASTER_FLV_TAG 4024 -#define ERROR_HTTP_RESPONSE_EOF 4025 -#define ERROR_HTTP_INVALID_CHUNK_HEADER 4026 -#define ERROR_AVC_NALU_UEV 4027 -#define ERROR_AAC_BYTES_INVALID 4028 -#define ERROR_HTTP_REQUEST_EOF 4029 -#define ERROR_HTTP_302_INVALID 4038 -#define ERROR_BASE64_DECODE 4039 -#define ERROR_HTTP_STREAM_EOF 4040 -#define ERROR_HTTPS_NOT_SUPPORTED 4041 -#define ERROR_HTTPS_HANDSHAKE 4042 -#define ERROR_HTTPS_READ 4043 -#define ERROR_HTTPS_WRITE 4044 -#define ERROR_HTTPS_KEY_CRT 4045 - -/////////////////////////////////////////////////////// -// RTC protocol error. -/////////////////////////////////////////////////////// -#define ERROR_RTC_PORT 5000 -#define ERROR_RTP_PACKET_CREATE 5001 -#define ERROR_OpenSslCreateSSL 5002 -#define ERROR_OpenSslBIOReset 5003 -#define ERROR_OpenSslBIOWrite 5004 -#define ERROR_OpenSslBIONew 5005 -#define ERROR_RTC_RTP 5006 -#define ERROR_RTC_RTCP 5007 -#define ERROR_RTC_STUN 5008 -#define ERROR_RTC_DTLS 5009 -#define ERROR_RTC_UDP 5010 -#define ERROR_RTC_RTP_MUXER 5011 -#define ERROR_RTC_SDP_DECODE 5012 -#define ERROR_RTC_SRTP_INIT 5013 -#define ERROR_RTC_SRTP_PROTECT 5014 -#define ERROR_RTC_SRTP_UNPROTECT 5015 -#define ERROR_RTC_RTCP_CHECK 5016 -#define ERROR_RTC_SOURCE_CHECK 5017 -#define ERROR_RTC_SDP_EXCHANGE 5018 -#define ERROR_RTC_API_BODY 5019 -#define ERROR_RTC_SOURCE_BUSY 5020 -#define ERROR_RTC_DISABLED 5021 -#define ERROR_RTC_NO_SESSION 5022 -#define ERROR_RTC_INVALID_PARAMS 5023 -#define ERROR_RTC_DUMMY_BRIDGER 5024 -#define ERROR_RTC_STREM_STARTED 5025 -#define ERROR_RTC_TRACK_CODEC 5026 -#define ERROR_RTC_NO_PLAYER 5027 -#define ERROR_RTC_NO_PUBLISHER 5028 -#define ERROR_RTC_DUPLICATED_SSRC 5029 -#define ERROR_RTC_NO_TRACK 5030 -#define ERROR_RTC_RTCP_EMPTY_RR 5031 -#define ERROR_RTC_TCP_SIZE 5032 -#define ERROR_RTC_TCP_PACKET 5033 -#define ERROR_RTC_TCP_STUN 5034 -#define ERROR_RTC_TCP_UNIQUE 5035 - -/////////////////////////////////////////////////////// -// SRT protocol error. -/////////////////////////////////////////////////////// -#define ERROR_SRT_EPOLL 6000 -#define ERROR_SRT_IO 6001 -#define ERROR_SRT_TIMEOUT 6002 -#define ERROR_SRT_INTERRUPT 6003 -#define ERROR_SRT_LISTEN 6004 -#define ERROR_SRT_SOCKOPT 6005 -#define ERROR_SRT_CONN 6006 -#define ERROR_SRT_SOURCE_BUSY 6007 -#define ERROR_RTMP_TO_SRT 6008 -#define ERROR_SRT_STATS 6009 - -/////////////////////////////////////////////////////// -// HTTP API error. -/////////////////////////////////////////////////////// -//#define ERROR_API_METHOD_NOT_ALLOWD - -/////////////////////////////////////////////////////// -// For user-define error. -/////////////////////////////////////////////////////// -#define ERROR_USER_START 9000 -//#define ERROR_USER_DISCONNECT 9001 -#define ERROR_SOURCE_NOT_FOUND 9002 -#define ERROR_USER_END 9999 + SRS_ERRNO_MAP_SYSTEM(SRS_ERRNO_GEN) + SRS_ERRNO_MAP_RTMP(SRS_ERRNO_GEN) + SRS_ERRNO_MAP_APP(SRS_ERRNO_GEN) + SRS_ERRNO_MAP_HTTP(SRS_ERRNO_GEN) + SRS_ERRNO_MAP_RTC(SRS_ERRNO_GEN) + SRS_ERRNO_MAP_SRT(SRS_ERRNO_GEN) + SRS_ERRNO_MAP_USER(SRS_ERRNO_GEN) +}; +#undef SRS_ERRNO_GEN // Whether the error code is an system control error. // TODO: FIXME: Remove it from underlayer for confused with error and logger. @@ -426,6 +426,8 @@ public: static std::string description(SrsCplxError* err); static std::string summary(SrsCplxError* err); static int error_code(SrsCplxError* err); + static std::string error_code_str(SrsCplxError* err); + static std::string error_code_longstr(SrsCplxError* err); }; // Error helpers, should use these functions to new or wrap an error. @@ -436,6 +438,8 @@ public: #define srs_error_desc(err) SrsCplxError::description(err) #define srs_error_summary(err) SrsCplxError::summary(err) #define srs_error_code(err) SrsCplxError::error_code(err) +#define srs_error_code_str(err) SrsCplxError::error_code_str(err) +#define srs_error_code_longstr(err) SrsCplxError::error_code_longstr(err) #define srs_error_reset(err) srs_freep(err); err = srs_success #endif diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 69a75b606..639faee02 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -275,10 +276,7 @@ bool srs_check_ip_addr_valid(string ip) string srs_int2str(int64_t value) { - // len(max int64_t) is 20, plus one "+-." - char tmp[21 + 1]; - snprintf(tmp, sizeof(tmp), "%" PRId64, value); - return tmp; + return srs_fmt("%" PRId64, value); } string srs_float2str(double value) @@ -554,6 +552,23 @@ vector srs_string_split(string str, vector seperators) return arr; } +std::string srs_fmt(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + static char buf[8192]; + int r0 = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + + string v; + if (r0 > 0 && r0 < (int)sizeof(buf)) { + v.append(buf, r0); + } + + return v; +} + int srs_do_create_dir_recursively(string dir) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index bd25300da..32ca38ecb 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -91,6 +91,8 @@ extern std::string srs_string_min_match(std::string str, std::vector srs_string_split(std::string s, std::string seperator); extern std::vector srs_string_split(std::string s, std::vector seperators); +// Format to a string. +extern std::string srs_fmt(const char* fmt, ...); // Compare the memory in bytes. // @return true if completely equal; otherwise, false. diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 450cfe2ad..106323ada 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -38,6 +38,7 @@ using namespace std; #include #include #include + #ifdef SRS_RTC #include #include @@ -473,6 +474,7 @@ srs_error_t run_in_thread_pool() return _srs_thread_pool->run(); } +#include srs_error_t run_hybrid_server(void* /*arg*/) { srs_error_t err = srs_success; @@ -498,6 +500,10 @@ srs_error_t run_hybrid_server(void* /*arg*/) return srs_error_wrap(err, "init circuit breaker"); } + // When startup, create a span for server information. + ISrsApmSpan* span = _srs_apm->span("main")->set_kind(SrsApmKindServer); + srs_freep(span); + // Should run util hybrid servers all done. if ((err = _srs_hybrid->run()) != srs_success) { return srs_error_wrap(err, "hybrid run"); diff --git a/trunk/src/protocol/srs_protocol_protobuf.cpp b/trunk/src/protocol/srs_protocol_protobuf.cpp index ae5812372..897c96d1f 100644 --- a/trunk/src/protocol/srs_protocol_protobuf.cpp +++ b/trunk/src/protocol/srs_protocol_protobuf.cpp @@ -136,6 +136,26 @@ srs_error_t SrsProtobufVarints::encode(SrsBuffer* b, uint64_t v) return err; } +int SrsProtobufFixed64::sizeof_int(uint64_t v) +{ + return 8; +} + +srs_error_t SrsProtobufFixed64::encode(SrsBuffer* b, uint64_t v) +{ + srs_error_t err = srs_success; + + if (!b->require(8)) { + return srs_error_new(ERROR_PB_NO_SPACE, "require 8 only %d byte", b->left()); + } + + // Encode values in little-endian byte order, + // see https://developers.google.com/protocol-buffers/docs/encoding#non-varint_numbers + b->write_le8bytes((int64_t)v); + + return err; +} + // See Go protowire.SizeBytes of package google.golang.org/protobuf/encoding/protowire int SrsProtobufString::sizeof_string(const std::string& v) { diff --git a/trunk/src/protocol/srs_protocol_protobuf.hpp b/trunk/src/protocol/srs_protocol_protobuf.hpp index b5f881c6b..fa19510e7 100644 --- a/trunk/src/protocol/srs_protocol_protobuf.hpp +++ b/trunk/src/protocol/srs_protocol_protobuf.hpp @@ -24,6 +24,14 @@ public: static srs_error_t encode(SrsBuffer* b, uint64_t v); }; +// See https://developers.google.com/protocol-buffers/docs/encoding#structure +class SrsProtobufFixed64 +{ +public: + static int sizeof_int(uint64_t v); + static srs_error_t encode(SrsBuffer* b, uint64_t v); +}; + // See https://developers.google.com/protocol-buffers/docs/encoding#strings class SrsProtobufString { @@ -44,6 +52,7 @@ public: enum SrsProtobufField { // For int32, int64, uint32, uint64, sint32, sint64, bool, enum + SrsProtobufFieldEnum = 0, SrsProtobufFieldVarint = 0, // For fixed64, sfixed64, double SrsProtobufField64bit = 1, diff --git a/trunk/src/protocol/srs_protocol_rtmp_conn.cpp b/trunk/src/protocol/srs_protocol_rtmp_conn.cpp index cf9c87aec..ee07b5fe6 100644 --- a/trunk/src/protocol/srs_protocol_rtmp_conn.cpp +++ b/trunk/src/protocol/srs_protocol_rtmp_conn.cpp @@ -41,6 +41,14 @@ SrsBasicRtmpClient::~SrsBasicRtmpClient() srs_freep(req); } +SrsAmf0Object* SrsBasicRtmpClient::extra_args() +{ + if (req->args == NULL) { + req->args = SrsAmf0Any::object(); + } + return req->args; +} + srs_error_t SrsBasicRtmpClient::connect() { srs_error_t err = srs_success; @@ -89,13 +97,8 @@ srs_error_t SrsBasicRtmpClient::do_connect_app(string local_ip, bool debug) { srs_error_t err = srs_success; - // args of request takes the srs info. - if (req->args == NULL) { - req->args = SrsAmf0Any::object(); - } - // notify server the edge identity, - SrsAmf0Object* data = req->args; + SrsAmf0Object* data = extra_args(); data->set("srs_sig", SrsAmf0Any::str(RTMP_SIG_SRS_KEY)); data->set("srs_server", SrsAmf0Any::str(RTMP_SIG_SRS_SERVER)); data->set("srs_license", SrsAmf0Any::str(RTMP_SIG_SRS_LICENSE)); diff --git a/trunk/src/protocol/srs_protocol_rtmp_conn.hpp b/trunk/src/protocol/srs_protocol_rtmp_conn.hpp index a2a1cd386..42169f560 100644 --- a/trunk/src/protocol/srs_protocol_rtmp_conn.hpp +++ b/trunk/src/protocol/srs_protocol_rtmp_conn.hpp @@ -19,6 +19,7 @@ class SrsSharedPtrMessage; class SrsPacket; class SrsNetworkKbps; class SrsWallClock; +class SrsAmf0Object; // The simple RTMP client, provides friendly APIs. // @remark Should never use client when closed. @@ -47,6 +48,9 @@ public: // @param stm The timeout in srs_utime_t to delivery A/V stream. SrsBasicRtmpClient(std::string r, srs_utime_t ctm, srs_utime_t stm); virtual ~SrsBasicRtmpClient(); +public: + // Get extra args to carry more information. + SrsAmf0Object* extra_args(); public: // Connect, handshake and connect app to RTMP server. // @remark We always close the transport. diff --git a/trunk/src/protocol/srs_protocol_rtmp_stack.cpp b/trunk/src/protocol/srs_protocol_rtmp_stack.cpp index 8a7587e52..4f45d9efd 100644 --- a/trunk/src/protocol/srs_protocol_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_protocol_rtmp_stack.cpp @@ -1897,7 +1897,7 @@ srs_error_t SrsRtmpClient::connect_app(string app, string tcUrl, SrsRequest* r, // @see https://github.com/ossrs/srs/issues/160 // the debug_srs_upnode is config in vhost and default to true. - if (dsu && r && r->args) { + if (dsu && r && r->args && r->args->count() > 0) { srs_freep(pkt->args); pkt->args = r->args->copy()->to_object(); } diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index f373052f9..60ef6bd0c 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -674,10 +674,12 @@ VOID TEST(KernelCodecTest, IsAudioSequenceHeader) */ VOID TEST(KernelFlvTest, FlvEncoderStreamClosed) { + srs_error_t err = srs_success; + MockSrsFileWriter fs; SrsFlvTransmuxer enc; // The decoder never check the reader status. - ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); + HELPER_ASSERT_SUCCESS(enc.initialize(&fs)); } /** @@ -686,10 +688,12 @@ VOID TEST(KernelFlvTest, FlvEncoderStreamClosed) */ VOID TEST(KernelFlvTest, FlvEncoderWriteHeader) { + srs_error_t err = srs_success; + MockSrsFileWriter fs; SrsFlvTransmuxer enc; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(enc.initialize(&fs)); // write header, 9bytes char flv_header[] = { @@ -700,7 +704,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteHeader) }; char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)0x00 }; - EXPECT_TRUE(ERROR_SUCCESS == enc.write_header()); + HELPER_EXPECT_SUCCESS(enc.write_header()); ASSERT_TRUE(9 + 4 == fs.tellg()); EXPECT_TRUE(srs_bytes_equals(flv_header, fs.data(), 9)); @@ -713,7 +717,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteHeader) fs.mock_reset_offset(); - EXPECT_TRUE(ERROR_SUCCESS == enc.write_header(flv_header)); + HELPER_EXPECT_SUCCESS(enc.write_header(flv_header)); ASSERT_TRUE(9 + 4 == fs.tellg()); EXPECT_TRUE(srs_bytes_equals(flv_header, fs.data(), 9)); @@ -726,10 +730,12 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteHeader) */ VOID TEST(KernelFlvTest, FlvEncoderWriteMetadata) { + srs_error_t err = srs_success; + MockSrsFileWriter fs; - EXPECT_TRUE(ERROR_SUCCESS == fs.open("")); + HELPER_EXPECT_SUCCESS(fs.open("")); SrsFlvTransmuxer enc; - ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); + HELPER_ASSERT_SUCCESS(enc.initialize(&fs)); // 11 bytes tag header char tag_header[] = { @@ -745,7 +751,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteMetadata) }; char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 }; - ASSERT_TRUE(ERROR_SUCCESS == enc.write_metadata(18, md, 8)); + HELPER_ASSERT_SUCCESS(enc.write_metadata(18, md, 8)); ASSERT_TRUE(11 + 8 + 4 == fs.tellg()); EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data(), 11)); @@ -760,10 +766,12 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteMetadata) */ VOID TEST(KernelFlvTest, FlvEncoderWriteAudio) { + srs_error_t err = srs_success; + MockSrsFileWriter fs; SrsFlvTransmuxer enc; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(enc.initialize(&fs)); // 11bytes tag header char tag_header[] = { @@ -779,7 +787,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteAudio) }; char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 }; - ASSERT_TRUE(ERROR_SUCCESS == enc.write_audio(0x30, audio, 8)); + HELPER_ASSERT_SUCCESS(enc.write_audio(0x30, audio, 8)); ASSERT_TRUE(11 + 8 + 4 == fs.tellg()); EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data(), 11)); @@ -794,10 +802,12 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteAudio) */ VOID TEST(KernelFlvTest, FlvEncoderWriteVideo) { + srs_error_t err = srs_success; + MockSrsFileWriter fs; SrsFlvTransmuxer enc; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(enc.initialize(&fs)); // 11bytes tag header char tag_header[] = { @@ -813,7 +823,7 @@ VOID TEST(KernelFlvTest, FlvEncoderWriteVideo) }; char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 }; - ASSERT_TRUE(ERROR_SUCCESS == enc.write_video(0x30, video, 8)); + HELPER_ASSERT_SUCCESS(enc.write_video(0x30, video, 8)); ASSERT_TRUE(11 + 8 + 4 == fs.tellg()); EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data(), 11)); @@ -1183,10 +1193,12 @@ VOID TEST(KernelFLVTest, CoverFLVVodSHCase) */ VOID TEST(KernelFlvTest, FlvDecoderStreamClosed) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvDecoder dec; // The decoder never check the reader status. - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); } /** @@ -1195,10 +1207,12 @@ VOID TEST(KernelFlvTest, FlvDecoderStreamClosed) */ VOID TEST(KernelFlvTest, FlvDecoderHeader) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // 9bytes char flv_header[] = { @@ -1214,10 +1228,10 @@ VOID TEST(KernelFlvTest, FlvDecoderHeader) char data[1024]; fs.mock_reset_offset(); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_header(data)); + HELPER_EXPECT_SUCCESS(dec.read_header(data)); EXPECT_TRUE(srs_bytes_equals(flv_header, data, 9)); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_previous_tag_size(data)); + HELPER_EXPECT_SUCCESS(dec.read_previous_tag_size(data)); EXPECT_TRUE(srs_bytes_equals(pts, data, 4)); } @@ -1227,10 +1241,12 @@ VOID TEST(KernelFlvTest, FlvDecoderHeader) */ VOID TEST(KernelFlvTest, FlvDecoderMetadata) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // 11 bytes tag header char tag_header[] = { @@ -1255,15 +1271,15 @@ VOID TEST(KernelFlvTest, FlvDecoderMetadata) char data[1024]; fs.mock_reset_offset(); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_tag_header(&type, &size, &time)); + HELPER_EXPECT_SUCCESS(dec.read_tag_header(&type, &size, &time)); EXPECT_TRUE(18 == type); EXPECT_TRUE(8 == size); EXPECT_TRUE(0 == time); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_tag_data(data, size)); + HELPER_EXPECT_SUCCESS(dec.read_tag_data(data, size)); EXPECT_TRUE(srs_bytes_equals(md, data, 8)); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_previous_tag_size(data)); + HELPER_EXPECT_SUCCESS(dec.read_previous_tag_size(data)); EXPECT_TRUE(srs_bytes_equals(pts, data, 4)); } @@ -1273,10 +1289,12 @@ VOID TEST(KernelFlvTest, FlvDecoderMetadata) */ VOID TEST(KernelFlvTest, FlvDecoderAudio) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // 11bytes tag header char tag_header[] = { @@ -1301,15 +1319,15 @@ VOID TEST(KernelFlvTest, FlvDecoderAudio) char data[1024]; fs.mock_reset_offset(); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_tag_header(&type, &size, &time)); + HELPER_EXPECT_SUCCESS(dec.read_tag_header(&type, &size, &time)); EXPECT_TRUE(8 == type); EXPECT_TRUE(8 == size); EXPECT_TRUE(0x30 == time); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_tag_data(data, size)); + HELPER_EXPECT_SUCCESS(dec.read_tag_data(data, size)); EXPECT_TRUE(srs_bytes_equals(audio, data, 8)); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_previous_tag_size(data)); + HELPER_EXPECT_SUCCESS(dec.read_previous_tag_size(data)); EXPECT_TRUE(srs_bytes_equals(pts, data, 4)); } @@ -1319,10 +1337,12 @@ VOID TEST(KernelFlvTest, FlvDecoderAudio) */ VOID TEST(KernelFlvTest, FlvDecoderVideo) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // 11bytes tag header char tag_header[] = { @@ -1347,15 +1367,15 @@ VOID TEST(KernelFlvTest, FlvDecoderVideo) char data[1024]; fs.mock_reset_offset(); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_tag_header(&type, &size, &time)); + HELPER_EXPECT_SUCCESS(dec.read_tag_header(&type, &size, &time)); EXPECT_TRUE(9 == type); EXPECT_TRUE(8 == size); EXPECT_TRUE(0x30 == time); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_tag_data(data, size)); + HELPER_EXPECT_SUCCESS(dec.read_tag_data(data, size)); EXPECT_TRUE(srs_bytes_equals(video, data, 8)); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_previous_tag_size(data)); + HELPER_EXPECT_SUCCESS(dec.read_previous_tag_size(data)); EXPECT_TRUE(srs_bytes_equals(pts, data, 4)); } @@ -1365,6 +1385,8 @@ VOID TEST(KernelFlvTest, FlvDecoderVideo) */ VOID TEST(KernelFlvTest, FlvVSDecoderStreamClosed) { + srs_error_t err = srs_success; + MockSrsFileReader fs; fs.close(); @@ -1378,11 +1400,13 @@ VOID TEST(KernelFlvTest, FlvVSDecoderStreamClosed) */ VOID TEST(KernelFlvTest, FlvVSDecoderHeader) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvVodStreamDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // 9bytes char flv_header[] = { @@ -1398,7 +1422,7 @@ VOID TEST(KernelFlvTest, FlvVSDecoderHeader) char data[1024]; fs.mock_reset_offset(); - EXPECT_TRUE(ERROR_SUCCESS == dec.read_header_ext(data)); + HELPER_EXPECT_SUCCESS(dec.read_header_ext(data)); EXPECT_TRUE(srs_bytes_equals(flv_header, data, 9)); } @@ -1409,10 +1433,12 @@ VOID TEST(KernelFlvTest, FlvVSDecoderHeader) */ VOID TEST(KernelFlvTest, FlvVSDecoderSequenceHeader) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvVodStreamDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // push metadata tag if (true) { @@ -1476,7 +1502,7 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSequenceHeader) int64_t start = 0; int size = 0; - EXPECT_TRUE(ERROR_SUCCESS == dec.read_sequence_header_summary(&start, &size)); + HELPER_EXPECT_SUCCESS(dec.read_sequence_header_summary(&start, &size)); EXPECT_EQ(23, (int)start); EXPECT_EQ(46, size); } @@ -1488,10 +1514,12 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSequenceHeader) */ VOID TEST(KernelFlvTest, FlvVSDecoderSequenceHeader2) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvVodStreamDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // push metadata tag if (true) { @@ -1555,7 +1583,7 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSequenceHeader2) int64_t start = 0; int size = 0; - EXPECT_TRUE(ERROR_SUCCESS == dec.read_sequence_header_summary(&start, &size)); + HELPER_EXPECT_SUCCESS(dec.read_sequence_header_summary(&start, &size)); EXPECT_EQ(23, (int)start); EXPECT_EQ(46, size); } @@ -1567,10 +1595,12 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSequenceHeader2) */ VOID TEST(KernelFlvTest, FlvVSDecoderSeek) { + srs_error_t err = srs_success; + MockSrsFileReader fs; SrsFlvVodStreamDecoder dec; - ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); - ASSERT_TRUE(ERROR_SUCCESS == dec.initialize(&fs)); + HELPER_ASSERT_SUCCESS(fs.open("")); + HELPER_ASSERT_SUCCESS(dec.initialize(&fs)); // 11bytes tag header char tag_header[] = { @@ -1583,10 +1613,10 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSeek) fs.mock_append_data(tag_header, 11); EXPECT_TRUE(11 == fs.tellg()); - EXPECT_TRUE(ERROR_SUCCESS == dec.seek2(0)); + HELPER_EXPECT_SUCCESS(dec.seek2(0)); EXPECT_TRUE(0 == fs.tellg()); - EXPECT_TRUE(ERROR_SUCCESS == dec.seek2(5)); + HELPER_EXPECT_SUCCESS(dec.seek2(5)); EXPECT_TRUE(5 == fs.tellg()); } diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index c63424e1b..2c4c4a2c0 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -309,6 +309,8 @@ MockWallClock* MockWallClock::set_clock(srs_utime_t v) // verify the sha256 VOID TEST(ProtocolHandshakeTest, OpensslSha256) { + srs_error_t err = srs_success; + // randome bytes to ensure the openssl sha256 is ok. uint8_t random_bytes[] = { 0x8b, 0x1c, 0x5c, 0x5c, 0x3b, 0x98, 0x60, 0x80, 0x3c, 0x97, 0x43, 0x79, 0x9c, 0x94, 0xec, 0x63, 0xaa, 0xd9, 0x10, 0xd7, 0x0d, 0x91, 0xfb, 0x1f, 0xbf, 0xe0, 0x29, 0xde, 0x77, 0x09, 0x21, 0x34, 0xa5, 0x7d, 0xdf, 0xe3, 0xdf, 0x11, 0xdf, 0xd4, 0x00, 0x57, 0x38, 0x5b, 0xae, 0x9e, 0x89, 0x35, 0xcf, 0x07, 0x48, 0xca, 0xc8, 0x25, 0x46, 0x3c, @@ -319,7 +321,7 @@ VOID TEST(ProtocolHandshakeTest, OpensslSha256) }; char digest[SRS_OpensslHashSize]; - ASSERT_EQ(ERROR_SUCCESS, + HELPER_ASSERT_SUCCESS( openssl_HMACsha256( SrsGenuineFPKey, 30, (char*)random_bytes, sizeof(random_bytes), @@ -337,17 +339,19 @@ VOID TEST(ProtocolHandshakeTest, OpensslSha256) // verify the dh key VOID TEST(ProtocolHandshakeTest, DHKey) { + srs_error_t err = srs_success; + srs_internal::SrsDH dh; - ASSERT_TRUE(ERROR_SUCCESS == dh.initialize(true)); + HELPER_ASSERT_SUCCESS(dh.initialize(true)); char pub_key1[128]; int pkey_size = 128; - EXPECT_TRUE(ERROR_SUCCESS == dh.copy_public_key(pub_key1, pkey_size)); + HELPER_EXPECT_SUCCESS(dh.copy_public_key(pub_key1, pkey_size)); ASSERT_EQ(128, pkey_size); char pub_key2[128]; - EXPECT_TRUE(ERROR_SUCCESS == dh.copy_public_key(pub_key2, pkey_size)); + HELPER_EXPECT_SUCCESS(dh.copy_public_key(pub_key2, pkey_size)); ASSERT_EQ(128, pkey_size); EXPECT_TRUE(srs_bytes_equals(pub_key1, pub_key2, 128)); @@ -355,9 +359,9 @@ VOID TEST(ProtocolHandshakeTest, DHKey) // another dh srs_internal::SrsDH dh0; - ASSERT_TRUE(ERROR_SUCCESS == dh0.initialize(true)); + HELPER_ASSERT_SUCCESS(dh0.initialize(true)); - EXPECT_TRUE(ERROR_SUCCESS == dh0.copy_public_key(pub_key2, pkey_size)); + HELPER_EXPECT_SUCCESS(dh0.copy_public_key(pub_key2, pkey_size)); ASSERT_EQ(128, pkey_size); EXPECT_FALSE(srs_bytes_equals(pub_key1, pub_key2, 128)); @@ -366,6 +370,8 @@ VOID TEST(ProtocolHandshakeTest, DHKey) // flash will sendout a c0c1 encrypt by ssl. VOID TEST(ProtocolHandshakeTest, VerifyFPC0C1) { + srs_error_t err = srs_success; + uint8_t c0c1[] = { 0x03, 0x00, 0x0f, 0x64, 0xd0, 0x80, 0x00, 0x07, 0x02, 0xe6, 0x42, 0xe5, 0x2b, 0xf1, 0x1d, 0x0f, 0x6c, 0xc8, 0x50, 0xf2, 0x06, 0xae, 0xd5, 0x4f, 0xdb, 0xfe, 0x79, 0xc2, 0xef, 0xf5, 0x01, 0x74, 0x4b, 0x5b, 0xe7, 0x37, 0xa3, 0xe0, 0xca, 0xe1, 0x97, 0x07, 0xdb, 0x54, 0x1d, 0x4c, 0x4b, 0xa3, 0xc3, 0x3e, 0xa9, 0xeb, 0xa9, 0x5b, 0x2f, 0x38, 0xa0, 0xa9, 0x98, 0x38, 0x80, 0x1b, 0xfb, 0xa7, 0x04, 0xff, 0xfd, 0x45, 0xfe, 0xfa, 0xc1, 0xe4, 0x1c, 0x77, 0x9a, 0x19, 0x39, 0x34, 0x10, 0x79, 0x12, 0xcf, 0x4e, 0xea, 0x34, 0x7d, 0x88, 0x47, 0xca, 0xf2, 0xb3, 0x09, 0x50, 0xbb, 0xe1, 0x20, 0x9b, 0x25, 0xb0, 0x3c, 0xbc, 0x46, 0x7a, 0x36, 0xb8, 0xc2, 0x4d, 0xd0, 0xf1, 0x20, 0x2a, 0xcc, 0x7a, 0x91, 0xab, 0x0b, 0xb6, 0xc7, 0x09, 0x0d, 0xf1, 0x34, 0x0c, 0x37, 0xbe, 0xad, 0x0e, 0xe3, 0x6b, 0x68, 0x0a, 0x7e, 0xd2, 0xd4, 0xc5, 0x3d, 0xdc, 0xac, 0x28, 0x8b, 0x88, 0xb5, 0x1e, 0xd8, 0x2b, 0x68, 0x72, 0x55, 0x64, 0xa2, 0xa5, 0x69, 0x0a, 0xdb, 0x26, 0xff, 0x63, 0x2d, 0xb8, 0xff, 0xb6, 0x33, 0xd3, 0x9d, 0x5c, 0x46, 0xd6, 0xbf, 0x8b, 0x1c, 0x5c, 0x5c, 0x3b, 0x98, 0x60, 0x80, 0x3c, 0x97, 0x43, 0x79, 0x9c, 0x94, 0xec, 0x63, 0xaa, 0xd9, 0x10, 0xd7, 0x0d, 0x91, 0xfb, 0x1f, 0xbf, 0xe0, 0x29, 0xde, 0x77, 0x09, 0x21, 0x34, 0xa5, 0x7d, 0xdf, 0xe3, 0xdf, 0x11, 0xdf, 0xd4, 0x00, 0x57, 0x38, 0x5b, 0xae, 0x9e, 0x89, 0x35, 0xcf, 0x07, 0x48, 0xca, 0xc8, 0x25, 0x46, 0x3c, 0xb6, 0xdb, 0x9b, 0x39, 0xa6, 0x07, 0x3d, 0xaf, 0x8b, 0x85, 0xa2, 0x2f, 0x03, 0x64, 0x5e, 0xbd, 0xb4, 0x20, 0x01, 0x48, 0x2e, 0xc2, 0xe6, 0xcc, 0xce, 0x61, 0x59, 0x47, 0xf9, 0xdd, 0xc2, 0xa2, 0xfe, 0x64, 0xe6, 0x0b, 0x41, 0x4f, 0xe4, 0x8a, 0xca, 0xbe, 0x4d, 0x0e, 0x73, 0xba, 0x82, 0x30, 0x3c, 0x53, 0x36, 0x2e, 0xd3, 0x04, 0xae, 0x49, 0x44, 0x71, 0x6d, 0x4d, 0x5a, 0x14, 0x94, 0x94, 0x57, 0x78, 0xb9, 0x2a, 0x34, 0x49, 0xf8, 0xc2, 0xec, 0x4e, 0x29, 0xb6, 0x28, 0x54, 0x4a, 0x5e, 0x68, 0x06, 0xfe, 0xfc, 0xd5, 0x01, 0x35, 0x0c, 0x95, 0x6f, 0xe9, 0x77, 0x8a, 0xfc, 0x11, 0x15, 0x1a, 0xda, 0x6c, 0xf5, 0xba, 0x9e, 0x41, 0xd9, 0x7e, 0x0f, 0xdb, 0x33, 0xda, 0x35, 0x9d, 0x34, 0x67, 0x8f, 0xdf, 0x71, 0x63, 0x04, 0x9c, 0x54, 0xb6, 0x18, 0x10, 0x2d, 0x42, 0xd2, 0xf3, 0x14, 0x34, 0xa1, 0x31, 0x90, 0x48, 0xc9, 0x4b, 0x87, 0xb5, 0xcd, 0x62, 0x6b, 0x77, 0x18, 0x36, 0xd9, 0xc9, 0xc9, 0xae, 0x89, 0xfb, 0xed, 0xcd, 0xcb, 0xdb, 0x6e, 0xe3, 0x22, 0xbf, 0x7b, 0x72, 0x8a, 0xc3, 0x79, 0xd6, 0x1b, 0x6c, 0xe7, 0x9c, 0xc9, 0xfd, 0x48, 0xaa, 0xc1, 0xfa, 0xbf, 0x33, 0x87, 0x5c, 0x0d, 0xe5, 0x34, 0x24, 0x70, 0x14, 0x1e, 0x4a, 0x48, 0x07, 0x6e, 0xaf, 0xbf, 0xfe, 0x34, 0x1e, 0x1e, 0x19, 0xfc, 0xb5, 0x8a, 0x4f, 0x3c, 0xb4, 0xcf, 0xde, 0x24, 0x79, 0x65, 0x17, 0x22, 0x3f, 0xc0, 0x06, 0x76, 0x4e, 0x3c, 0xfb, 0xc3, 0xd0, 0x7f, 0x7b, 0x87, 0x5c, 0xeb, 0x97, 0x87, @@ -384,7 +390,7 @@ VOID TEST(ProtocolHandshakeTest, VerifyFPC0C1) c1s1 c1; // the schema of data must be schema0: key-digest. - ASSERT_EQ(ERROR_SUCCESS, c1.parse((char*)c0c1 + 1, 1536, srs_schema0)); + HELPER_ASSERT_SUCCESS( c1.parse((char*)c0c1 + 1, 1536, srs_schema0)); EXPECT_EQ((int32_t)0x000f64d0, c1.time); EXPECT_EQ((int32_t)0x80000702, c1.version); @@ -392,10 +398,10 @@ VOID TEST(ProtocolHandshakeTest, VerifyFPC0C1) // @see: calc_c1_digest char* c1s1_joined_bytes = new char[1536 -32]; SrsAutoFree(char, c1s1_joined_bytes); - ASSERT_EQ(ERROR_SUCCESS, c1.payload->copy_to(&c1, c1s1_joined_bytes, 1536 - 32, false)); + HELPER_ASSERT_SUCCESS( c1.payload->copy_to(&c1, c1s1_joined_bytes, 1536 - 32, false)); bool is_valid; - ASSERT_EQ(ERROR_SUCCESS, c1.c1_validate_digest(is_valid)); + HELPER_ASSERT_SUCCESS( c1.c1_validate_digest(is_valid)); ASSERT_TRUE(is_valid); // 128bytes key @@ -435,11 +441,11 @@ VOID TEST(ProtocolHandshakeTest, ComplexHandshake) SrsHandshakeBytes bytes; if (true) { - ASSERT_EQ(ERROR_SUCCESS, bytes.create_c0c1()); + HELPER_ASSERT_SUCCESS( bytes.create_c0c1()); memcpy(bytes.c0c1, c0c1, 1537); - ASSERT_EQ(ERROR_SUCCESS, bytes.create_s0s1s2()); + HELPER_ASSERT_SUCCESS( bytes.create_s0s1s2()); memcpy(bytes.s0s1s2, s0s1s2, 3073); - ASSERT_EQ(ERROR_SUCCESS, bytes.create_c2()); + HELPER_ASSERT_SUCCESS( bytes.create_c2()); memcpy(bytes.c2, c2, 1536); } @@ -448,23 +454,23 @@ VOID TEST(ProtocolHandshakeTest, ComplexHandshake) bool is_valid; c1s1 c1; - ASSERT_EQ(ERROR_SUCCESS, c1.parse(hs_bytes->c0c1 + 1, 1536, srs_schema0)); - ASSERT_EQ(ERROR_SUCCESS, c1.c1_validate_digest(is_valid)); + HELPER_ASSERT_SUCCESS( c1.parse(hs_bytes->c0c1 + 1, 1536, srs_schema0)); + HELPER_ASSERT_SUCCESS( c1.c1_validate_digest(is_valid)); ASSERT_TRUE(is_valid); c1s1 s1; - ASSERT_EQ(ERROR_SUCCESS, s1.parse(hs_bytes->s0s1s2 + 1, 1536, c1.schema())); - ASSERT_EQ(ERROR_SUCCESS, s1.s1_validate_digest(is_valid)); + HELPER_ASSERT_SUCCESS( s1.parse(hs_bytes->s0s1s2 + 1, 1536, c1.schema())); + HELPER_ASSERT_SUCCESS( s1.s1_validate_digest(is_valid)); ASSERT_TRUE(is_valid); c2s2 c2; c2.parse(hs_bytes->c2, 1536); - ASSERT_EQ(ERROR_SUCCESS, c2.c2_validate(&s1, is_valid)); + HELPER_ASSERT_SUCCESS( c2.c2_validate(&s1, is_valid)); ASSERT_TRUE(is_valid); c2s2 s2; s2.parse(hs_bytes->s0s1s2 + 1 + 1536, 1536); - ASSERT_EQ(ERROR_SUCCESS, s2.s2_validate(&c1, is_valid)); + HELPER_ASSERT_SUCCESS( s2.s2_validate(&c1, is_valid)); ASSERT_TRUE(is_valid); } @@ -515,11 +521,11 @@ VOID TEST(ProtocolHandshakeTest, SimpleHandshake) if (true) { SrsHandshakeBytes bytes; - ASSERT_EQ(ERROR_SUCCESS, bytes.create_c0c1()); + HELPER_ASSERT_SUCCESS( bytes.create_c0c1()); memcpy(bytes.c0c1, c0c1, 1537); - ASSERT_EQ(ERROR_SUCCESS, bytes.create_s0s1s2()); + HELPER_ASSERT_SUCCESS( bytes.create_s0s1s2()); memcpy(bytes.s0s1s2, s0s1s2, 3073); - ASSERT_EQ(ERROR_SUCCESS, bytes.create_c2()); + HELPER_ASSERT_SUCCESS( bytes.create_c2()); memcpy(bytes.c2, c2, 1536); MockEmptyIO eio; @@ -598,10 +604,12 @@ VOID TEST(ProtocolUtilityTest, GenerateTcUrl) */ VOID TEST(ProtocolMsgArrayTest, MessageArray) { + srs_error_t err = srs_success; + SrsMessageHeader header; SrsSharedPtrMessage msg; char* payload = new char[1024]; - EXPECT_TRUE(ERROR_SUCCESS == msg.create(&header, payload, 1024)); + HELPER_EXPECT_SUCCESS(msg.create(&header, payload, 1024)); EXPECT_EQ(0, msg.count()); if (true) { @@ -653,6 +661,8 @@ VOID TEST(ProtocolStackTest, ProtocolTimeout) */ VOID TEST(ProtocolStackTest, ProtocolBytes) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -660,7 +670,7 @@ VOID TEST(ProtocolStackTest, ProtocolBytes) EXPECT_TRUE(0 == proto.get_send_bytes()); SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); EXPECT_TRUE(0 < proto.get_send_bytes()); } @@ -669,6 +679,8 @@ VOID TEST(ProtocolStackTest, ProtocolBytes) */ VOID TEST(ProtocolStackTest, ProtocolRecvMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -711,11 +723,11 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessage) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); SrsPacket* pkt = NULL; - EXPECT_TRUE(ERROR_SUCCESS == proto.decode_message(msg, &pkt)); + HELPER_EXPECT_SUCCESS(proto.decode_message(msg, &pkt)); SrsAutoFree(SrsPacket, pkt); SrsConnectAppPacket* spkt = dynamic_cast(pkt); @@ -731,6 +743,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessage) // 0x00 0x00 0x0d 0x0f where: event data 4bytes ping timestamp. VOID TEST(ProtocolStackTest, ProtocolRecvMessageBug98) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -746,11 +760,11 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessageBug98) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); SrsPacket* pkt = NULL; - EXPECT_TRUE(ERROR_SUCCESS == proto.decode_message(msg, &pkt)); + HELPER_EXPECT_SUCCESS(proto.decode_message(msg, &pkt)); SrsAutoFree(SrsPacket, pkt); SrsUserControlPacket* spkt = dynamic_cast(pkt); @@ -764,6 +778,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessageBug98) */ VOID TEST(ProtocolStackTest, ProtocolRecvAckSizeMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -781,11 +797,11 @@ VOID TEST(ProtocolStackTest, ProtocolRecvAckSizeMessage) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); SrsPacket* pkt = NULL; - EXPECT_TRUE(ERROR_SUCCESS == proto.decode_message(msg, &pkt)); + HELPER_EXPECT_SUCCESS(proto.decode_message(msg, &pkt)); SrsAutoFree(SrsPacket, pkt); SrsSetWindowAckSizePacket* spkt = dynamic_cast(pkt); @@ -798,6 +814,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvAckSizeMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvVMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -815,7 +833,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessage) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); } @@ -825,6 +843,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvAMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -842,7 +862,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvAMessage) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); } @@ -852,6 +872,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvAMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvVMessage2Trunk) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -888,7 +910,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessage2Trunk) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); } @@ -898,6 +920,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessage2Trunk) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -979,13 +1003,13 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAMessage) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); } @@ -997,6 +1021,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt1) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1097,13 +1123,13 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt1) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); } @@ -1115,6 +1141,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt1) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1213,13 +1241,13 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt2) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); } @@ -1231,6 +1259,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt2) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt3) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1328,13 +1358,13 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt3) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); } @@ -1345,6 +1375,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAFmt3) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1471,7 +1503,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVMessage) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -1479,7 +1511,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVMessage) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -1487,7 +1519,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVMessage) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -1501,6 +1533,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt1) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1639,7 +1673,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt1) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -1647,7 +1681,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt1) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -1655,7 +1689,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt1) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x22, msg->header.timestamp); @@ -1669,6 +1703,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt1) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1805,7 +1841,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt2) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -1813,7 +1849,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt2) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -1821,7 +1857,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt2) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x22, msg->header.timestamp); @@ -1835,6 +1871,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt2) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt3) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1970,7 +2008,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt3) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -1978,7 +2016,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt3) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -1986,7 +2024,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt3) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -2000,6 +2038,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt3) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BNormal) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2038,7 +2078,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BNormal) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 1B cid(6bits), cid in 2-63 @@ -2051,6 +2091,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BNormal) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMax) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2089,7 +2131,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMax) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 1B cid(6bits), max is 63 @@ -2102,6 +2144,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMax) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMin) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2140,7 +2184,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMin) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 2B cid(8bits), min is 64 @@ -2153,6 +2197,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMin) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2191,7 +2237,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 2B cid(8bits), cid in 64-319 @@ -2204,6 +2250,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2242,7 +2290,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal2) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 2B cid(8bits), cid in 64-319 @@ -2255,6 +2303,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal2) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMax) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2293,7 +2343,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMax) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 2B cid(68bits), max is 319 @@ -2306,6 +2356,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMax) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMin) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2344,7 +2396,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMin) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 3B cid(16bits), min is 64 @@ -2357,6 +2409,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMin) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2395,7 +2449,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 3B cid(16bits), cid in 64-65599 @@ -2408,6 +2462,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2446,7 +2502,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal2) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 3B cid(16bits), cid in 64-65599 @@ -2459,6 +2515,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal2) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal3) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2497,7 +2555,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal3) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 3B cid(16bits), cid in 64-65599 @@ -2510,6 +2568,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal3) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal4) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2548,7 +2608,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal4) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 3B cid(16bits), cid in 64-65599 @@ -2561,6 +2621,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal4) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMax) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2599,7 +2661,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMax) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 2B cid(16bits), max is 65599 @@ -2611,6 +2673,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMax) */ VOID TEST(ProtocolStackTest, ProtocolRecvV0LenMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2637,7 +2701,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvV0LenMessage) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // protocol stack will ignore the empty video message. @@ -2649,6 +2713,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvV0LenMessage) */ VOID TEST(ProtocolStackTest, ProtocolSendVMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2660,9 +2726,9 @@ VOID TEST(ProtocolStackTest, ProtocolSendVMessage) memcpy(msg->payload, data, msg->size); SrsSharedPtrMessage m; - ASSERT_TRUE(ERROR_SUCCESS == m.create(msg)); + HELPER_ASSERT_SUCCESS(m.create(msg)); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_message(m.copy(), 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_message(m.copy(), 0)); EXPECT_EQ(16, bio.out_buffer.length()); } @@ -2671,6 +2737,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendVMessage) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2685,7 +2753,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallPacket) args->set("url", SrsAmf0Any::str("http://ossrs.net/api/v1/videos/100")); args->set("date", SrsAmf0Any::str("2014-07-11 16:20:10.2984")); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x6d, @@ -2713,6 +2781,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallResPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2727,7 +2797,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallResPacket) args->set("url", SrsAmf0Any::str("http://ossrs.net/api/v1/videos/100")); args->set("date", SrsAmf0Any::str("2014-07-11 16:20:10.2984")); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f, @@ -2755,13 +2825,15 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallResPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsCreateStreamPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket(); pkt->command_object = SrsAmf0Any::null(); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x63, @@ -2777,6 +2849,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCreateStreamPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2785,7 +2859,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartPacket) pkt->command_object = SrsAmf0Any::null(); pkt->stream_name = "livestream"; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46, @@ -2802,6 +2876,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartResPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2815,7 +2891,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartResPacket) args->set("stream" , SrsAmf0Any::str("livestream")); args->set("start" , SrsAmf0Any::number(0)); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); uint8_t buf[] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46, @@ -2831,6 +2907,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartResPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsPublishPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2840,7 +2918,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsPublishPacket) pkt->stream_name = "livestream"; pkt->type = "live"; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); uint8_t buf[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x70, @@ -2858,6 +2936,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsPublishPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsPlayResPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2871,7 +2951,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsPlayResPacket) args->set("stream" , SrsAmf0Any::str("livestream")); args->set("start" , SrsAmf0Any::number(0)); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f, @@ -2892,6 +2972,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsPlayResPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnBWDonePacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2899,7 +2981,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnBWDonePacket) pkt->command_name = "onBWDone"; pkt->args = SrsAmf0Any::null(); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f, @@ -2915,6 +2997,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnBWDonePacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusCallPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2928,7 +3012,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusCallPacket) pkt->args = SrsAmf0Any::null(); pkt->data = args; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f, @@ -2949,6 +3033,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusCallPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusDataPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2961,7 +3047,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusDataPacket) pkt->command_name = "onData"; pkt->data = args; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x6f, @@ -2980,6 +3066,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusDataPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsSampleAccessPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2988,7 +3076,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSampleAccessPacket) pkt->video_sample_access = true; pkt->audio_sample_access = true; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x7c, @@ -3004,6 +3092,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSampleAccessPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnMetaDataPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3016,7 +3106,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnMetaDataPacket) pkt->name = "onMetaData"; pkt->metadata = args; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); uint8_t buf[] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x6f, @@ -3035,13 +3125,15 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnMetaDataPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetWindowAckSizePacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket(); pkt->ackowledgement_window_size = 102400; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); uint8_t buf[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00 @@ -3054,13 +3146,15 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetWindowAckSizePacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsAcknowledgementPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); SrsAcknowledgementPacket* pkt = new SrsAcknowledgementPacket(); pkt->sequence_number = 1024; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00 @@ -3073,13 +3167,15 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsAcknowledgementPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetChunkSizePacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket(); pkt->chunk_size = 1024; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00 @@ -3092,6 +3188,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetChunkSizePacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetPeerBandwidthPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3099,7 +3197,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetPeerBandwidthPacket) pkt->type = SrsPeerBandwidthSoft; pkt->bandwidth = 1024; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, @@ -3113,6 +3211,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetPeerBandwidthPacket) */ VOID TEST(ProtocolStackTest, ProtocolSendSrsUserControlPacket) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3121,7 +3221,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsUserControlPacket) pkt->event_data = 0x01; pkt->extra_data = 0x10; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); char buf[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, @@ -3140,6 +3240,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsUserControlPacket) // the fmt must not be type0 which means new message. VOID TEST(ProtocolStackTest, ProtocolRecvVMessageFmtInvalid) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3176,7 +3278,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessageFmtInvalid) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - EXPECT_FALSE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_EXPECT_FAILED(proto.recv_message(&msg)); } /** @@ -3184,6 +3286,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessageFmtInvalid) */ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3191,7 +3295,7 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket(); pkt->ackowledgement_window_size = 512; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); } if (true) { @@ -3203,9 +3307,9 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) EXPECT_TRUE(msg->header.is_video()); SrsSharedPtrMessage m; - ASSERT_TRUE(ERROR_SUCCESS == m.create(msg)); + HELPER_ASSERT_SUCCESS(m.create(msg)); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_message(m.copy(), 1)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_message(m.copy(), 1)); } // copy output to input @@ -3217,14 +3321,14 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) // recv SrsSetWindowAckSizePacket if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); ASSERT_TRUE(msg->header.is_window_ackledgement_size()); } // recv video if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); ASSERT_TRUE(msg->header.is_video()); } @@ -3237,7 +3341,7 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) // recv auto send acked size. #1 if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); ASSERT_TRUE(msg->header.is_ackledgement()); } @@ -3252,9 +3356,9 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) EXPECT_TRUE(msg->header.is_video()); SrsSharedPtrMessage m; - ASSERT_TRUE(ERROR_SUCCESS == m.create(msg)); + HELPER_ASSERT_SUCCESS(m.create(msg)); - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_message(m.copy(), 1)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_message(m.copy(), 1)); } // copy output to input if (true) { @@ -3264,7 +3368,7 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) // recv video if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); ASSERT_TRUE(msg->header.is_video()); } @@ -3277,7 +3381,7 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) // recv auto send acked size. #2 if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); ASSERT_TRUE(msg->header.is_ackledgement()); } @@ -3288,6 +3392,8 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow) */ VOID TEST(ProtocolStackTest, ProtocolPingFlow) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3296,7 +3402,7 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow) SrsUserControlPacket* pkt = new SrsUserControlPacket(); pkt->event_type = SrcPCUCPingRequest; pkt->event_data = 0x3456; - EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0)); + HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0)); } // copy output to input if (true) { @@ -3306,7 +3412,7 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow) // recv ping if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_user_control_message()); } @@ -3320,12 +3426,12 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow) // recv ping if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); ASSERT_TRUE(msg->header.is_user_control_message()); SrsPacket* pkt = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.decode_message(msg, &pkt)); + HELPER_ASSERT_SUCCESS(proto.decode_message(msg, &pkt)); SrsUserControlPacket* spkt = dynamic_cast(pkt); ASSERT_TRUE(spkt != NULL); @@ -3339,6 +3445,8 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow) */ VOID TEST(ProtocolStackTest, ProtocolExcpectMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3382,7 +3490,7 @@ VOID TEST(ProtocolStackTest, ProtocolExcpectMessage) SrsCommonMessage* msg = NULL; SrsConnectAppPacket* pkt = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.expect_message(&msg, &pkt)); + HELPER_ASSERT_SUCCESS(proto.expect_message(&msg, &pkt)); SrsAutoFree(SrsCommonMessage, msg); SrsAutoFree(SrsConnectAppPacket, pkt); ASSERT_TRUE(NULL != pkt); @@ -3390,6 +3498,8 @@ VOID TEST(ProtocolStackTest, ProtocolExcpectMessage) VOID TEST(ProtocolRTMPTest, RTMPRequest) { + srs_error_t err = srs_success; + SrsRequest req; std::string param; @@ -3443,6 +3553,8 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest) VOID TEST(ProtocolRTMPTest, RTMPHandshakeBytes) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsHandshakeBytes bytes; @@ -3450,13 +3562,13 @@ VOID TEST(ProtocolRTMPTest, RTMPHandshakeBytes) bio.in_buffer.append(hs, sizeof(hs)); bio.in_buffer.append(hs, sizeof(hs)); - EXPECT_TRUE(ERROR_SUCCESS == bytes.read_c0c1(&bio)); + HELPER_EXPECT_SUCCESS(bytes.read_c0c1(&bio)); EXPECT_TRUE(bytes.c0c1 != NULL); - EXPECT_TRUE(ERROR_SUCCESS == bytes.read_c2(&bio)); + HELPER_EXPECT_SUCCESS(bytes.read_c2(&bio)); EXPECT_TRUE(bytes.c2 != NULL); - EXPECT_TRUE(ERROR_SUCCESS == bytes.read_s0s1s2(&bio)); + HELPER_EXPECT_SUCCESS(bytes.read_s0s1s2(&bio)); EXPECT_TRUE(bytes.s0s1s2 != NULL); } diff --git a/trunk/src/utest/srs_utest_protocol2.cpp b/trunk/src/utest/srs_utest_protocol2.cpp index 50afde854..eeca30715 100644 --- a/trunk/src/utest/srs_utest_protocol2.cpp +++ b/trunk/src/utest/srs_utest_protocol2.cpp @@ -26,6 +26,8 @@ using namespace std; */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -208,7 +210,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -216,7 +218,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -224,7 +226,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -232,7 +234,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x40, msg->header.timestamp); @@ -247,6 +249,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -430,7 +434,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -438,7 +442,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -446,7 +450,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -454,7 +458,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x40, msg->header.timestamp); @@ -468,6 +472,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -648,7 +654,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -656,7 +662,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -664,7 +670,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -672,7 +678,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x40, msg->header.timestamp); @@ -687,6 +693,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -869,7 +877,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -878,7 +886,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -886,7 +894,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -895,7 +903,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x40, msg->header.timestamp); @@ -910,6 +918,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length) */ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -940,7 +950,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -952,6 +962,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -982,7 +994,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage2) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x7f010203, msg->header.timestamp); @@ -995,6 +1007,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage2) // always use 31bits timestamp, for some server may use 32bits extended timestamp. VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage3) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1025,7 +1039,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage3) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // always use 31bits timestamp @@ -1055,6 +1069,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage3) */ VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1098,7 +1114,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 0xCX with extended timestamp. @@ -1112,6 +1128,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk) // FFMPEG/librtmp, RTMP specification standard protocol. VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1153,7 +1171,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk2) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 0xCX without extended timestamp. @@ -1166,6 +1184,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk2) */ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMin) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -1204,7 +1224,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMin) bio.in_buffer.append((char*)data, sizeof(data)); SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); // 1B cid(6bits), min is 2 @@ -1213,6 +1233,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMin) VOID TEST(ProtocolKbpsTest, Connections) { + srs_error_t err = srs_success; + if (true) { MockWallClock* clock = new MockWallClock(); SrsAutoFree(MockWallClock, clock); @@ -1378,6 +1400,8 @@ VOID TEST(ProtocolKbpsTest, Connections) VOID TEST(ProtocolKbpsTest, Delta) { + srs_error_t err = srs_success; + if (true) { MockWallClock* clock = new MockWallClock(); SrsAutoFree(MockWallClock, clock); @@ -1460,6 +1484,8 @@ VOID TEST(ProtocolKbpsTest, Delta) VOID TEST(ProtocolKbpsTest, RAWStatistic) { + srs_error_t err = srs_success; + if (true) { MockWallClock* clock = new MockWallClock(); SrsAutoFree(MockWallClock, clock); @@ -1624,6 +1650,8 @@ VOID TEST(ProtocolKbpsTest, WriteLargeIOVs) VOID TEST(ProtocolKbpsTest, ConnectionsSugar) { + srs_error_t err = srs_success; + if (true) { MockWallClock* clock = new MockWallClock(); SrsAutoFree(MockWallClock, clock); @@ -1771,6 +1799,8 @@ VOID TEST(ProtocolKbpsTest, ConnectionsSugar) VOID TEST(ProtocolKbpsTest, DeltaSugar) { + srs_error_t err = srs_success; + if (true) { MockWallClock* clock = new MockWallClock(); SrsAutoFree(MockWallClock, clock); @@ -1810,6 +1840,8 @@ VOID TEST(ProtocolKbpsTest, DeltaSugar) VOID TEST(ProtocolKbpsTest, RAWStatisticSugar) { + srs_error_t err = srs_success; + if (true) { MockWallClock* clock = new MockWallClock(); SrsAutoFree(MockWallClock, clock); @@ -2254,6 +2286,8 @@ VOID TEST(ProtocolProtobufTest, FieldKey) VOID TEST(ProtocolKbpsTest, NewDelta) { + srs_error_t err = srs_success; + if (true) { SrsEphemeralDelta ed; @@ -2305,6 +2339,8 @@ VOID TEST(ProtocolKbpsTest, NewDelta) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2476,7 +2512,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -2484,7 +2520,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -2492,7 +2528,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -2500,7 +2536,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x30, msg->header.timestamp); @@ -2514,6 +2550,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2696,7 +2734,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -2704,7 +2742,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -2712,7 +2750,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -2720,7 +2758,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x30, msg->header.timestamp); @@ -2734,6 +2772,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -2912,7 +2952,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -2920,7 +2960,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -2928,7 +2968,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -2936,7 +2976,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x30, msg->header.timestamp); @@ -2950,6 +2990,8 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2) */ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3) { + srs_error_t err = srs_success; + MockBufferIO bio; SrsProtocol proto(&bio); @@ -3126,7 +3168,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3) if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x10, msg->header.timestamp); @@ -3134,7 +3176,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_audio()); EXPECT_EQ(0x15, msg->header.timestamp); @@ -3142,7 +3184,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x20, msg->header.timestamp); @@ -3150,7 +3192,7 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3) } if (true) { SrsCommonMessage* msg = NULL; - ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg)); + HELPER_ASSERT_SUCCESS(proto.recv_message(&msg)); SrsAutoFree(SrsCommonMessage, msg); EXPECT_TRUE(msg->header.is_video()); EXPECT_EQ(0x30, msg->header.timestamp); diff --git a/trunk/src/utest/srs_utest_reload.cpp b/trunk/src/utest/srs_utest_reload.cpp index 44f7d5375..e7e71e6aa 100644 --- a/trunk/src/utest/srs_utest_reload.cpp +++ b/trunk/src/utest/srs_utest_reload.cpp @@ -194,51 +194,55 @@ srs_error_t MockSrsReloadConfig::do_reload(string buf) VOID TEST(ConfigReloadTest, ReloadEmpty) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_FALSE(ERROR_SUCCESS == conf.parse("")); - EXPECT_FALSE(ERROR_SUCCESS == conf.do_reload("")); + HELPER_EXPECT_FAILED(conf.parse("")); + HELPER_EXPECT_FAILED(conf.do_reload("")); EXPECT_TRUE(handler.all_false()); } VOID TEST(ConfigReloadTest, ReloadListen) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse("listen 1935;")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1935;")); + HELPER_EXPECT_SUCCESS(conf.parse("listen 1935;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1935;")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1936;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1936;")); EXPECT_TRUE(handler.listen_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1936;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1936;")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1936 1935;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1936 1935;")); EXPECT_TRUE(handler.listen_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1935;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1935;")); EXPECT_TRUE(handler.listen_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1935 1935;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1935 1935;")); EXPECT_TRUE(handler.listen_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload("listen 1935;")); + HELPER_EXPECT_SUCCESS(conf.do_reload("listen 1935;")); EXPECT_TRUE(handler.listen_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); @@ -246,357 +250,391 @@ VOID TEST(ConfigReloadTest, ReloadListen) VOID TEST(ConfigReloadTest, ReloadPithyPrint) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"pithy_print_ms 1000;")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"pithy_print_ms 1000;")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"pithy_print_ms 1000;")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"pithy_print_ms 1000;")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"pithy_print_ms 2000;")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"pithy_print_ms 2000;")); EXPECT_TRUE(handler.pithy_print_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"pithy_print_ms 1000;")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"pithy_print_ms 1000;")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostAdded) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{} vhost b{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{} vhost b{}")); EXPECT_TRUE(handler.vhost_added_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostRemoved) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{enabled off;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{enabled off;}")); EXPECT_TRUE(handler.vhost_removed_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostRemoved2) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{} vhost b{}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{} vhost b{}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{} vhost b{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{} vhost b{}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_TRUE(handler.vhost_removed_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{} vhost b{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{} vhost b{}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostAtc) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{atc off;}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{atc off;}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{atc off;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{atc off;}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{atc on;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{atc on;}")); EXPECT_TRUE(handler.vhost_play_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{atc off;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{atc off;}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostGopCache) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{gop_cache off;}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{gop_cache off;}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{gop_cache off;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{gop_cache off;}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{gop_cache on;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{gop_cache on;}")); EXPECT_TRUE(handler.vhost_play_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{gop_cache off;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{gop_cache off;}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostQueueLength) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{queue_length 10;}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{queue_length 10;}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{queue_length 10;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{queue_length 10;}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{queue_length 20;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{queue_length 20;}")); EXPECT_TRUE(handler.vhost_play_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{queue_length 10;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{queue_length 10;}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostTimeJitter) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{time_jitter full;}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{time_jitter full;}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{time_jitter full;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{time_jitter full;}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{time_jitter zero;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{time_jitter zero;}")); EXPECT_TRUE(handler.vhost_play_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{time_jitter full;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{time_jitter full;}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostForward) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1936;}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1936;}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1936;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1936;}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1937;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1937;}")); EXPECT_TRUE(handler.vhost_forward_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1936;}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{forward 127.0.0.1:1936;}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostHls) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{hls {enabled on;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{hls {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{hls {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{hls {enabled on;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{hls {enabled off;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{hls {enabled off;}}")); EXPECT_TRUE(handler.vhost_hls_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{hls {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{hls {enabled on;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostDvr) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{dvr {enabled on;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{dvr {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{dvr {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{dvr {enabled on;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{dvr {enabled off;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{dvr {enabled off;}}")); EXPECT_TRUE(handler.vhost_dvr_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{dvr {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{dvr {enabled on;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostTranscode) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{transcode {enabled on;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{transcode {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{transcode {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{transcode {enabled on;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{transcode {enabled off;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{transcode {enabled off;}}")); EXPECT_TRUE(handler.vhost_transcode_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{transcode {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{transcode {enabled on;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostIngestAdded) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); EXPECT_TRUE(handler.ingest_added_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostIngestAdded2) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{ingest a {enabled on;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest a {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{ingest a {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest a {enabled on;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest a {enabled on;} ingest b {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest a {enabled on;} ingest b {enabled on;}}")); EXPECT_TRUE(handler.ingest_added_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest a {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest a {enabled on;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostIngestRemoved) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{}")); EXPECT_TRUE(handler.ingest_removed_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostIngestRemoved2) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled off;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled off;}}")); EXPECT_TRUE(handler.ingest_removed_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); } VOID TEST(ConfigReloadTest, ReloadVhostIngestUpdated) { + srs_error_t err = srs_success; + MockReloadHandler handler; MockSrsReloadConfig conf; conf.subscribe(&handler); - EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg;}}")); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg;}}")); + HELPER_EXPECT_SUCCESS(conf.parse(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg;}}")); EXPECT_TRUE(handler.all_false()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg1;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg1;}}")); EXPECT_TRUE(handler.ingest_updated_reloaded); EXPECT_EQ(1, handler.count_true()); handler.reset(); - EXPECT_TRUE(ERROR_SUCCESS == conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg;}}")); + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF"vhost a{ingest {enabled on;ffmpeg ffmpeg;}}")); EXPECT_EQ(1, handler.count_true()); handler.reset(); }