diff --git a/README.md b/README.md index 5d80253..923ef4d 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,13 @@ GleanProxy is configured through environment variables. By default, the set of f |---------------------|-------------|---------| | `CLOUD_PLATFORM` | Cloud platform (`AWS` or `GOOGLE`) | None | +### Metrics Configuration + +| Variable | Description | Default | +|---------------------|-------------|---------| +| `GCP_PROJECT_ID` | GCP project ID for Stackdriver metrics export | None | +| `ENABLE_METRICS_EXPORT` | Enable/disable metrics export to Stackdriver (true/false) | Enabled if `GCP_PROJECT_ID` is set | + ### Filter Configuration Variables | Variable | Description | Default | @@ -178,6 +185,24 @@ curl localhost:8080/liveness_check curl --proxy localhost:8080 https://www.glean.com ``` +### Running with Metrics Export + +To export metrics to GCP Cloud Monitoring (Stackdriver): + +```bash +export CLOUD_PLATFORM=GOOGLE +export GCP_PROJECT_ID=your-gcp-project-id +export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json + +bazel run //src/main/java/com/glean/proxy:ProxyMain 8080 +``` + +Metrics are exported every 60 seconds and include: +- `proxy/request_count` - Total number of requests (labeled by status_code, method) +- `proxy/request_latency` - Request latency distribution in milliseconds (labeled by status_code, method) + +To run locally without exporting metrics, omit `GCP_PROJECT_ID` or set `ENABLE_METRICS_EXPORT=false`. + ## Contributing Please see [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines. diff --git a/WORKSPACE b/WORKSPACE index b6dfe0f..39945f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,6 +1,32 @@ workspace(name = "com_github_gleanwork_glean-proxy") +load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "aspect_bazel_lib_register_toolchains") +load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies") +load("@aspect_rules_lint//format:repositories.bzl", "rules_lint_dependencies") +load("@aspect_rules_lint//lint:pmd.bzl", "fetch_pmd") +load("@bazel_features//:deps.bzl", "bazel_features_deps") +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@contrib_rules_jvm//:gazelle_setup.bzl", "contrib_rules_jvm_gazelle_setup") + +# Fetches the contrib_rules_jvm dependencies. +# If you want to have a different version of some dependency, +# you should fetch it *before* calling this. +load("@contrib_rules_jvm//:repositories.bzl", "contrib_rules_jvm_deps", "contrib_rules_jvm_gazelle_deps") + +# Now ensure that the downloaded deps are properly configured +load("@contrib_rules_jvm//:setup.bzl", "contrib_rules_jvm_setup") +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@maven//:defs.bzl", "pinned_maven_install") +load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") +load("@rules_jvm_external//:defs.bzl", "maven_install") +load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") +load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") +load("@rules_oci//oci:dependencies.bzl", "rules_oci_dependencies") +load("@rules_oci//oci:pull.bzl", "oci_pull") +load("@rules_oci//oci:repositories.bzl", "oci_register_toolchains") +load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies") http_archive( name = "platforms", @@ -18,8 +44,6 @@ http_archive( url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.16.0/bazel_features-v1.16.0.tar.gz", ) -load("@bazel_features//:deps.bzl", "bazel_features_deps") - bazel_features_deps() http_archive( @@ -30,8 +54,6 @@ http_archive( ], ) -load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") - rules_pkg_dependencies() http_archive( @@ -43,12 +65,8 @@ http_archive( url = "https://github.com/aspect-build/rules_lint/releases/download/v1.0.2/rules_lint-v1.0.2.tar.gz", ) -load("@aspect_rules_lint//format:repositories.bzl", "rules_lint_dependencies") - rules_lint_dependencies() -load("@aspect_rules_lint//lint:pmd.bzl", "fetch_pmd") - fetch_pmd() http_archive( @@ -58,8 +76,6 @@ http_archive( url = "https://github.com/aspect-build/bazel-lib/releases/download/v2.8.1/bazel-lib-v2.8.1.tar.gz", ) -load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "aspect_bazel_lib_register_toolchains") - aspect_bazel_lib_dependencies() aspect_bazel_lib_register_toolchains() @@ -73,8 +89,6 @@ http_archive( ], ) -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - go_rules_dependencies() go_register_toolchains(go_version = "1.23.7") @@ -88,8 +102,6 @@ http_archive( ], ) -load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") - gazelle_dependencies(go_sdk = "go_sdk") http_archive( @@ -99,8 +111,6 @@ http_archive( url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0/rules_proto-6.0.0.tar.gz", ) -load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies") - rules_proto_dependencies() http_archive( @@ -111,8 +121,6 @@ http_archive( ], ) -load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") - rules_java_dependencies() rules_java_toolchains() @@ -140,22 +148,12 @@ http_archive( url = "https://github.com/bazel-contrib/rules_jvm/releases/download/v0.27.0/rules_jvm-v0.27.0.tar.gz", ) -# Fetches the contrib_rules_jvm dependencies. -# If you want to have a different version of some dependency, -# you should fetch it *before* calling this. -load("@contrib_rules_jvm//:repositories.bzl", "contrib_rules_jvm_deps", "contrib_rules_jvm_gazelle_deps") - contrib_rules_jvm_deps() contrib_rules_jvm_gazelle_deps() -# Now ensure that the downloaded deps are properly configured -load("@contrib_rules_jvm//:setup.bzl", "contrib_rules_jvm_setup") - contrib_rules_jvm_setup() -load("@contrib_rules_jvm//:gazelle_setup.bzl", "contrib_rules_jvm_gazelle_setup") - contrib_rules_jvm_gazelle_setup() RULES_JVM_EXTERNAL_TAG = "6.1" @@ -169,12 +167,8 @@ http_archive( url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/%s/rules_jvm_external-%s.tar.gz" % (RULES_JVM_EXTERNAL_TAG, RULES_JVM_EXTERNAL_TAG), ) -load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") - rules_jvm_external_deps() -load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") - rules_jvm_external_setup() http_archive( @@ -184,14 +178,10 @@ http_archive( url = "https://github.com/aspect-build/rules_js/releases/download/v2.3.7/rules_js-v2.3.7.tar.gz", ) -load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies") - # This pulls in nodejs env and other aspect bazel lib set up for us. # https://github.com/aspect-build/rules_js/blob/066df77bd0dd6247ffd9ec728bbdcf6f6203f2e0/js/repositories.bzl#L21 rules_js_dependencies() -load("@rules_jvm_external//:defs.bzl", "maven_install") - maven_install( artifacts = [ "org.assertj:assertj-core:3.24.2", @@ -199,10 +189,18 @@ maven_install( # This was downgraded, so we can keep netty at 4.1.* "io.github.littleproxy:littleproxy:2.4.0", "io.netty:netty-codec-http:4.1.127.Final", + "com.google.cloud:google-cloud-monitoring:3.52.0", "org.apache.httpcomponents:httpclient:4.5.14", "com.uber.nullaway:nullaway:0.10.9", "org.mockito:mockito-core:5.12.0", "org.slf4j:slf4j-jdk14:2.0.13", + "io.opentelemetry:opentelemetry-api:1.44.1", + "io.opentelemetry:opentelemetry-sdk:1.44.1", + "io.opentelemetry:opentelemetry-sdk-common:1.44.1", + "io.opentelemetry:opentelemetry-sdk-metrics:1.44.1", + "io.opentelemetry:opentelemetry-exporter-otlp:1.44.1", + "io.opentelemetry.semconv:opentelemetry-semconv:1.28.0-alpha", + "com.google.cloud.opentelemetry:exporter-metrics:0.33.0", ], fetch_sources = True, maven_install_json = "//:maven_install.json", @@ -211,8 +209,6 @@ maven_install( ], ) -load("@maven//:defs.bzl", "pinned_maven_install") - pinned_maven_install() http_archive( @@ -222,16 +218,10 @@ http_archive( url = "https://github.com/bazel-contrib/rules_oci/releases/download/v2.0.1/rules_oci-v2.0.1.tar.gz", ) -load("@rules_oci//oci:dependencies.bzl", "rules_oci_dependencies") - rules_oci_dependencies() -load("@rules_oci//oci:repositories.bzl", "oci_register_toolchains") - oci_register_toolchains(name = "oci") -load("@rules_oci//oci:pull.bzl", "oci_pull") - oci_pull( name = "distroless_java17", digest = "sha256:eba3112cc48f46e4eac153191f229baa7bd1895f9d6219b497699b803fd4b4a2", diff --git a/maven_install.json b/maven_install.json index 9a26ba3..639fcb8 100755 --- a/maven_install.json +++ b/maven_install.json @@ -1,8 +1,109 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -610273456, - "__RESOLVED_ARTIFACTS_HASH": -747619382, + "__INPUT_ARTIFACTS_HASH": -126544629, + "__RESOLVED_ARTIFACTS_HASH": -711352574, + "conflict_resolution": { + "com.google.code.gson:gson:2.10.1": "com.google.code.gson:gson:2.11.0" + }, "artifacts": { + "com.google.android:annotations": { + "shasums": { + "jar": "ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15", + "sources": "e9b667aa958df78ea1ad115f7bbac18a5869c3128b1d5043feb360b0cfce9d40" + }, + "version": "4.1.1.4" + }, + "com.google.api.grpc:proto-google-cloud-monitoring-v3": { + "shasums": { + "jar": "8238b3216aa59ffeed9a157833d7fcc844a7dc9f101b23d728f1cdec6c5c3ba2", + "sources": "2d4bf6619df590be4904c3e7dfe763b32f559dd53251211e0a64f708c0ddff6b" + }, + "version": "3.52.0" + }, + "com.google.api.grpc:proto-google-common-protos": { + "shasums": { + "jar": "8b67033e6419b3810f2ee5afbb80ea2b34f1c3baa4e8f9e5b630320fb3607039", + "sources": "a4238ae00a7f482df3f1a54e989bdbddd66507f8ad66c4c1809b6e89983c531b" + }, + "version": "2.45.1" + }, + "com.google.api.grpc:proto-google-iam-v1": { + "shasums": { + "jar": "9e0cc98ed7939c4c915a7f545da2a773440d566f00922dfa00f619fe63f662a1", + "sources": "46463a467f0d1165b77588dac46c8b112491145d8b07fdb99488c9a06c713186" + }, + "version": "1.40.1" + }, + "com.google.api:api-common": { + "shasums": { + "jar": "429a441ae9b709e3e04e708efe91aaaecc24d1e6252595fbbaa7f9a2f05f992a", + "sources": "1ca3dedc720ac9aa2e4c7fff20bd3fc24c222feccc8fced8cf32fd120a61529d" + }, + "version": "2.37.1" + }, + "com.google.api:gax": { + "shasums": { + "jar": "dd0f83c3a98557f8c88d7803a1365554d28709c0e1623a2f6644f2301ff976c1", + "sources": "b1a1ea40614421caa891ab2824745ee4da96ae1c9e663c35e6e92903998dc71d" + }, + "version": "2.54.1" + }, + "com.google.api:gax-grpc": { + "shasums": { + "jar": "cedb1c2b224560cb005b30a75617dda9832d4efe206d873aadff6e8667dc1f02", + "sources": "afdf9cb9771cc566b5df1ebf95e2a00e25c6ee1ae476009e90293402d798de61" + }, + "version": "2.54.1" + }, + "com.google.auth:google-auth-library-credentials": { + "shasums": { + "jar": "e4717df3f5ea5b9f910ddb173d42d887c26be5ee76e58c5e3951b2f638ce74e2", + "sources": "ee767a413b5c852575075e18f1ca745b15048fb3853e196d3cc545ebb9d06e23" + }, + "version": "1.27.0" + }, + "com.google.auth:google-auth-library-oauth2-http": { + "shasums": { + "jar": "34887235c78c9221e1d95f1b4117b0bb81a0a5ef7b9e67bf005f19d73a8f74b8", + "sources": "5f3bfb2d9a1ed8fb21ed7d59282ba257596fe64188de1a6b28a31795d264614a" + }, + "version": "1.27.0" + }, + "com.google.auto.value:auto-value-annotations": { + "shasums": { + "jar": "5a055ce4255333b3346e1a8703da5bf8ff049532286fdcd31712d624abe111dd", + "sources": "d7941e5f19bb38afcfa85350d57e5245856c23c98c2bbe32f6d31b5577f2bc33" + }, + "version": "1.11.0" + }, + "com.google.cloud.opentelemetry:exporter-metrics": { + "shasums": { + "jar": "7a9ab87683a97357a95389ff3cec9684785648076f9b158d44da3becb93bb036", + "sources": "1693896c58280c0583ec7d4e63dee1cc2ba8b4c8bad4b10f701cca326686018f" + }, + "version": "0.33.0" + }, + "com.google.cloud.opentelemetry:shared-resourcemapping": { + "shasums": { + "jar": "eea9a3e11db783626cc15dd1835c1ed09f53b70a1fca8c58bf723ce813e9f843", + "sources": "b772c7f966814ffa2ceb408b9ee155726c700b6f5af6ecd79ebcb21b9bc39506" + }, + "version": "0.33.0" + }, + "com.google.cloud:google-cloud-core": { + "shasums": { + "jar": "baa2f9768f1665b2c18cf730b863b307adeb95cf34ab9a68ad723a6c5e6a3159", + "sources": "1878d4414057b0b40a615f9227da4c6cb4257c3bc3467247178b34440540dee3" + }, + "version": "2.44.1" + }, + "com.google.cloud:google-cloud-monitoring": { + "shasums": { + "jar": "9727aa7d94d8dd036bffccf9abc5d18970b1e5e9827896f9907f7450ed10f5e6", + "sources": "5671d4d59e5d22f4a4905d1cb1e8425c89860b30bbb49a9d8730bffb3b78a503" + }, + "version": "3.52.0" + }, "com.google.code.findbugs:jsr305": { "shasums": { "jar": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", @@ -12,10 +113,10 @@ }, "com.google.code.gson:gson": { "shasums": { - "jar": "4241c14a7727c34feea6507ec801318a3d4a90f070e4525681079fb94ee4c593", - "sources": "eee1cc5c1f4267ee194cc245777e68084738ef390acd763354ce0ff6bfb7bcc1" + "jar": "57928d6e5a6edeb2abd3770a8f95ba44dce45f3b23b7a9dc2b309c581552a78b", + "sources": "49a853f71bc874ee1898a4ad5009b57d0c536e5a998b3890253ffbf4b7276ad3" }, - "version": "2.10.1" + "version": "2.11.0" }, "com.google.errorprone:error_prone_annotations": { "shasums": { @@ -45,6 +146,20 @@ }, "version": "9999.0-empty-to-avoid-conflict-with-guava" }, + "com.google.http-client:google-http-client": { + "shasums": { + "jar": "8340bbaf4410bd25921842e424cac3db9c916fdf47adfe73b8cba8dba7a06103", + "sources": "638c13eeffbef4bdb551d705f32885cb87247fa41d2e59754d05b131550a7681" + }, + "version": "1.45.0" + }, + "com.google.http-client:google-http-client-gson": { + "shasums": { + "jar": "44dc1da1b7914fe7df306ac79e8c04d879cbfcb2e6afc8eb106ecf0be9dce96e", + "sources": "faebaf26ab46243ad007fa4c9f569bc5f301dca615f3e58ede2d5aebdbd11852" + }, + "version": "1.45.0" + }, "com.google.j2objc:j2objc-annotations": { "shasums": { "jar": "88241573467ddca44ffd4d74aa04c2bbfd11bf7c17e0c342c94c9de7a70a7c64", @@ -52,6 +167,48 @@ }, "version": "3.0.0" }, + "com.google.protobuf:protobuf-java": { + "shasums": { + "jar": "8540247fad9e06baefa8fb45eb313802d019f485f14300e0f9d6b556ed88e753", + "sources": "d686e802329e42954e72e9b3b148b67eeb4f6f3ed327abc4508b79fda4937c3b" + }, + "version": "3.25.5" + }, + "com.google.protobuf:protobuf-java-util": { + "shasums": { + "jar": "dacc58b2c3d2fa8d4bddc1acb881e78d6cf7c137dd78bc1d67f6aca732436a8d", + "sources": "db5bda981edcda1fd4d60bf4cc7dca9ab144f6b880233fd4d1582fd0065f232c" + }, + "version": "3.25.5" + }, + "com.google.re2j:re2j": { + "shasums": { + "jar": "4f657af51ab8bb0909bcc3eb40862d26125af8cbcf92aaaba595fed77f947bc0", + "sources": "ddc3b47bb1e556ac4c0d02c9d8ff18f3260198b76b720567a70eed0a03d3fed6" + }, + "version": "1.7" + }, + "com.squareup.okhttp3:okhttp": { + "shasums": { + "jar": "b1050081b14bb7a3a7e55a4d3ef01b5dcfabc453b4573a4fc019767191d5f4e0", + "sources": "d91a769a4140e542cddbac4e67fcf279299614e8bfd53bd23b85e60c2861341c" + }, + "version": "4.12.0" + }, + "com.squareup.okio:okio": { + "shasums": { + "jar": "8e63292e5c53bb93c4a6b0c213e79f15990fed250c1340f1c343880e1c9c39b5", + "sources": "64d5b6667f064511dd93100173f735b2d5052a1c926858f4b6a05b84e825ef94" + }, + "version": "3.6.0" + }, + "com.squareup.okio:okio-jvm": { + "shasums": { + "jar": "67543f0736fc422ae927ed0e504b98bc5e269fda0d3500579337cb713da28412", + "sources": "870a42a7b468af8fd24d67b7b62e5861aab398c56f15a80b10642e7001564e2f" + }, + "version": "3.6.0" + }, "com.uber.nullaway:nullaway": { "shasums": { "jar": "38327fd62ceb0683881d68ee7bf97598133f0287f3c670416f50f85cf8ef418b", @@ -61,10 +218,10 @@ }, "commons-codec:commons-codec": { "shasums": { - "jar": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d", - "sources": "901cb5d1f7c2877017c95d3c5efd5a497738d0162ef72cdf58e9cb13f50b2e9c" + "jar": "f9f6cb103f2ddc3c99a9d80ada2ae7bf0685111fd6bffccb72033d1da4e6ff23", + "sources": "2283aff7f425dff23ebdb7a8fc0f03ae21b4ced7a43aacba47cedae126dc5d4a" }, - "version": "1.11" + "version": "1.17.1" }, "commons-logging:commons-logging": { "shasums": { @@ -80,6 +237,111 @@ }, "version": "2.4.0" }, + "io.grpc:grpc-alts": { + "shasums": { + "jar": "91bf6e78af5d0edae98857a798e47aa0789159774009a64125d46def9aabcbf8", + "sources": "b68f9c241d7786c88472a95e31547b8553832ad8e5d54a5a3699e45cdc598bf9" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-api": { + "shasums": { + "jar": "b5120a11da5ce5ddfab019bbb69f5868529c9b5def1ba5b283251cc95fb3ba91", + "sources": "3e4b31496f2c8b7cd51b425af767c72d44b38fdbb56a6e8c247acb8a721c4e8c" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-auth": { + "shasums": { + "jar": "f686aa689d39175e6ef6cf3dc207df43552653fed7912cfb6c2d31866349d28b", + "sources": "472a101cd3c3aeac559d7cf4a43bb5c3cbee02a7531883844c2108d30ef1f366" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-context": { + "shasums": { + "jar": "45f85a394466f963f1f7a5c5555e6dda35efd05ce1c687203a217d7048f6f089", + "sources": "31d4fc1054b5c0bc75924e82ca425dcf624f895e7525da900b94cfa87a2bea53" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-core": { + "shasums": { + "jar": "a8dd684c322ba8a86a95b2653fa4106c918a56edd863e45aaf63839d6a6ea082", + "sources": "38838e62fbc22a78d40f4214da2e638f60d32e3b67ff7daab35d619d7538beb0" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-googleapis": { + "shasums": { + "jar": "20359d482402ea24de696b94ee27293d3af746fec9dbb479b88d750c57c2397b", + "sources": "e2e87539687f2d790e154c6204d7409d6f29a42674e21f4c9b7c4991620305bd" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-grpclb": { + "shasums": { + "jar": "13a2f7d7c50ef4dc5f3744c0f75341b0c64a2a6dcb2449f8a2089c5ed013751d", + "sources": "488540b83dbb7865de7ae778edbf062cbafbb61e6bbf4b13fd86a4890cefb0e2" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-inprocess": { + "shasums": { + "jar": "11d3649382bf7780a868e129965b929bdb6efcc3de2ef6f629141e79a0366b53", + "sources": "327f4e93e1dd92fd4d1920ee26adfb95f8867374b2fa728332a86c8c78f1ae84" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-netty-shaded": { + "shasums": { + "jar": "de6fd10fef856dbb83ecbd0baee5313a274bb8202adca01091161024e25fd1dc", + "sources": "31d4fc1054b5c0bc75924e82ca425dcf624f895e7525da900b94cfa87a2bea53" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-protobuf": { + "shasums": { + "jar": "79704cf169ee27151fce4375a4d91fe828d276d921eef5a7f497d020b0a5d345", + "sources": "dafd411f98051013a6f37b9f60f9f25e4bdb9a69644f7eec64dd0fbfedc8dd0c" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-protobuf-lite": { + "shasums": { + "jar": "60e92e148b4f86c06885afa79a86beb74bffcdcba47f8b65dc7010ba6701fa80", + "sources": "ae4dfe070f6832dfdce73c3ea093b68165c851d879f9185c55e741b98fef4042" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-services": { + "shasums": { + "jar": "2d3e6911bfec8a20af982a4c14d2bca5bdb1c079af250fb778bc71950c611c15", + "sources": "062e07eb635df35fbb84e98e1dc5bec44dbe7c224b73a37a2de483f41fabc254" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-stub": { + "shasums": { + "jar": "7c4090509cd6ea0432305f9397da21127b691905bdcf163a306bedb1c6f4ead7", + "sources": "4d4046adfc05f2d738cf67fd95275e59c3def5aa77d99596393b9d7d34fc29b1" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-util": { + "shasums": { + "jar": "a97484519d75a6f530b95eab7723318752b2c5febca11fc9141dd78bd09e7eda", + "sources": "516a0590c868c8c46175acdd4a01c7f5d42b12aafacb9aefeb195fa935d9442c" + }, + "version": "1.68.0" + }, + "io.grpc:grpc-xds": { + "shasums": { + "jar": "bcfabb73ba1ab3ea44283c88ed0c8fcdcaa9bdbd54b8fb0cd9faa19388a47f9d", + "sources": "5d3c2392eada53d3fd6b7ff167f2e66ed18b8d616477cd84842e501bbb9a338f" + }, + "version": "1.68.0" + }, "io.netty:netty-all": { "shasums": { "jar": "230fdaa7d53002efb7dc08d4666a999b488858671eaa04357326b66e50b5c0e9", @@ -301,6 +563,132 @@ }, "version": "4.1.116.Final" }, + "io.opencensus:opencensus-api": { + "shasums": { + "jar": "f1474d47f4b6b001558ad27b952e35eda5cc7146788877fc52938c6eba24b382", + "sources": "6748d57aaae81995514ad3e2fb11a95aa88e158b3f93450288018eaccf31e86b" + }, + "version": "0.31.1" + }, + "io.opencensus:opencensus-contrib-http-util": { + "shasums": { + "jar": "3ea995b55a4068be22989b70cc29a4d788c2d328d1d50613a7a9afd13fdd2d0a", + "sources": "d55afd5f96dc724bd903a77a38b0a344d0e59f02a64b9ab2f32618bc582ea924" + }, + "version": "0.31.1" + }, + "io.opentelemetry.semconv:opentelemetry-semconv": { + "shasums": { + "jar": "e8ab86e93cef09e421a6213f4cf18421fcc6e1f9cf0ab94b9a31ed4460ddf553", + "sources": "b0588ae0617071c30451fe0f4916b2cde7aa8d24b542ee696a7bf59f7d7f46a8" + }, + "version": "1.28.0-alpha" + }, + "io.opentelemetry:opentelemetry-api": { + "shasums": { + "jar": "097e2e71c8b8c813f4a13176baafbbbb124b1253f5c9fffd110bc2add74ace93", + "sources": "0d9d8c1391c2a8a79ebcb013f38c172ad4cbef6b52e690501e8cb55effabc9da" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-api-incubator": { + "shasums": { + "jar": "8dbf451ce580fa0252ee9ca77331fd21710710ca9b735a1359241ead3be8ebe5", + "sources": "400ee017921af6a987de5ca9aabd2afbd2989c1f3c9eaedc4f1ff8299eace6c1" + }, + "version": "1.44.1-alpha" + }, + "io.opentelemetry:opentelemetry-context": { + "shasums": { + "jar": "006b3f7c3880356a86f02c40eedeba124f226a2f145fe904cc1b7def0088bab0", + "sources": "50f136587f0d1bf317fbfdd9cf5f589a321d7fd366e3cbea1dc511e458115324" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-exporter-common": { + "shasums": { + "jar": "259b65adc1e8969804b4232529bd52cbaaabf86049c404f25bce35898023696b", + "sources": "160c784b8d35721b7eee04e6e06e7bdccc2cee512e648e0509c99ab0efbbe09d" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-exporter-otlp": { + "shasums": { + "jar": "9384faa831f082dd10ca4b09eb1906fa2cdd8a8a0fdbfca56ebb4fb4d6e205ec", + "sources": "03d8e56a41bf49674ea3679d6360e0f16cfee4e7ea2c035fc9bcc81108482688" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-exporter-otlp-common": { + "shasums": { + "jar": "589385cede8e974a092753d7bafbc5afd26e8eaad970e975fb51106557bdae41", + "sources": "b1b1b8c29eb3e119fc5cd909e1d309b75190f53724b872eaffa7229458309818" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-exporter-sender-okhttp": { + "shasums": { + "jar": "7b4eaef47b9bae37cc2b6ca9975defd1d49a7de8b4a31fc2dffd582f09d8dac8", + "sources": "80908010581be389fb32c6388f7bb7ab3aed6a27b9e910a1805bbd7605495db3" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-sdk": { + "shasums": { + "jar": "7c64f330ec197a1eb88059b97dc9376fdb9836695027c96a0cb4e74ef917cebe", + "sources": "567caff6fe790a8eef0195c712368c13bae2f5d69ebf51bf3f5393166be43e11" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-sdk-common": { + "shasums": { + "jar": "3770fc477ee0fab21e796bb559f0a996d38c744f3a170868d1b3b85b63b827d0", + "sources": "e1801125d48e0ba0cb016db0cea3445aaec57c322e6765ac788e3f9b959a3ec1" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi": { + "shasums": { + "jar": "f3478af96e4f2f5fd60283522553de4ce99c03606a16e460d07bc6eee12f9f95", + "sources": "46b251d7737595cf49cfb2f3bae905951efc4cf78085ba02c625f7fed781b89f" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-sdk-logs": { + "shasums": { + "jar": "ba4a97966ded2927dcaae6e91bf0a1707867e44cc3dd2ae4c7ef8214bdf8daf7", + "sources": "f6c63d81b3189fe1a76a712f4eff11b60300c093ce4d65ad73fee5b811648ca6" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-sdk-metrics": { + "shasums": { + "jar": "3c09668a96f1e9443d2894ae456674c8c38b221c096c391fc81616daa672bf68", + "sources": "afe4b9c4cb2328bb2180cf4bc280293191eb3ab8b4165ab725bab9e73a194a1b" + }, + "version": "1.44.1" + }, + "io.opentelemetry:opentelemetry-sdk-trace": { + "shasums": { + "jar": "ff013ab945567dccb5dde638f7a366519defbd2d138df1370936e847ef608c87", + "sources": "24f7b867a0f2f3203e4eb2069137bbd01936e7df7d08d3ec2dfcad478444ae27" + }, + "version": "1.44.1" + }, + "io.perfmark:perfmark-api": { + "shasums": { + "jar": "c7b478503ec524e55df19b424d46d27c8a68aeb801664fadd4f069b71f52d0f6", + "sources": "311551ab29cf51e5a8abee6a019e88dee47d1ea71deb9fcd3649db9c51b237bc" + }, + "version": "0.27.0" + }, + "javax.annotation:javax.annotation-api": { + "shasums": { + "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", + "sources": "128971e52e0d84a66e3b6e049dab8ad7b2c58b7e1ad37fa2debd3d40c2947b95" + }, + "version": "1.3.2" + }, "net.bytebuddy:byte-buddy": { "shasums": { "jar": "7472e3961992c12a9fd4f6d67c21de4280abe18f292704dd49d7338289f8acf5", @@ -345,10 +733,10 @@ }, "org.checkerframework:checker-qual": { "shasums": { - "jar": "3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6", - "sources": "d6bdee58964cd05aabfca4e44947d3cbdada6bf617ed618b62b3b0d5a21de339" + "jar": "9840a77c175a95a60c66da8f506871a907a6c4fc8a703bef38c715bc6d4de626", + "sources": "3b6277f0186e31f775c205cfe165f0fe98995e83108b15314e7a4cb93e3f9c96" }, - "version": "3.43.0" + "version": "3.47.0" }, "org.checkerframework:dataflow-nullaway": { "shasums": { @@ -357,6 +745,55 @@ }, "version": "3.26.0" }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "shasums": { + "jar": "c720e6e5bcbe6b2f48ded75a47bccdb763eede79d14330102e0d352e3d89ed92", + "sources": "4270ce5531ed0f12e4234e08f240ef3b45ee3ceeb16e28d44abc61c12cf522ca" + }, + "version": "1.24" + }, + "org.conscrypt:conscrypt-openjdk-uber": { + "shasums": { + "jar": "eaf537d98e033d0f0451cd1b8cc74e02d7b55ec882da63c88060d806ba89c348", + "sources": "aa1d02e65351e202e83ece0614bce1022aa1da6e77313ef7c7663ab45fa9e3a5" + }, + "version": "2.5.2" + }, + "org.jetbrains.kotlin:kotlin-stdlib": { + "shasums": { + "jar": "55e989c512b80907799f854309f3bc7782c5b3d13932442d0379d5c472711504", + "sources": "4dad0d6fe62c142313e09e3b693c9dccc6bf9dc7a56a37c91be9edb7de0cf45b" + }, + "version": "1.9.10" + }, + "org.jetbrains.kotlin:kotlin-stdlib-common": { + "shasums": { + "jar": "cde3341ba18a2ba262b0b7cf6c55b20c90e8d434e42c9a13e6a3f770db965a88", + "sources": "63f2b6dfd58e3e1c82a4b37a2e1743996ca182bf44dc2aadd264b8fb95fddcd3" + }, + "version": "1.9.10" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": { + "shasums": { + "jar": "ac6361bf9ad1ed382c2103d9712c47cdec166232b4903ed596e8876b0681c9b7", + "sources": "ea10d3e5e6e695d8a5283cbf116321acae6ba42d0bdd3eda50f7c34a26fa25cb" + }, + "version": "1.9.10" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": { + "shasums": { + "jar": "a4c74d94d64ce1abe53760fe0389dd941f6fc558d0dab35e47c085a11ec80f28", + "sources": "40e9a80f6b953d12389623760d438e69914098d0c4d7053f70f90533ec041259" + }, + "version": "1.9.10" + }, + "org.jetbrains:annotations": { + "shasums": { + "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", + "sources": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e" + }, + "version": "13.0" + }, "org.mockito:mockito-core": { "shasums": { "jar": "4a2eb29237050da749e90a46f948bce7e26ec22b671e41f59b1ac6f4b6408229", @@ -384,9 +821,139 @@ "sources": "8bd6a94a7f610ea9f0180f8b6832bd8b4398f123bea8ad8febe00c36c49e1d1e" }, "version": "2.0.13" + }, + "org.threeten:threetenbp": { + "shasums": { + "jar": "857917d2319a4e92dc1c5e3aeb75a0dac84445ed315e7ac3d82bb8d2b298977f", + "sources": "b4d3602a948a10ea275991d4144c3cbbd9b9000bd3b58dfc7b74b240688ca4a9" + }, + "version": "1.7.0" } }, "dependencies": { + "com.google.api.grpc:proto-google-cloud-monitoring-v3": [ + "com.google.auto.value:auto-value-annotations", + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:failureaccess", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "javax.annotation:javax.annotation-api", + "org.checkerframework:checker-qual" + ], + "com.google.api.grpc:proto-google-common-protos": [ + "com.google.protobuf:protobuf-java" + ], + "com.google.api.grpc:proto-google-iam-v1": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java" + ], + "com.google.api:api-common": [ + "com.google.auto.value:auto-value-annotations", + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.j2objc:j2objc-annotations", + "javax.annotation:javax.annotation-api" + ], + "com.google.api:gax": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.api:api-common", + "com.google.auth:google-auth-library-credentials", + "com.google.auth:google-auth-library-oauth2-http", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java", + "io.opencensus:opencensus-api", + "org.threeten:threetenbp" + ], + "com.google.auth:google-auth-library-oauth2-http": [ + "com.google.auth:google-auth-library-credentials", + "com.google.auto.value:auto-value-annotations", + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.http-client:google-http-client", + "com.google.http-client:google-http-client-gson" + ], + "com.google.cloud.opentelemetry:exporter-metrics": [ + "com.google.auto.value:auto-value-annotations", + "com.google.cloud.opentelemetry:shared-resourcemapping", + "com.google.cloud:google-cloud-core", + "com.google.cloud:google-cloud-monitoring", + "io.opentelemetry.semconv:opentelemetry-semconv", + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-sdk-metrics", + "org.slf4j:slf4j-api" + ], + "com.google.cloud:google-cloud-core": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.api.grpc:proto-google-iam-v1", + "com.google.api:api-common", + "com.google.api:gax", + "com.google.auth:google-auth-library-credentials", + "com.google.auth:google-auth-library-oauth2-http", + "com.google.auto.value:auto-value-annotations", + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.http-client:google-http-client", + "com.google.http-client:google-http-client-gson", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", + "org.threeten:threetenbp" + ], + "com.google.cloud:google-cloud-monitoring": [ + "com.google.android:annotations", + "com.google.api.grpc:proto-google-cloud-monitoring-v3", + "com.google.api.grpc:proto-google-common-protos", + "com.google.api:api-common", + "com.google.api:gax", + "com.google.api:gax-grpc", + "com.google.auth:google-auth-library-credentials", + "com.google.auth:google-auth-library-oauth2-http", + "com.google.auto.value:auto-value-annotations", + "com.google.code.findbugs:jsr305", + "com.google.code.gson:gson", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:failureaccess", + "com.google.guava:guava", + "com.google.guava:listenablefuture", + "com.google.http-client:google-http-client", + "com.google.http-client:google-http-client-gson", + "com.google.j2objc:j2objc-annotations", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", + "com.google.re2j:re2j", + "commons-codec:commons-codec", + "io.grpc:grpc-alts", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-context", + "io.grpc:grpc-core", + "io.grpc:grpc-googleapis", + "io.grpc:grpc-grpclb", + "io.grpc:grpc-inprocess", + "io.grpc:grpc-netty-shaded", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub", + "io.grpc:grpc-util", + "io.grpc:grpc-xds", + "io.opencensus:opencensus-api", + "io.opencensus:opencensus-contrib-http-util", + "io.perfmark:perfmark-api", + "javax.annotation:javax.annotation-api", + "org.apache.httpcomponents:httpclient", + "org.apache.httpcomponents:httpcore", + "org.checkerframework:checker-qual", + "org.codehaus.mojo:animal-sniffer-annotations", + "org.conscrypt:conscrypt-openjdk-uber", + "org.threeten:threetenbp" + ], + "com.google.code.gson:gson": [ + "com.google.errorprone:error_prone_annotations" + ], "com.google.guava:guava": [ "com.google.errorprone:error_prone_annotations", "com.google.guava:failureaccess", @@ -394,6 +961,40 @@ "com.google.j2objc:j2objc-annotations", "org.checkerframework:checker-qual" ], + "com.google.http-client:google-http-client": [ + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.j2objc:j2objc-annotations", + "io.grpc:grpc-context", + "io.opencensus:opencensus-api", + "io.opencensus:opencensus-contrib-http-util", + "org.apache.httpcomponents:httpclient", + "org.apache.httpcomponents:httpcore" + ], + "com.google.http-client:google-http-client-gson": [ + "com.google.code.gson:gson", + "com.google.http-client:google-http-client" + ], + "com.google.protobuf:protobuf-java-util": [ + "com.google.code.findbugs:jsr305", + "com.google.code.gson:gson", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.j2objc:j2objc-annotations", + "com.google.protobuf:protobuf-java" + ], + "com.squareup.okhttp3:okhttp": [ + "com.squareup.okio:okio", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.squareup.okio:okio": [ + "com.squareup.okio:okio-jvm" + ], + "com.squareup.okio:okio-jvm": [ + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], "com.uber.nullaway:nullaway": [ "com.google.guava:guava", "org.checkerframework:dataflow-nullaway" @@ -404,6 +1005,9 @@ "org.apache.commons:commons-lang3", "org.slf4j:slf4j-api" ], + "io.grpc:grpc-context": [ + "io.grpc:grpc-api" + ], "io.netty:netty-all": [ "io.netty:netty-buffer", "io.netty:netty-codec", @@ -549,6 +1153,68 @@ "io.netty:netty-common", "io.netty:netty-transport" ], + "io.opencensus:opencensus-api": [ + "io.grpc:grpc-context" + ], + "io.opencensus:opencensus-contrib-http-util": [ + "com.google.guava:guava", + "io.opencensus:opencensus-api" + ], + "io.opentelemetry:opentelemetry-api": [ + "io.opentelemetry:opentelemetry-context" + ], + "io.opentelemetry:opentelemetry-api-incubator": [ + "io.opentelemetry:opentelemetry-api" + ], + "io.opentelemetry:opentelemetry-exporter-common": [ + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi" + ], + "io.opentelemetry:opentelemetry-exporter-otlp": [ + "io.opentelemetry:opentelemetry-exporter-otlp-common", + "io.opentelemetry:opentelemetry-exporter-sender-okhttp", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi", + "io.opentelemetry:opentelemetry-sdk-logs", + "io.opentelemetry:opentelemetry-sdk-metrics", + "io.opentelemetry:opentelemetry-sdk-trace" + ], + "io.opentelemetry:opentelemetry-exporter-otlp-common": [ + "io.opentelemetry:opentelemetry-api-incubator", + "io.opentelemetry:opentelemetry-exporter-common" + ], + "io.opentelemetry:opentelemetry-exporter-sender-okhttp": [ + "com.squareup.okhttp3:okhttp", + "io.opentelemetry:opentelemetry-exporter-common", + "io.opentelemetry:opentelemetry-sdk-common" + ], + "io.opentelemetry:opentelemetry-sdk": [ + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-sdk-common", + "io.opentelemetry:opentelemetry-sdk-logs", + "io.opentelemetry:opentelemetry-sdk-metrics", + "io.opentelemetry:opentelemetry-sdk-trace" + ], + "io.opentelemetry:opentelemetry-sdk-common": [ + "io.opentelemetry:opentelemetry-api" + ], + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi": [ + "io.opentelemetry:opentelemetry-sdk" + ], + "io.opentelemetry:opentelemetry-sdk-logs": [ + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-api-incubator", + "io.opentelemetry:opentelemetry-sdk-common" + ], + "io.opentelemetry:opentelemetry-sdk-metrics": [ + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-api-incubator", + "io.opentelemetry:opentelemetry-sdk-common" + ], + "io.opentelemetry:opentelemetry-sdk-trace": [ + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-api-incubator", + "io.opentelemetry:opentelemetry-sdk-common" + ], "org.apache.httpcomponents:httpclient": [ "commons-codec:commons-codec", "commons-logging:commons-logging", @@ -557,6 +1223,17 @@ "org.assertj:assertj-core": [ "net.bytebuddy:byte-buddy" ], + "org.jetbrains.kotlin:kotlin-stdlib": [ + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains:annotations" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + ], "org.mockito:mockito-core": [ "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", @@ -571,6 +1248,83 @@ "io.netty:netty-all:jar:sources" ], "packages": { + "com.google.android:annotations": [ + "android.annotation" + ], + "com.google.api.grpc:proto-google-cloud-monitoring-v3": [ + "com.google.monitoring.v3" + ], + "com.google.api.grpc:proto-google-common-protos": [ + "com.google.api", + "com.google.apps.card.v1", + "com.google.cloud", + "com.google.cloud.audit", + "com.google.cloud.location", + "com.google.geo.type", + "com.google.logging.type", + "com.google.longrunning", + "com.google.rpc", + "com.google.rpc.context", + "com.google.shopping.type", + "com.google.type" + ], + "com.google.api.grpc:proto-google-iam-v1": [ + "com.google.iam.v1", + "com.google.iam.v1.logging" + ], + "com.google.api:api-common": [ + "com.google.api.core", + "com.google.api.pathtemplate", + "com.google.api.resourcenames" + ], + "com.google.api:gax": [ + "com.google.api.gax.batching", + "com.google.api.gax.core", + "com.google.api.gax.longrunning", + "com.google.api.gax.nativeimage", + "com.google.api.gax.paging", + "com.google.api.gax.retrying", + "com.google.api.gax.rpc", + "com.google.api.gax.rpc.internal", + "com.google.api.gax.rpc.mtls", + "com.google.api.gax.tracing", + "com.google.api.gax.util" + ], + "com.google.api:gax-grpc": [ + "com.google.api.gax.grpc", + "com.google.api.gax.grpc.nativeimage", + "com.google.longrunning", + "com.google.longrunning.stub" + ], + "com.google.auth:google-auth-library-credentials": [ + "com.google.auth" + ], + "com.google.auth:google-auth-library-oauth2-http": [ + "com.google.auth.http", + "com.google.auth.oauth2" + ], + "com.google.auto.value:auto-value-annotations": [ + "com.google.auto.value", + "com.google.auto.value.extension.memoized", + "com.google.auto.value.extension.serializable", + "com.google.auto.value.extension.toprettystring" + ], + "com.google.cloud.opentelemetry:exporter-metrics": [ + "com.google.cloud.opentelemetry.metric" + ], + "com.google.cloud.opentelemetry:shared-resourcemapping": [ + "com.google.cloud.opentelemetry.resource", + "com.google.cloud.opentelemetry.shadow.semconv" + ], + "com.google.cloud:google-cloud-core": [ + "com.google.cloud", + "com.google.cloud.spi", + "com.google.cloud.testing" + ], + "com.google.cloud:google-cloud-monitoring": [ + "com.google.cloud.monitoring.v3", + "com.google.cloud.monitoring.v3.stub" + ], "com.google.code.findbugs:jsr305": [ "javax.annotation", "javax.annotation.concurrent", @@ -614,9 +1368,63 @@ "com.google.common.xml", "com.google.thirdparty.publicsuffix" ], + "com.google.http-client:google-http-client": [ + "com.google.api.client.http", + "com.google.api.client.http.apache", + "com.google.api.client.http.javanet", + "com.google.api.client.http.json", + "com.google.api.client.json", + "com.google.api.client.json.rpc2", + "com.google.api.client.json.webtoken", + "com.google.api.client.testing.http", + "com.google.api.client.testing.http.apache", + "com.google.api.client.testing.http.javanet", + "com.google.api.client.testing.json", + "com.google.api.client.testing.json.webtoken", + "com.google.api.client.testing.util", + "com.google.api.client.util", + "com.google.api.client.util.escape", + "com.google.api.client.util.store" + ], + "com.google.http-client:google-http-client-gson": [ + "com.google.api.client.json.gson" + ], "com.google.j2objc:j2objc-annotations": [ "com.google.j2objc.annotations" ], + "com.google.protobuf:protobuf-java": [ + "com.google.protobuf", + "com.google.protobuf.compiler" + ], + "com.google.protobuf:protobuf-java-util": [ + "com.google.protobuf.util" + ], + "com.google.re2j:re2j": [ + "com.google.re2j" + ], + "com.squareup.okhttp3:okhttp": [ + "okhttp3", + "okhttp3.internal", + "okhttp3.internal.authenticator", + "okhttp3.internal.cache", + "okhttp3.internal.cache2", + "okhttp3.internal.concurrent", + "okhttp3.internal.connection", + "okhttp3.internal.http", + "okhttp3.internal.http1", + "okhttp3.internal.http2", + "okhttp3.internal.io", + "okhttp3.internal.platform", + "okhttp3.internal.platform.android", + "okhttp3.internal.proxy", + "okhttp3.internal.publicsuffix", + "okhttp3.internal.tls", + "okhttp3.internal.ws" + ], + "com.squareup.okio:okio-jvm": [ + "okio", + "okio.internal" + ], "com.uber.nullaway:nullaway": [ "com.uber.nullaway", "com.uber.nullaway.annotations", @@ -650,6 +1458,178 @@ "org.littleshoot.proxy.extras", "org.littleshoot.proxy.impl" ], + "io.grpc:grpc-alts": [ + "io.grpc.alts", + "io.grpc.alts.internal" + ], + "io.grpc:grpc-api": [ + "io.grpc" + ], + "io.grpc:grpc-auth": [ + "io.grpc.auth" + ], + "io.grpc:grpc-core": [ + "io.grpc.internal" + ], + "io.grpc:grpc-googleapis": [ + "io.grpc.googleapis" + ], + "io.grpc:grpc-grpclb": [ + "io.grpc.grpclb", + "io.grpc.lb.v1" + ], + "io.grpc:grpc-inprocess": [ + "io.grpc.inprocess" + ], + "io.grpc:grpc-netty-shaded": [ + "io.grpc.netty.shaded.io.grpc.netty", + "io.grpc.netty.shaded.io.netty.bootstrap", + "io.grpc.netty.shaded.io.netty.buffer", + "io.grpc.netty.shaded.io.netty.buffer.search", + "io.grpc.netty.shaded.io.netty.channel", + "io.grpc.netty.shaded.io.netty.channel.embedded", + "io.grpc.netty.shaded.io.netty.channel.epoll", + "io.grpc.netty.shaded.io.netty.channel.group", + "io.grpc.netty.shaded.io.netty.channel.internal", + "io.grpc.netty.shaded.io.netty.channel.local", + "io.grpc.netty.shaded.io.netty.channel.nio", + "io.grpc.netty.shaded.io.netty.channel.oio", + "io.grpc.netty.shaded.io.netty.channel.pool", + "io.grpc.netty.shaded.io.netty.channel.socket", + "io.grpc.netty.shaded.io.netty.channel.socket.nio", + "io.grpc.netty.shaded.io.netty.channel.socket.oio", + "io.grpc.netty.shaded.io.netty.channel.unix", + "io.grpc.netty.shaded.io.netty.handler.address", + "io.grpc.netty.shaded.io.netty.handler.codec", + "io.grpc.netty.shaded.io.netty.handler.codec.base64", + "io.grpc.netty.shaded.io.netty.handler.codec.bytes", + "io.grpc.netty.shaded.io.netty.handler.codec.compression", + "io.grpc.netty.shaded.io.netty.handler.codec.http", + "io.grpc.netty.shaded.io.netty.handler.codec.http.cookie", + "io.grpc.netty.shaded.io.netty.handler.codec.http.cors", + "io.grpc.netty.shaded.io.netty.handler.codec.http.multipart", + "io.grpc.netty.shaded.io.netty.handler.codec.http.websocketx", + "io.grpc.netty.shaded.io.netty.handler.codec.http.websocketx.extensions", + "io.grpc.netty.shaded.io.netty.handler.codec.http.websocketx.extensions.compression", + "io.grpc.netty.shaded.io.netty.handler.codec.http2", + "io.grpc.netty.shaded.io.netty.handler.codec.json", + "io.grpc.netty.shaded.io.netty.handler.codec.marshalling", + "io.grpc.netty.shaded.io.netty.handler.codec.protobuf", + "io.grpc.netty.shaded.io.netty.handler.codec.rtsp", + "io.grpc.netty.shaded.io.netty.handler.codec.serialization", + "io.grpc.netty.shaded.io.netty.handler.codec.socks", + "io.grpc.netty.shaded.io.netty.handler.codec.socksx", + "io.grpc.netty.shaded.io.netty.handler.codec.socksx.v4", + "io.grpc.netty.shaded.io.netty.handler.codec.socksx.v5", + "io.grpc.netty.shaded.io.netty.handler.codec.spdy", + "io.grpc.netty.shaded.io.netty.handler.codec.string", + "io.grpc.netty.shaded.io.netty.handler.codec.xml", + "io.grpc.netty.shaded.io.netty.handler.flow", + "io.grpc.netty.shaded.io.netty.handler.flush", + "io.grpc.netty.shaded.io.netty.handler.ipfilter", + "io.grpc.netty.shaded.io.netty.handler.logging", + "io.grpc.netty.shaded.io.netty.handler.pcap", + "io.grpc.netty.shaded.io.netty.handler.proxy", + "io.grpc.netty.shaded.io.netty.handler.ssl", + "io.grpc.netty.shaded.io.netty.handler.ssl.ocsp", + "io.grpc.netty.shaded.io.netty.handler.ssl.util", + "io.grpc.netty.shaded.io.netty.handler.stream", + "io.grpc.netty.shaded.io.netty.handler.timeout", + "io.grpc.netty.shaded.io.netty.handler.traffic", + "io.grpc.netty.shaded.io.netty.internal.tcnative", + "io.grpc.netty.shaded.io.netty.resolver", + "io.grpc.netty.shaded.io.netty.util", + "io.grpc.netty.shaded.io.netty.util.collection", + "io.grpc.netty.shaded.io.netty.util.concurrent", + "io.grpc.netty.shaded.io.netty.util.internal", + "io.grpc.netty.shaded.io.netty.util.internal.logging", + "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues", + "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.atomic", + "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.util", + "io.grpc.netty.shaded.io.netty.util.internal.svm" + ], + "io.grpc:grpc-protobuf": [ + "io.grpc.protobuf" + ], + "io.grpc:grpc-protobuf-lite": [ + "io.grpc.protobuf.lite" + ], + "io.grpc:grpc-services": [ + "io.grpc.binarylog.v1", + "io.grpc.channelz.v1", + "io.grpc.health.v1", + "io.grpc.protobuf.services", + "io.grpc.protobuf.services.internal", + "io.grpc.reflection.v1", + "io.grpc.reflection.v1alpha", + "io.grpc.services" + ], + "io.grpc:grpc-stub": [ + "io.grpc.stub", + "io.grpc.stub.annotations" + ], + "io.grpc:grpc-util": [ + "io.grpc.util" + ], + "io.grpc:grpc-xds": [ + "io.grpc.xds", + "io.grpc.xds.client", + "io.grpc.xds.internal", + "io.grpc.xds.internal.rbac.engine", + "io.grpc.xds.internal.security", + "io.grpc.xds.internal.security.certprovider", + "io.grpc.xds.internal.security.trust", + "io.grpc.xds.orca", + "io.grpc.xds.shaded.com.github.udpa.udpa.type.v1", + "io.grpc.xds.shaded.com.github.xds.core.v3", + "io.grpc.xds.shaded.com.github.xds.data.orca.v3", + "io.grpc.xds.shaded.com.github.xds.service.orca.v3", + "io.grpc.xds.shaded.com.github.xds.type.matcher.v3", + "io.grpc.xds.shaded.com.github.xds.type.v3", + "io.grpc.xds.shaded.com.google.api.expr.v1alpha1", + "io.grpc.xds.shaded.dev.cel.expr", + "io.grpc.xds.shaded.envoy.annotations", + "io.grpc.xds.shaded.io.envoyproxy.envoy.admin.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.accesslog.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.bootstrap.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.cluster.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.endpoint.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.metrics.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.overload.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.rbac.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.config.trace.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.data.accesslog.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.clusters.aggregate.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.common.fault.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.http.fault.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.http.rate_limit_quota.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.http.rbac.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.http.router.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.common.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.least_request.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.pick_first.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.ring_hash.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.round_robin.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.load_balancing_policies.wrr_locality.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.transport_sockets.tls.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.service.discovery.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.service.load_stats.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.service.rate_limit_quota.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.service.status.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.type.http.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.type.matcher.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.type.metadata.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.type.tracing.v3", + "io.grpc.xds.shaded.io.envoyproxy.envoy.type.v3", + "io.grpc.xds.shaded.io.envoyproxy.pgv.validate", + "io.grpc.xds.shaded.udpa.annotations", + "io.grpc.xds.shaded.xds.annotations.v3" + ], "io.netty:netty-buffer": [ "io.netty.buffer", "io.netty.buffer.search" @@ -791,6 +1771,153 @@ "io.netty.channel.udt", "io.netty.channel.udt.nio" ], + "io.opencensus:opencensus-api": [ + "io.opencensus.common", + "io.opencensus.internal", + "io.opencensus.metrics", + "io.opencensus.metrics.data", + "io.opencensus.metrics.export", + "io.opencensus.resource", + "io.opencensus.stats", + "io.opencensus.tags", + "io.opencensus.tags.propagation", + "io.opencensus.tags.unsafe", + "io.opencensus.trace", + "io.opencensus.trace.config", + "io.opencensus.trace.export", + "io.opencensus.trace.internal", + "io.opencensus.trace.propagation", + "io.opencensus.trace.samplers", + "io.opencensus.trace.unsafe" + ], + "io.opencensus:opencensus-contrib-http-util": [ + "io.opencensus.contrib.http", + "io.opencensus.contrib.http.util" + ], + "io.opentelemetry.semconv:opentelemetry-semconv": [ + "io.opentelemetry.semconv" + ], + "io.opentelemetry:opentelemetry-api": [ + "io.opentelemetry.api", + "io.opentelemetry.api.baggage", + "io.opentelemetry.api.baggage.propagation", + "io.opentelemetry.api.common", + "io.opentelemetry.api.internal", + "io.opentelemetry.api.logs", + "io.opentelemetry.api.metrics", + "io.opentelemetry.api.trace", + "io.opentelemetry.api.trace.propagation", + "io.opentelemetry.api.trace.propagation.internal" + ], + "io.opentelemetry:opentelemetry-api-incubator": [ + "io.opentelemetry.api.incubator.events", + "io.opentelemetry.api.incubator.logs", + "io.opentelemetry.api.incubator.metrics", + "io.opentelemetry.api.incubator.propagation", + "io.opentelemetry.api.incubator.trace" + ], + "io.opentelemetry:opentelemetry-context": [ + "io.opentelemetry.context", + "io.opentelemetry.context.internal.shaded", + "io.opentelemetry.context.propagation" + ], + "io.opentelemetry:opentelemetry-exporter-common": [ + "io.opentelemetry.exporter.internal", + "io.opentelemetry.exporter.internal.auth", + "io.opentelemetry.exporter.internal.compression", + "io.opentelemetry.exporter.internal.grpc", + "io.opentelemetry.exporter.internal.http", + "io.opentelemetry.exporter.internal.marshal" + ], + "io.opentelemetry:opentelemetry-exporter-otlp": [ + "io.opentelemetry.exporter.otlp.all.internal", + "io.opentelemetry.exporter.otlp.http.logs", + "io.opentelemetry.exporter.otlp.http.metrics", + "io.opentelemetry.exporter.otlp.http.trace", + "io.opentelemetry.exporter.otlp.internal", + "io.opentelemetry.exporter.otlp.logs", + "io.opentelemetry.exporter.otlp.metrics", + "io.opentelemetry.exporter.otlp.trace" + ], + "io.opentelemetry:opentelemetry-exporter-otlp-common": [ + "io.opentelemetry.exporter.internal.otlp", + "io.opentelemetry.exporter.internal.otlp.logs", + "io.opentelemetry.exporter.internal.otlp.metrics", + "io.opentelemetry.exporter.internal.otlp.traces", + "io.opentelemetry.proto.collector.logs.v1.internal", + "io.opentelemetry.proto.collector.metrics.v1.internal", + "io.opentelemetry.proto.collector.profiles.v1experimental.internal", + "io.opentelemetry.proto.collector.trace.v1.internal", + "io.opentelemetry.proto.common.v1.internal", + "io.opentelemetry.proto.logs.v1.internal", + "io.opentelemetry.proto.metrics.v1.internal", + "io.opentelemetry.proto.profiles.v1experimental.internal", + "io.opentelemetry.proto.resource.v1.internal", + "io.opentelemetry.proto.trace.v1.internal" + ], + "io.opentelemetry:opentelemetry-exporter-sender-okhttp": [ + "io.opentelemetry.exporter.sender.okhttp.internal" + ], + "io.opentelemetry:opentelemetry-sdk": [ + "io.opentelemetry.sdk" + ], + "io.opentelemetry:opentelemetry-sdk-common": [ + "io.opentelemetry.sdk.common", + "io.opentelemetry.sdk.common.export", + "io.opentelemetry.sdk.common.internal", + "io.opentelemetry.sdk.internal", + "io.opentelemetry.sdk.resources" + ], + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi": [ + "io.opentelemetry.sdk.autoconfigure.spi", + "io.opentelemetry.sdk.autoconfigure.spi.internal", + "io.opentelemetry.sdk.autoconfigure.spi.logs", + "io.opentelemetry.sdk.autoconfigure.spi.metrics", + "io.opentelemetry.sdk.autoconfigure.spi.traces" + ], + "io.opentelemetry:opentelemetry-sdk-logs": [ + "io.opentelemetry.sdk.logs", + "io.opentelemetry.sdk.logs.data", + "io.opentelemetry.sdk.logs.export", + "io.opentelemetry.sdk.logs.internal" + ], + "io.opentelemetry:opentelemetry-sdk-metrics": [ + "io.opentelemetry.sdk.metrics", + "io.opentelemetry.sdk.metrics.data", + "io.opentelemetry.sdk.metrics.export", + "io.opentelemetry.sdk.metrics.internal", + "io.opentelemetry.sdk.metrics.internal.aggregator", + "io.opentelemetry.sdk.metrics.internal.concurrent", + "io.opentelemetry.sdk.metrics.internal.data", + "io.opentelemetry.sdk.metrics.internal.debug", + "io.opentelemetry.sdk.metrics.internal.descriptor", + "io.opentelemetry.sdk.metrics.internal.exemplar", + "io.opentelemetry.sdk.metrics.internal.export", + "io.opentelemetry.sdk.metrics.internal.state", + "io.opentelemetry.sdk.metrics.internal.view" + ], + "io.opentelemetry:opentelemetry-sdk-trace": [ + "io.opentelemetry.internal.shaded.jctools.counters", + "io.opentelemetry.internal.shaded.jctools.maps", + "io.opentelemetry.internal.shaded.jctools.queues", + "io.opentelemetry.internal.shaded.jctools.queues.atomic", + "io.opentelemetry.internal.shaded.jctools.queues.atomic.unpadded", + "io.opentelemetry.internal.shaded.jctools.queues.unpadded", + "io.opentelemetry.internal.shaded.jctools.util", + "io.opentelemetry.sdk.trace", + "io.opentelemetry.sdk.trace.data", + "io.opentelemetry.sdk.trace.export", + "io.opentelemetry.sdk.trace.internal", + "io.opentelemetry.sdk.trace.samplers" + ], + "io.perfmark:perfmark-api": [ + "io.perfmark" + ], + "javax.annotation:javax.annotation-api": [ + "javax.annotation", + "javax.annotation.security", + "javax.annotation.sql" + ], "net.bytebuddy:byte-buddy": [ "net.bytebuddy", "net.bytebuddy.agent.builder", @@ -946,6 +2073,7 @@ "org.checkerframework.checker.interning.qual", "org.checkerframework.checker.lock.qual", "org.checkerframework.checker.mustcall.qual", + "org.checkerframework.checker.nonempty.qual", "org.checkerframework.checker.nullness.qual", "org.checkerframework.checker.optional.qual", "org.checkerframework.checker.propkey.qual", @@ -1012,6 +2140,63 @@ "org.checkerframework.nullaway.org.plumelib.reflection", "org.checkerframework.nullaway.org.plumelib.util" ], + "org.codehaus.mojo:animal-sniffer-annotations": [ + "org.codehaus.mojo.animal_sniffer" + ], + "org.conscrypt:conscrypt-openjdk-uber": [ + "org.conscrypt", + "org.conscrypt.ct", + "org.conscrypt.io" + ], + "org.jetbrains.kotlin:kotlin-stdlib": [ + "kotlin", + "kotlin.annotation", + "kotlin.collections", + "kotlin.collections.builders", + "kotlin.collections.jdk8", + "kotlin.collections.unsigned", + "kotlin.comparisons", + "kotlin.concurrent", + "kotlin.contracts", + "kotlin.coroutines", + "kotlin.coroutines.cancellation", + "kotlin.coroutines.intrinsics", + "kotlin.coroutines.jvm.internal", + "kotlin.enums", + "kotlin.experimental", + "kotlin.internal", + "kotlin.internal.jdk7", + "kotlin.internal.jdk8", + "kotlin.io", + "kotlin.io.encoding", + "kotlin.io.path", + "kotlin.jdk7", + "kotlin.js", + "kotlin.jvm", + "kotlin.jvm.functions", + "kotlin.jvm.internal", + "kotlin.jvm.internal.markers", + "kotlin.jvm.internal.unsafe", + "kotlin.jvm.jdk8", + "kotlin.jvm.optionals", + "kotlin.math", + "kotlin.properties", + "kotlin.random", + "kotlin.random.jdk8", + "kotlin.ranges", + "kotlin.reflect", + "kotlin.sequences", + "kotlin.streams.jdk8", + "kotlin.system", + "kotlin.text", + "kotlin.text.jdk8", + "kotlin.time", + "kotlin.time.jdk8" + ], + "org.jetbrains:annotations": [ + "org.intellij.lang.annotations", + "org.jetbrains.annotations" + ], "org.mockito:mockito-core": [ "org.mockito", "org.mockito.codegen", @@ -1098,10 +2283,46 @@ ], "org.slf4j:slf4j-jdk14": [ "org.slf4j.jul" + ], + "org.threeten:threetenbp": [ + "org.threeten.bp", + "org.threeten.bp.chrono", + "org.threeten.bp.format", + "org.threeten.bp.jdk8", + "org.threeten.bp.temporal", + "org.threeten.bp.zone" ] }, "repositories": { "https://repo1.maven.org/maven2/": [ + "com.google.android:annotations", + "com.google.android:annotations:jar:sources", + "com.google.api.grpc:proto-google-cloud-monitoring-v3", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:jar:sources", + "com.google.api.grpc:proto-google-common-protos", + "com.google.api.grpc:proto-google-common-protos:jar:sources", + "com.google.api.grpc:proto-google-iam-v1", + "com.google.api.grpc:proto-google-iam-v1:jar:sources", + "com.google.api:api-common", + "com.google.api:api-common:jar:sources", + "com.google.api:gax", + "com.google.api:gax-grpc", + "com.google.api:gax-grpc:jar:sources", + "com.google.api:gax:jar:sources", + "com.google.auth:google-auth-library-credentials", + "com.google.auth:google-auth-library-credentials:jar:sources", + "com.google.auth:google-auth-library-oauth2-http", + "com.google.auth:google-auth-library-oauth2-http:jar:sources", + "com.google.auto.value:auto-value-annotations", + "com.google.auto.value:auto-value-annotations:jar:sources", + "com.google.cloud.opentelemetry:exporter-metrics", + "com.google.cloud.opentelemetry:exporter-metrics:jar:sources", + "com.google.cloud.opentelemetry:shared-resourcemapping", + "com.google.cloud.opentelemetry:shared-resourcemapping:jar:sources", + "com.google.cloud:google-cloud-core", + "com.google.cloud:google-cloud-core:jar:sources", + "com.google.cloud:google-cloud-monitoring", + "com.google.cloud:google-cloud-monitoring:jar:sources", "com.google.code.findbugs:jsr305", "com.google.code.findbugs:jsr305:jar:sources", "com.google.code.gson:gson", @@ -1113,8 +2334,24 @@ "com.google.guava:guava", "com.google.guava:guava:jar:sources", "com.google.guava:listenablefuture", + "com.google.http-client:google-http-client", + "com.google.http-client:google-http-client-gson", + "com.google.http-client:google-http-client-gson:jar:sources", + "com.google.http-client:google-http-client:jar:sources", "com.google.j2objc:j2objc-annotations", "com.google.j2objc:j2objc-annotations:jar:sources", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", + "com.google.protobuf:protobuf-java-util:jar:sources", + "com.google.protobuf:protobuf-java:jar:sources", + "com.google.re2j:re2j", + "com.google.re2j:re2j:jar:sources", + "com.squareup.okhttp3:okhttp", + "com.squareup.okhttp3:okhttp:jar:sources", + "com.squareup.okio:okio", + "com.squareup.okio:okio-jvm", + "com.squareup.okio:okio-jvm:jar:sources", + "com.squareup.okio:okio:jar:sources", "com.uber.nullaway:nullaway", "com.uber.nullaway:nullaway:jar:sources", "commons-codec:commons-codec", @@ -1123,6 +2360,36 @@ "commons-logging:commons-logging:jar:sources", "io.github.littleproxy:littleproxy", "io.github.littleproxy:littleproxy:jar:sources", + "io.grpc:grpc-alts", + "io.grpc:grpc-alts:jar:sources", + "io.grpc:grpc-api", + "io.grpc:grpc-api:jar:sources", + "io.grpc:grpc-auth", + "io.grpc:grpc-auth:jar:sources", + "io.grpc:grpc-context", + "io.grpc:grpc-context:jar:sources", + "io.grpc:grpc-core", + "io.grpc:grpc-core:jar:sources", + "io.grpc:grpc-googleapis", + "io.grpc:grpc-googleapis:jar:sources", + "io.grpc:grpc-grpclb", + "io.grpc:grpc-grpclb:jar:sources", + "io.grpc:grpc-inprocess", + "io.grpc:grpc-inprocess:jar:sources", + "io.grpc:grpc-netty-shaded", + "io.grpc:grpc-netty-shaded:jar:sources", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-protobuf-lite:jar:sources", + "io.grpc:grpc-protobuf:jar:sources", + "io.grpc:grpc-services", + "io.grpc:grpc-services:jar:sources", + "io.grpc:grpc-stub", + "io.grpc:grpc-stub:jar:sources", + "io.grpc:grpc-util", + "io.grpc:grpc-util:jar:sources", + "io.grpc:grpc-xds", + "io.grpc:grpc-xds:jar:sources", "io.netty:netty-all", "io.netty:netty-buffer", "io.netty:netty-buffer:jar:sources", @@ -1188,6 +2455,42 @@ "io.netty:netty-transport-udt", "io.netty:netty-transport-udt:jar:sources", "io.netty:netty-transport:jar:sources", + "io.opencensus:opencensus-api", + "io.opencensus:opencensus-api:jar:sources", + "io.opencensus:opencensus-contrib-http-util", + "io.opencensus:opencensus-contrib-http-util:jar:sources", + "io.opentelemetry.semconv:opentelemetry-semconv", + "io.opentelemetry.semconv:opentelemetry-semconv:jar:sources", + "io.opentelemetry:opentelemetry-api", + "io.opentelemetry:opentelemetry-api-incubator", + "io.opentelemetry:opentelemetry-api-incubator:jar:sources", + "io.opentelemetry:opentelemetry-api:jar:sources", + "io.opentelemetry:opentelemetry-context", + "io.opentelemetry:opentelemetry-context:jar:sources", + "io.opentelemetry:opentelemetry-exporter-common", + "io.opentelemetry:opentelemetry-exporter-common:jar:sources", + "io.opentelemetry:opentelemetry-exporter-otlp", + "io.opentelemetry:opentelemetry-exporter-otlp-common", + "io.opentelemetry:opentelemetry-exporter-otlp-common:jar:sources", + "io.opentelemetry:opentelemetry-exporter-otlp:jar:sources", + "io.opentelemetry:opentelemetry-exporter-sender-okhttp", + "io.opentelemetry:opentelemetry-exporter-sender-okhttp:jar:sources", + "io.opentelemetry:opentelemetry-sdk", + "io.opentelemetry:opentelemetry-sdk-common", + "io.opentelemetry:opentelemetry-sdk-common:jar:sources", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:jar:sources", + "io.opentelemetry:opentelemetry-sdk-logs", + "io.opentelemetry:opentelemetry-sdk-logs:jar:sources", + "io.opentelemetry:opentelemetry-sdk-metrics", + "io.opentelemetry:opentelemetry-sdk-metrics:jar:sources", + "io.opentelemetry:opentelemetry-sdk-trace", + "io.opentelemetry:opentelemetry-sdk-trace:jar:sources", + "io.opentelemetry:opentelemetry-sdk:jar:sources", + "io.perfmark:perfmark-api", + "io.perfmark:perfmark-api:jar:sources", + "javax.annotation:javax.annotation-api", + "javax.annotation:javax.annotation-api:jar:sources", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", "net.bytebuddy:byte-buddy-agent:jar:sources", @@ -1204,6 +2507,20 @@ "org.checkerframework:checker-qual:jar:sources", "org.checkerframework:dataflow-nullaway", "org.checkerframework:dataflow-nullaway:jar:sources", + "org.codehaus.mojo:animal-sniffer-annotations", + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources", + "org.conscrypt:conscrypt-openjdk-uber", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", + "org.jetbrains:annotations", + "org.jetbrains:annotations:jar:sources", "org.mockito:mockito-core", "org.mockito:mockito-core:jar:sources", "org.objenesis:objenesis", @@ -1211,7 +2528,9 @@ "org.slf4j:slf4j-api", "org.slf4j:slf4j-api:jar:sources", "org.slf4j:slf4j-jdk14", - "org.slf4j:slf4j-jdk14:jar:sources" + "org.slf4j:slf4j-jdk14:jar:sources", + "org.threeten:threetenbp", + "org.threeten:threetenbp:jar:sources" ] }, "version": "2" diff --git a/pom.xml b/pom.xml index d300e82..351cc06 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,18 @@ 2.0.13 + + + io.opencensus + opencensus-api + 0.31.1 + + + io.opencensus + opencensus-exporter-stats-stackdriver + 0.31.1 + + com.uber.nullaway diff --git a/src/main/java/com/glean/proxy/BUILD.bazel b/src/main/java/com/glean/proxy/BUILD.bazel index 8921ec6..b1b287f 100644 --- a/src/main/java/com/glean/proxy/BUILD.bazel +++ b/src/main/java/com/glean/proxy/BUILD.bazel @@ -19,6 +19,7 @@ java_library( deps = [ "//src/main/java/com/glean/proxy/filters", "//src/main/java/com/glean/proxy/filters/helpers", + "//src/main/java/com/glean/proxy/metrics", "//src/main/java/com/glean/proxy/schemas", "@maven//:io_github_littleproxy_littleproxy", "@maven//:io_netty_netty_codec_http", diff --git a/src/main/java/com/glean/proxy/FilterConfiguration.java b/src/main/java/com/glean/proxy/FilterConfiguration.java index c5af098..1806427 100644 --- a/src/main/java/com/glean/proxy/FilterConfiguration.java +++ b/src/main/java/com/glean/proxy/FilterConfiguration.java @@ -6,8 +6,10 @@ import com.glean.proxy.filters.IpAddressRequestFilter; import com.glean.proxy.filters.IpAddressRequestFilter.ALLOWED_PROXY_ADDRESS_TYPE; import com.glean.proxy.filters.ProxyDebugFilter; +import com.glean.proxy.filters.ProxyMetricsFilter; import com.glean.proxy.filters.UpgradeRequestFilter; import com.glean.proxy.filters.helpers.AllowedEgressDomains; +import com.glean.proxy.metrics.ProxyMetrics; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpRequest; import java.util.ArrayList; @@ -78,6 +80,11 @@ public record FilterConfiguration( "true".equalsIgnoreCase(System.getenv("UPGRADE_HTTP_REQUESTS")); return (request, ctx) -> new UpgradeRequestFilter(request, upgradeHttpRequests); }, + ProxyMetricsFilter.class.getSimpleName(), + () -> { + final ProxyMetrics metrics = ProxyMetrics.getInstance(); + return (request, ctx) -> new ProxyMetricsFilter(request, metrics); + }, // Debug filters ProxyDebugFilter.class.getSimpleName(), @@ -123,7 +130,8 @@ public static FilterConfiguration fromEnvironment() { String.join( ",", IpAddressRequestFilter.class.getSimpleName(), - UpgradeRequestFilter.class.getSimpleName()); + UpgradeRequestFilter.class.getSimpleName(), + ProxyMetricsFilter.class.getSimpleName()); String crossPlatformFiltersString = System.getenv().getOrDefault("CROSS_PLATFORM_FILTERS", defaultCrossPlatformFilters); diff --git a/src/main/java/com/glean/proxy/ProxyNetworking.java b/src/main/java/com/glean/proxy/ProxyNetworking.java index 2caa748..ec868eb 100644 --- a/src/main/java/com/glean/proxy/ProxyNetworking.java +++ b/src/main/java/com/glean/proxy/ProxyNetworking.java @@ -1,5 +1,7 @@ package com.glean.proxy; +import com.glean.proxy.metrics.OpenTelemetrySetup; +import com.glean.proxy.metrics.ProxyMetrics; import java.net.InetSocketAddress; import java.util.logging.Logger; import org.littleshoot.proxy.ChainedProxyManager; @@ -9,6 +11,7 @@ public class ProxyNetworking { private static final Logger logger = Logger.getLogger(ProxyNetworking.class.getName()); + private static OpenTelemetrySetup openTelemetrySetup; protected final ThreadPoolConfiguration threadPoolConfiguration; protected final FilterConfiguration filterConfiguration; @@ -69,16 +72,45 @@ public ProxyNetworking build() { if (threadPoolConfiguration == null) { threadPoolConfiguration = createThreadPoolConfigurationFromEnvironment(); } + + // Initialize metrics exporter before filter configuration, since filters use ProxyMetrics + initializeMetricsExporter(); + if (filterConfiguration == null) { filterConfiguration = FilterConfiguration.fromEnvironment(); } if (chainedProxyManager == null) { chainedProxyManager = ChainedProxyConfiguration.fromEnvironment(); } + return new ProxyNetworking(this); } } + private static void initializeMetricsExporter() { + String gcpProjectId = System.getenv("GCP_PROJECT_ID"); + String enableMetricsExport = System.getenv("ENABLE_METRICS_EXPORT"); + + // Check if metrics export is explicitly disabled + if (enableMetricsExport != null && + (enableMetricsExport.equalsIgnoreCase("false") || enableMetricsExport.equals("0"))) { + logger.info("Metrics export disabled via ENABLE_METRICS_EXPORT."); + return; + } + + if (gcpProjectId == null || gcpProjectId.isEmpty()) { + logger.warning("Set GCP_PROJECT_ID environment variable to enable metric export."); + return; + } + + try { + openTelemetrySetup = new OpenTelemetrySetup(gcpProjectId); + ProxyMetrics.initialize(openTelemetrySetup.getMeter()); + } catch (Exception e) { + logger.severe("Failed to initialize OpenTelemetry: " + e.getMessage()); + } + } + private static ThreadPoolConfiguration createThreadPoolConfigurationFromEnvironment() { int numAcceptorThreads = Integer.parseInt(System.getenv().getOrDefault("NUM_ACCEPTOR_THREADS", "4")); diff --git a/src/main/java/com/glean/proxy/filters/BUILD.bazel b/src/main/java/com/glean/proxy/filters/BUILD.bazel index 39efb31..aaaaf78 100644 --- a/src/main/java/com/glean/proxy/filters/BUILD.bazel +++ b/src/main/java/com/glean/proxy/filters/BUILD.bazel @@ -8,6 +8,7 @@ java_library( visibility = ["//visibility:public"], deps = [ "//src/main/java/com/glean/proxy/filters/helpers", + "//src/main/java/com/glean/proxy/metrics", "//src/main/java/com/glean/proxy/schemas", "@maven//:com_google_code_gson_gson", "@maven//:io_github_littleproxy_littleproxy", diff --git a/src/main/java/com/glean/proxy/filters/CompositeFilter.java b/src/main/java/com/glean/proxy/filters/CompositeFilter.java index f3e1f1e..90af2e2 100644 --- a/src/main/java/com/glean/proxy/filters/CompositeFilter.java +++ b/src/main/java/com/glean/proxy/filters/CompositeFilter.java @@ -50,4 +50,16 @@ public HttpResponse proxyToServerRequest(HttpObject httpObject) { } return null; } + + @Override + public HttpObject proxyToClientResponse(HttpObject httpObject) { + HttpObject currentObject = httpObject; + for (HttpFilters filter : filters) { + HttpObject result = filter.proxyToClientResponse(currentObject); + if (result != null) { + currentObject = result; + } + } + return currentObject; + } } diff --git a/src/main/java/com/glean/proxy/filters/ProxyMetricsFilter.java b/src/main/java/com/glean/proxy/filters/ProxyMetricsFilter.java new file mode 100644 index 0000000..2a1a1ff --- /dev/null +++ b/src/main/java/com/glean/proxy/filters/ProxyMetricsFilter.java @@ -0,0 +1,48 @@ +package com.glean.proxy.filters; + +import com.glean.proxy.metrics.ProxyMetrics; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpResponse; +import java.util.logging.Logger; +import org.littleshoot.proxy.HttpFiltersAdapter; + +/** + * Filter that records metrics for proxy requests using OpenCensus. + * Tracks request counts and latencies, labeled by HTTP method and success/failure status. + */ +public class ProxyMetricsFilter extends HttpFiltersAdapter { + private static final Logger logger = Logger.getLogger(ProxyMetricsFilter.class.getName()); + + private long requestStartTime; + private final ProxyMetrics metrics; + + public ProxyMetricsFilter(HttpRequest originalRequest, ProxyMetrics metrics) { + super(originalRequest); + this.metrics = metrics; + } + + @Override + public HttpResponse clientToProxyRequest(HttpObject httpObject) { + requestStartTime = System.currentTimeMillis(); + return null; + } + + @Override + public HttpObject proxyToClientResponse(HttpObject httpObject) { + if (httpObject instanceof HttpResponse) { + HttpResponse response = (HttpResponse) httpObject; + long latencyMs = System.currentTimeMillis() - requestStartTime; + String method = originalRequest.method().name(); + int statusCode = response.status().code(); + + metrics.recordRequest(statusCode, method, latencyMs); + + logger.finest( + String.format( + "Proxy request: method=%s, status=%d, latency=%dms", + method, statusCode, latencyMs)); + } + return httpObject; + } +} diff --git a/src/main/java/com/glean/proxy/metrics/BUILD.bazel b/src/main/java/com/glean/proxy/metrics/BUILD.bazel new file mode 100644 index 0000000..aba2147 --- /dev/null +++ b/src/main/java/com/glean/proxy/metrics/BUILD.bazel @@ -0,0 +1,22 @@ +load("@rules_java//java:defs.bzl", "java_library") + +package(default_visibility = ["//visibility:public"]) + +java_library( + name = "metrics", + srcs = glob(["*.java"]), + visibility = ["//visibility:public"], + deps = [ + "@maven//:com_google_api_api_common", + "@maven//:com_google_api_grpc_proto_google_cloud_monitoring_v3", + "@maven//:com_google_api_grpc_proto_google_common_protos", + "@maven//:com_google_cloud_google_cloud_monitoring", + "@maven//:com_google_cloud_opentelemetry_exporter_metrics", + "@maven//:com_google_protobuf_protobuf_java", + "@maven//:io_opentelemetry_opentelemetry_api", + "@maven//:io_opentelemetry_opentelemetry_sdk", + "@maven//:io_opentelemetry_opentelemetry_sdk_common", + "@maven//:io_opentelemetry_opentelemetry_sdk_metrics", + "@maven//:io_opentelemetry_semconv_opentelemetry_semconv", + ], +) diff --git a/src/main/java/com/glean/proxy/metrics/OpenTelemetrySetup.java b/src/main/java/com/glean/proxy/metrics/OpenTelemetrySetup.java new file mode 100644 index 0000000..d9ea80c --- /dev/null +++ b/src/main/java/com/glean/proxy/metrics/OpenTelemetrySetup.java @@ -0,0 +1,84 @@ +package com.glean.proxy.metrics; + +import com.google.cloud.opentelemetry.metric.GoogleCloudMetricExporter; +import com.google.cloud.opentelemetry.metric.MetricConfiguration; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.export.MetricExporter; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.semconv.ResourceAttributes; +import java.io.Closeable; +import java.time.Duration; +import java.util.logging.Logger; + +/** + * Initializes and configures OpenTelemetry with GCP Cloud Monitoring exporter. + */ +public class OpenTelemetrySetup implements Closeable { + private static final Logger logger = Logger.getLogger(OpenTelemetrySetup.class.getName()); + private static final String INSTRUMENTATION_SCOPE_NAME = "glean-proxy"; + + private final OpenTelemetrySdk openTelemetry; + private final SdkMeterProvider meterProvider; + + public OpenTelemetrySetup(String projectId) { + try { + logger.info("Initializing OpenTelemetry for project: " + projectId); + + // Create resource with service name + Resource resource = Resource.getDefault() + .merge(Resource.builder() + .put(ResourceAttributes.SERVICE_NAME, "glean-proxy") + .put(ResourceAttributes.SERVICE_NAMESPACE, "glean") + .build()); + + // Create GCP Cloud Monitoring exporter + MetricConfiguration metricConfiguration = MetricConfiguration.builder() + .setProjectId(projectId) + .setPrefix("custom.googleapis.com") // Use custom prefix instead of default workload.googleapis.com + .build(); + MetricExporter metricExporter = + GoogleCloudMetricExporter.createWithConfiguration(metricConfiguration); + + // Create periodic metric reader (exports every 60 seconds) + PeriodicMetricReader metricReader = PeriodicMetricReader.builder(metricExporter) + .setInterval(Duration.ofSeconds(60)) + .build(); + + // Create meter provider + this.meterProvider = SdkMeterProvider.builder() + .setResource(resource) + .registerMetricReader(metricReader) + .build(); + + // Build OpenTelemetry SDK + this.openTelemetry = OpenTelemetrySdk.builder() + .setMeterProvider(meterProvider) + .build(); + + + } catch (Exception e) { + logger.severe("Failed to initialize OpenTelemetry: " + e.getMessage()); + } + } + + public Meter getMeter() { + return openTelemetry.getMeter(INSTRUMENTATION_SCOPE_NAME); + } + + public OpenTelemetry getOpenTelemetry() { + return openTelemetry; + } + + @Override + public void close() { + logger.info("Shutting down OpenTelemetry..."); + if (meterProvider != null) { + meterProvider.close(); + } + logger.info("OpenTelemetry shut down"); + } +} diff --git a/src/main/java/com/glean/proxy/metrics/ProxyMetrics.java b/src/main/java/com/glean/proxy/metrics/ProxyMetrics.java new file mode 100644 index 0000000..37fcf91 --- /dev/null +++ b/src/main/java/com/glean/proxy/metrics/ProxyMetrics.java @@ -0,0 +1,68 @@ +package com.glean.proxy.metrics; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.Meter; +import java.util.logging.Logger; + +/** + * Metrics collector for proxy requests using OpenTelemetry. + * Records request counts and latency distributions with labels for status code and method. + */ +public class ProxyMetrics { + private static final Logger logger = Logger.getLogger(ProxyMetrics.class.getName()); + private static ProxyMetrics instance; + + // Attribute keys for labels + private static final AttributeKey STATUS_CODE = AttributeKey.stringKey("status_code"); + private static final AttributeKey METHOD = AttributeKey.stringKey("method"); + + private final LongCounter requestCounter; + private final DoubleHistogram latencyHistogram; + + private ProxyMetrics(Meter meter) { + this.requestCounter = meter + .counterBuilder("proxy/request_count") + .setDescription("Total number of proxy requests") + .setUnit("1") + .build(); + + this.latencyHistogram = meter + .histogramBuilder("proxy/request_latency") + .setDescription("Latency of proxy requests in milliseconds") + .setUnit("ms") + .build(); + + logger.info("ProxyMetrics initialized with OpenTelemetry"); + } + + public static synchronized void initialize(Meter meter) { + if (instance == null) { + instance = new ProxyMetrics(meter); + } + } + + public static synchronized ProxyMetrics getInstance() { + if (instance == null) { + throw new IllegalStateException("ProxyMetrics not initialized. Call initialize(Meter) first."); + } + return instance; + } + + public void recordRequest(int statusCode, String method, long latencyMs) { + try { + Attributes attributes = Attributes.builder() + .put(STATUS_CODE, String.valueOf(statusCode)) + .put(METHOD, method) + .build(); + + requestCounter.add(1, attributes); + latencyHistogram.record(latencyMs, attributes); + + } catch (Exception e) { + logger.severe("Failed to record metrics: " + e.getMessage()); + } + } +}