Skip to content

feat(csharp): implement DatabricksTelemetryExporter (WI-3.4)#166

Merged
jadewang-db merged 3 commits intomainfrom
stack/wi-3.4-databricks-telemetry-exporter
Feb 10, 2026
Merged

feat(csharp): implement DatabricksTelemetryExporter (WI-3.4)#166
jadewang-db merged 3 commits intomainfrom
stack/wi-3.4-databricks-telemetry-exporter

Conversation

@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from 2ec6d67 to d92ee73 Compare January 22, 2026 19:27
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from d92ee73 to 254a4aa Compare January 22, 2026 22:24
@jadewang-db jadewang-db marked this pull request as ready for review January 22, 2026 22:30
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from 254a4aa to eb382cb Compare January 23, 2026 21:14
jadewang-db added a commit that referenced this pull request Jan 23, 2026
## 🥞 Stacked PR
Use this
[link](https://github.com/adbc-drivers/databricks/pull/161/files) to
review incremental changes.
-
[**stack/wi-1.2-tag-definition-system**](#161)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/161/files)]
-
[stack/wi-2.1-telemetry-data-models](#162)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/162/files/ab7fa964ff62f3fc9884034e17a7e57630fa8037..a566292aec78d19717c92e28f135535b09f25c80)]
-
[stack/wi-2.1-exception-classifier](#163)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/163/files/a566292aec78d19717c92e28f135535b09f25c80..baa7a2ae32662fddc65272e0264e8bb7d1644716)]
-
[stack/wi-3.1-circuit-breaker](#164)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/164/files/baa7a2ae32662fddc65272e0264e8bb7d1644716..03f7027e6731efe032c15555afe517ba49de3651)]
-
[stack/wi-3.1-feature-flag-cache](#165)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/165/files/03f7027e6731efe032c15555afe517ba49de3651..1d6e3d5b1c4c31ec91361337e574e6e5411fbbb6)]
-
[stack/wi-3.4-databricks-telemetry-exporter](#166)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/166/files/1d6e3d5b1c4c31ec91361337e574e6e5411fbbb6..eb382cb291c120a5f3cc3a1c38e0975b99c1369f)]
-
[stack/wi-3.5-metrics-aggregator](#167)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/167/files/eb382cb291c120a5f3cc3a1c38e0975b99c1369f..67723fabe6f62d7ed16591c3e88e96aa269daddd)]
-
[stack/wi-3.5-circuit-breaker-manager](#168)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/168/files/67723fabe6f62d7ed16591c3e88e96aa269daddd..6b66d37e9d97ca621d88c48a58ac60b2487425ea)]
-
[stack/e2e-feature-flag-cache-tests](#169)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/169/files/6b66d37e9d97ca621d88c48a58ac60b2487425ea..2a6fff2b9b91c7fd6cff7558d1d3b3596c0fa3c2)]
-
[stack/databricks-activity-listener](#170)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/170/files/2a6fff2b9b91c7fd6cff7558d1d3b3596c0fa3c2..39f6aed55278a533390e9aadf655f80dc11159c2)]
-
[stack/circuit-breaker-telemetry-exporter](#171)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/171/files/39f6aed55278a533390e9aadf655f80dc11159c2..4473de5ca3cfca8579818e6d58f8a2b12e869a47)]
-
[stack/telemetry-client-manager-wi-3.2](#172)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/172/files/4473de5ca3cfca8579818e6d58f8a2b12e869a47..94b678636d76a6d41a6612f76d00b4caccdab48a)]
-
[stack/telemetry-client-wi-5.5](#173)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/173/files/94b678636d76a6d41a6612f76d00b4caccdab48a..ce00998cbd0372d94303ad1d69e9711e4489fe96)]
-
[stack/telemetry-client-manager-e2e-wi-7](#174)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/174/files/ce00998cbd0372d94303ad1d69e9711e4489fe96..2646e86223ff1e7706b20d5970e556ec2f17867b)]
-
[stack/telemetry-client-e2e-tests-wi-7-standalone](#175)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/175/files/2646e86223ff1e7706b20d5970e556ec2f17867b..0b9ebd3867250d92d0d8007cb17d6ce471d5560a)]
-
[stack/wi-6.1-databricks-connection-telemetry-integration](#176)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/176/files/0b9ebd3867250d92d0d8007cb17d6ce471d5560a..4f553284c30eb7efcf67369c58dddd56675cd0be)]
-
[stack/wi-6.2-telemetry-tags-driver-activities](#177)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/177/files/4f553284c30eb7efcf67369c58dddd56675cd0be..1f7cde0c5642072b06588665b16ee3a30a90d256)]
-
[stack/wi-9-full-integration-e2e-tests](#178)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/178/files/1f7cde0c5642072b06588665b16ee3a30a90d256..c65e9fea7c65fa456f0114e95c867ee15f21bd87)]

---------

---------

Co-authored-by: Jade Wang <jade.wang+data@databricks.com>
Co-authored-by: Claude <noreply@anthropic.com>
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from eb382cb to a6e926c Compare January 23, 2026 21:43
jadewang-db added a commit that referenced this pull request Jan 23, 2026
## 🥞 Stacked PR
Use this
[link](https://github.com/adbc-drivers/databricks/pull/162/files) to
review incremental changes.
-
[**stack/wi-2.1-telemetry-data-models**](#162)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/162/files)]
-
[stack/wi-2.1-exception-classifier](#163)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/163/files/1e58d3c3785fa7ec1b83da01f80ddea1f6167851..0dac01831e7d9d313c67dc31e4aacceb17e74298)]
-
[stack/wi-3.1-circuit-breaker](#164)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/164/files/0dac01831e7d9d313c67dc31e4aacceb17e74298..59b0221cb4c9262d80a35041a2f1098376f6e19e)]
-
[stack/wi-3.1-feature-flag-cache](#165)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/165/files/59b0221cb4c9262d80a35041a2f1098376f6e19e..8c30fc0649b09bc38e09cfd4d6875d66963ff6c0)]
-
[stack/wi-3.4-databricks-telemetry-exporter](#166)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/166/files/8c30fc0649b09bc38e09cfd4d6875d66963ff6c0..a6e926c8017e9a3b3b6de31bbbafb367adaba884)]
-
[stack/wi-3.5-metrics-aggregator](#167)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/167/files/a6e926c8017e9a3b3b6de31bbbafb367adaba884..c53df5d3c0124c490b920e1e1a611dd9c24e02a4)]
-
[stack/wi-3.5-circuit-breaker-manager](#168)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/168/files/c53df5d3c0124c490b920e1e1a611dd9c24e02a4..de8757a697dd023628011d1aff9961896560bc95)]
-
[stack/e2e-feature-flag-cache-tests](#169)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/169/files/de8757a697dd023628011d1aff9961896560bc95..0b77f8373958342da429c20f7e30c02105402331)]
-
[stack/databricks-activity-listener](#170)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/170/files/0b77f8373958342da429c20f7e30c02105402331..9090bdefba63d6c7fbff45bf60c2c63668f3884e)]
-
[stack/circuit-breaker-telemetry-exporter](#171)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/171/files/9090bdefba63d6c7fbff45bf60c2c63668f3884e..0a0159524a429726078bd7340057672d6927d1cd)]
-
[stack/telemetry-client-manager-wi-3.2](#172)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/172/files/0a0159524a429726078bd7340057672d6927d1cd..75039c6574c2dc437f5d670e71b938b98719c06f)]
-
[stack/telemetry-client-wi-5.5](#173)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/173/files/75039c6574c2dc437f5d670e71b938b98719c06f..254cdc75487f3e9344d3df6fb9b9cbf49fd03228)]
-
[stack/telemetry-client-manager-e2e-wi-7](#174)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/174/files/254cdc75487f3e9344d3df6fb9b9cbf49fd03228..7371da59309d109e8d457f4c27edd13adfa38a2c)]
-
[stack/telemetry-client-e2e-tests-wi-7-standalone](#175)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/175/files/7371da59309d109e8d457f4c27edd13adfa38a2c..5ff7e96827faa69e8bae1d5b5da06a9f95b91a8c)]
-
[stack/wi-6.1-databricks-connection-telemetry-integration](#176)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/176/files/5ff7e96827faa69e8bae1d5b5da06a9f95b91a8c..7757345889dbfd0b1dcb22556e2e6c746d7fa0f0)]
-
[stack/wi-6.2-telemetry-tags-driver-activities](#177)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/177/files/7757345889dbfd0b1dcb22556e2e6c746d7fa0f0..2364122ad5402c9205008f39acaec6a400a4db98)]
-
[stack/wi-9-full-integration-e2e-tests](#178)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/178/files/2364122ad5402c9205008f39acaec6a400a4db98..698f3ea13f65a17b62385be8e8e4032497f88993)]

---------

---------

Co-authored-by: Jade Wang <jade.wang+data@databricks.com>
Co-authored-by: Claude <noreply@anthropic.com>
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from 2481ccf to 2147cce Compare February 3, 2026 00:50
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from 2147cce to ad67802 Compare February 3, 2026 18:24
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from ad67802 to 55938fe Compare February 3, 2026 18:32
Copy link
Collaborator

@samikshya-db samikshya-db left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have left some comments, feel free to merge post addressing them. LGTM otherwise.

@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from 55938fe to 109f1af Compare February 10, 2026 01:30
github-merge-queue bot pushed a commit that referenced this pull request Feb 10, 2026
## 🥞 Stacked PR
Use this
[link](https://github.com/adbc-drivers/databricks/pull/165/files) to
review incremental changes.
-
[**stack/wi-3.1-feature-flag-cache**](#165)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/165/files)]
-
[stack/wi-3.4-databricks-telemetry-exporter](#166)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/166/files/2262e9d512776719d02355190bd8824522537c6a..109f1af5faf78b5fbbdf4620a321b811266f63af)]
-
[stack/wi-3.5-metrics-aggregator](#167)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/167/files/109f1af5faf78b5fbbdf4620a321b811266f63af..74af04194edcbce64f66efdf45944db1ed384727)]
-
[stack/wi-3.5-circuit-breaker-manager](#168)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/168/files/74af04194edcbce64f66efdf45944db1ed384727..d0385b2145cda82c5fe0fc8311b0d64e9a6b05bc)]
-
[stack/e2e-feature-flag-cache-tests](#169)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/169/files/d0385b2145cda82c5fe0fc8311b0d64e9a6b05bc..9017bc0626121281aa0bc9fc097edd3e9d98e1c0)]
-
[stack/databricks-activity-listener](#170)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/170/files/9017bc0626121281aa0bc9fc097edd3e9d98e1c0..200014e9b7557de490944e5889fb197dc00edb41)]
-
[stack/circuit-breaker-telemetry-exporter](#171)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/171/files/200014e9b7557de490944e5889fb197dc00edb41..e886588830c528ab644b38004337e7bfc1f12c31)]
-
[stack/telemetry-client-manager-wi-3.2](#172)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/172/files/e886588830c528ab644b38004337e7bfc1f12c31..7d1e0741f4942c15e8b68f64a8199ebdae678758)]
-
[stack/telemetry-client-wi-5.5](#173)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/173/files/7d1e0741f4942c15e8b68f64a8199ebdae678758..d2a7725cd098a05ac0b9b6a0135c34823b18c1ab)]
-
[stack/telemetry-client-manager-e2e-wi-7](#174)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/174/files/d2a7725cd098a05ac0b9b6a0135c34823b18c1ab..66a44b1a372e4c27c924002a47ef755a10e7eaec)]
-
[stack/telemetry-client-e2e-tests-wi-7-standalone](#175)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/175/files/66a44b1a372e4c27c924002a47ef755a10e7eaec..276cbbd79b55ed423ce772d98901a14c4dd7054d)]
-
[stack/wi-6.1-databricks-connection-telemetry-integration](#176)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/176/files/276cbbd79b55ed423ce772d98901a14c4dd7054d..e76a4a88dfb70a0bae460d4f976bb8332295bba5)]
-
[stack/wi-6.2-telemetry-tags-driver-activities](#177)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/177/files/e76a4a88dfb70a0bae460d4f976bb8332295bba5..b647e8c57b676691f60defa79b160945894e5900)]
-
[stack/wi-9-full-integration-e2e-tests](#178)
[[Files
changed](https://github.com/adbc-drivers/databricks/pull/178/files/b647e8c57b676691f60defa79b160945894e5900..b664d4cbe3b284e4415729bd34ccbc66e3f3ca67)]

---------

---------

Co-authored-by: Jade Wang <jade.wang+data@databricks.com>
Co-authored-by: Claude <noreply@anthropic.com>
Implement the HTTP exporter that sends telemetry events to Databricks service.

Key features:
- ITelemetryExporter interface with ExportAsync method
- Creates TelemetryRequest wrapper with uploadTime and protoLogs
- Uses /telemetry-ext for authenticated requests
- Uses /telemetry-unauth for unauthenticated requests
- Implements retry logic for transient failures
- Uses ExceptionClassifier for terminal vs retryable errors
- Never throws exceptions (all swallowed and logged at TRACE level)
- Cancellation is propagated (not swallowed)

Files added:
- src/Telemetry/ITelemetryExporter.cs
- src/Telemetry/DatabricksTelemetryExporter.cs
- test/Unit/Telemetry/DatabricksTelemetryExporterTests.cs

Co-Authored-By: Claude <noreply@anthropic.com>
@jadewang-db
Copy link
Collaborator Author

Code Review Summary - DatabricksTelemetryExporter (WI-3.4)

Executive Summary

Well-structured implementation of the telemetry exporter following the JDBC reference design. The code demonstrates good separation of concerns, proper error handling, and comprehensive test coverage.

Critical Issues

None identified

High Priority Items

None identified

Medium Priority Suggestions

  1. Address existing review comments (various files)

    • samikshya-db's comments about changing endpoint from OSS_JDBC to ADBC (the ADBC endpoint is already configured server-side per the linked proto)
    • Documentation noting first call is blocking
    • Making FeatureFlagsResponse.Flags immutable (IReadOnlyList)
  2. FeatureFlagCache singleton disposal (FeatureFlagCache.cs:48)

    • The static singleton s_instance is created eagerly and implements IDisposable but may never be disposed in long-running applications
    • The eviction callback in OnCacheEntryEvicted properly disposes individual contexts, but the cache itself and its SemaphoreSlim may not be cleaned up
    • This is a known pattern limitation and acceptable for singleton caches, but worth documenting
  3. FeatureFlagContext Activity.Current in background task (FeatureFlagContext.cs:223-226)

    • Background refresh exceptions log to Activity.Current?.AddEvent(), but Activity.Current may be null in a background task context (no parent activity)
    • Consider using s_activitySource.StartActivity() within the catch block to ensure events are captured

Low Priority / Nits

  1. User-Agent verification (HttpClientFactory.cs)

    • As samikshya-db mentioned, verify User-Agent strings pass through DatabricksLogRedactor.scala to avoid log ingestion issues
  2. Configuration graceful degradation (TelemetryConfiguration.cs:226-228)

    • Invalid configuration values silently use defaults - this is by design for graceful degradation, but consider adding activity tracing when invalid values are encountered for debugging

Positive Observations

  1. Excellent error handling design - ExportAsync correctly never throws exceptions (except OperationCanceledException), following telemetry design principles

  2. Good use of ActivitySource - Proper structured tracing using ActivitySource instead of Debug.WriteLine

  3. Solid retry logic - Terminal error detection via ExceptionClassifier prevents unnecessary retries on auth failures

  4. Thread-safe implementation - Proper use of ConcurrentDictionary and SemaphoreSlim for async locking

  5. Comprehensive test coverage - Unit tests cover constructor validation, endpoint selection, request creation, retry behavior, and cancellation

  6. Clear documentation - Well-documented interfaces and methods with JDBC references

Code Quality Checklist

  • No critical security issues
  • Proper error handling
  • Thread-safe implementation
  • Good test coverage
  • Documentation complete
  • Follows existing code patterns
  • Uses ActivitySource for tracing (not Debug.WriteLine)

Recommendation

Approve with minor changes - The implementation is solid. Please address samikshya-db's existing comments about using the ADBC endpoint and the other nits mentioned in this review.


Review generated with assistance from Claude Code


This comment was generated with GitHub MCP.

- Change feature flag endpoint from OSS_JDBC to ADBC (now configured server-side)
- Make FeatureFlagsResponse.Flags immutable (IReadOnlyList)
- Add documentation about blocking first call in FeatureFlagCache
- Add documentation about singleton lifetime pattern
- Remove duplicate FeatureFlagName/EndpointFormat from TelemetryConfiguration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jadewang-db jadewang-db force-pushed the stack/wi-3.4-databricks-telemetry-exporter branch from 34e41bc to 8de9618 Compare February 10, 2026 19:14
Replace manual retry loop with Polly ResiliencePipeline for cleaner,
more maintainable retry logic. This is consistent with CircuitBreaker
which also uses Polly.

- Add ResiliencePipeline field initialized in constructor
- Create retry pipeline with configurable attempts and delay
- Handle edge case where MaxRetries=0 (no retries)
- Properly exclude terminal errors and cancellation from retries

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jadewang-db jadewang-db added the integration-test Trigger integration tests in internal repo label Feb 10, 2026
@github-actions
Copy link

🚀 Integration tests triggered! View workflow run

@jadewang-db jadewang-db added this pull request to the merge queue Feb 10, 2026
Merged via the queue into main with commit acb7b54 Feb 10, 2026
29 checks passed
@jadewang-db jadewang-db deleted the stack/wi-3.4-databricks-telemetry-exporter branch February 10, 2026 19:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

integration-test Trigger integration tests in internal repo

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants