chalkpy 2.90.1__py3-none-any.whl → 2.95.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. chalk/__init__.py +2 -1
  2. chalk/_gen/chalk/arrow/v1/arrow_pb2.py +7 -5
  3. chalk/_gen/chalk/arrow/v1/arrow_pb2.pyi +6 -0
  4. chalk/_gen/chalk/artifacts/v1/chart_pb2.py +16 -16
  5. chalk/_gen/chalk/artifacts/v1/chart_pb2.pyi +4 -0
  6. chalk/_gen/chalk/artifacts/v1/cron_query_pb2.py +8 -7
  7. chalk/_gen/chalk/artifacts/v1/cron_query_pb2.pyi +5 -0
  8. chalk/_gen/chalk/common/v1/offline_query_pb2.py +17 -15
  9. chalk/_gen/chalk/common/v1/offline_query_pb2.pyi +25 -0
  10. chalk/_gen/chalk/common/v1/script_task_pb2.py +3 -3
  11. chalk/_gen/chalk/common/v1/script_task_pb2.pyi +2 -0
  12. chalk/_gen/chalk/dataframe/__init__.py +0 -0
  13. chalk/_gen/chalk/dataframe/v1/__init__.py +0 -0
  14. chalk/_gen/chalk/dataframe/v1/dataframe_pb2.py +48 -0
  15. chalk/_gen/chalk/dataframe/v1/dataframe_pb2.pyi +123 -0
  16. chalk/_gen/chalk/dataframe/v1/dataframe_pb2_grpc.py +4 -0
  17. chalk/_gen/chalk/dataframe/v1/dataframe_pb2_grpc.pyi +4 -0
  18. chalk/_gen/chalk/graph/v1/graph_pb2.py +150 -149
  19. chalk/_gen/chalk/graph/v1/graph_pb2.pyi +25 -0
  20. chalk/_gen/chalk/graph/v1/sources_pb2.py +94 -84
  21. chalk/_gen/chalk/graph/v1/sources_pb2.pyi +56 -0
  22. chalk/_gen/chalk/kubernetes/v1/horizontalpodautoscaler_pb2.py +79 -0
  23. chalk/_gen/chalk/kubernetes/v1/horizontalpodautoscaler_pb2.pyi +377 -0
  24. chalk/_gen/chalk/kubernetes/v1/horizontalpodautoscaler_pb2_grpc.py +4 -0
  25. chalk/_gen/chalk/kubernetes/v1/horizontalpodautoscaler_pb2_grpc.pyi +4 -0
  26. chalk/_gen/chalk/kubernetes/v1/scaledobject_pb2.py +43 -7
  27. chalk/_gen/chalk/kubernetes/v1/scaledobject_pb2.pyi +252 -2
  28. chalk/_gen/chalk/protosql/v1/sql_service_pb2.py +54 -27
  29. chalk/_gen/chalk/protosql/v1/sql_service_pb2.pyi +131 -3
  30. chalk/_gen/chalk/protosql/v1/sql_service_pb2_grpc.py +45 -0
  31. chalk/_gen/chalk/protosql/v1/sql_service_pb2_grpc.pyi +14 -0
  32. chalk/_gen/chalk/python/v1/types_pb2.py +14 -14
  33. chalk/_gen/chalk/python/v1/types_pb2.pyi +8 -0
  34. chalk/_gen/chalk/server/v1/benchmark_pb2.py +76 -0
  35. chalk/_gen/chalk/server/v1/benchmark_pb2.pyi +156 -0
  36. chalk/_gen/chalk/server/v1/benchmark_pb2_grpc.py +258 -0
  37. chalk/_gen/chalk/server/v1/benchmark_pb2_grpc.pyi +84 -0
  38. chalk/_gen/chalk/server/v1/billing_pb2.py +40 -38
  39. chalk/_gen/chalk/server/v1/billing_pb2.pyi +17 -1
  40. chalk/_gen/chalk/server/v1/branches_pb2.py +45 -0
  41. chalk/_gen/chalk/server/v1/branches_pb2.pyi +80 -0
  42. chalk/_gen/chalk/server/v1/branches_pb2_grpc.pyi +36 -0
  43. chalk/_gen/chalk/server/v1/builder_pb2.py +358 -288
  44. chalk/_gen/chalk/server/v1/builder_pb2.pyi +360 -10
  45. chalk/_gen/chalk/server/v1/builder_pb2_grpc.py +225 -0
  46. chalk/_gen/chalk/server/v1/builder_pb2_grpc.pyi +60 -0
  47. chalk/_gen/chalk/server/v1/chart_pb2.py +10 -10
  48. chalk/_gen/chalk/server/v1/chart_pb2.pyi +18 -2
  49. chalk/_gen/chalk/server/v1/clickhouse_pb2.py +42 -0
  50. chalk/_gen/chalk/server/v1/clickhouse_pb2.pyi +17 -0
  51. chalk/_gen/chalk/server/v1/clickhouse_pb2_grpc.py +78 -0
  52. chalk/_gen/chalk/server/v1/clickhouse_pb2_grpc.pyi +38 -0
  53. chalk/_gen/chalk/server/v1/cloud_components_pb2.py +141 -119
  54. chalk/_gen/chalk/server/v1/cloud_components_pb2.pyi +106 -4
  55. chalk/_gen/chalk/server/v1/cloud_components_pb2_grpc.py +45 -0
  56. chalk/_gen/chalk/server/v1/cloud_components_pb2_grpc.pyi +12 -0
  57. chalk/_gen/chalk/server/v1/cloud_credentials_pb2.py +11 -3
  58. chalk/_gen/chalk/server/v1/cloud_credentials_pb2.pyi +20 -0
  59. chalk/_gen/chalk/server/v1/cloud_credentials_pb2_grpc.py +45 -0
  60. chalk/_gen/chalk/server/v1/cloud_credentials_pb2_grpc.pyi +12 -0
  61. chalk/_gen/chalk/server/v1/dataplanejobqueue_pb2.py +52 -38
  62. chalk/_gen/chalk/server/v1/dataplanejobqueue_pb2.pyi +62 -1
  63. chalk/_gen/chalk/server/v1/dataplanejobqueue_pb2_grpc.py +90 -0
  64. chalk/_gen/chalk/server/v1/dataplanejobqueue_pb2_grpc.pyi +24 -0
  65. chalk/_gen/chalk/server/v1/dataplaneworkflows_pb2.py +90 -0
  66. chalk/_gen/chalk/server/v1/dataplaneworkflows_pb2.pyi +264 -0
  67. chalk/_gen/chalk/server/v1/dataplaneworkflows_pb2_grpc.py +170 -0
  68. chalk/_gen/chalk/server/v1/dataplaneworkflows_pb2_grpc.pyi +62 -0
  69. chalk/_gen/chalk/server/v1/deploy_pb2.py +9 -3
  70. chalk/_gen/chalk/server/v1/deploy_pb2.pyi +12 -0
  71. chalk/_gen/chalk/server/v1/deploy_pb2_grpc.py +45 -0
  72. chalk/_gen/chalk/server/v1/deploy_pb2_grpc.pyi +12 -0
  73. chalk/_gen/chalk/server/v1/deployment_pb2.py +6 -6
  74. chalk/_gen/chalk/server/v1/deployment_pb2.pyi +20 -0
  75. chalk/_gen/chalk/server/v1/environment_pb2.py +14 -12
  76. chalk/_gen/chalk/server/v1/environment_pb2.pyi +19 -0
  77. chalk/_gen/chalk/server/v1/eventbus_pb2.py +4 -2
  78. chalk/_gen/chalk/server/v1/files_pb2.py +65 -0
  79. chalk/_gen/chalk/server/v1/files_pb2.pyi +167 -0
  80. chalk/_gen/chalk/server/v1/files_pb2_grpc.py +4 -0
  81. chalk/_gen/chalk/server/v1/files_pb2_grpc.pyi +4 -0
  82. chalk/_gen/chalk/server/v1/graph_pb2.py +38 -26
  83. chalk/_gen/chalk/server/v1/graph_pb2.pyi +58 -0
  84. chalk/_gen/chalk/server/v1/graph_pb2_grpc.py +47 -0
  85. chalk/_gen/chalk/server/v1/graph_pb2_grpc.pyi +18 -0
  86. chalk/_gen/chalk/server/v1/incident_pb2.py +23 -21
  87. chalk/_gen/chalk/server/v1/incident_pb2.pyi +15 -1
  88. chalk/_gen/chalk/server/v1/indexing_job_pb2.py +44 -0
  89. chalk/_gen/chalk/server/v1/indexing_job_pb2.pyi +38 -0
  90. chalk/_gen/chalk/server/v1/indexing_job_pb2_grpc.py +78 -0
  91. chalk/_gen/chalk/server/v1/indexing_job_pb2_grpc.pyi +38 -0
  92. chalk/_gen/chalk/server/v1/integrations_pb2.py +11 -9
  93. chalk/_gen/chalk/server/v1/integrations_pb2.pyi +34 -2
  94. chalk/_gen/chalk/server/v1/kube_pb2.py +29 -19
  95. chalk/_gen/chalk/server/v1/kube_pb2.pyi +28 -0
  96. chalk/_gen/chalk/server/v1/kube_pb2_grpc.py +45 -0
  97. chalk/_gen/chalk/server/v1/kube_pb2_grpc.pyi +12 -0
  98. chalk/_gen/chalk/server/v1/log_pb2.py +21 -3
  99. chalk/_gen/chalk/server/v1/log_pb2.pyi +68 -0
  100. chalk/_gen/chalk/server/v1/log_pb2_grpc.py +90 -0
  101. chalk/_gen/chalk/server/v1/log_pb2_grpc.pyi +24 -0
  102. chalk/_gen/chalk/server/v1/model_registry_pb2.py +10 -10
  103. chalk/_gen/chalk/server/v1/model_registry_pb2.pyi +4 -1
  104. chalk/_gen/chalk/server/v1/plandebug_pb2.py +53 -0
  105. chalk/_gen/chalk/server/v1/plandebug_pb2.pyi +86 -0
  106. chalk/_gen/chalk/server/v1/plandebug_pb2_grpc.py +168 -0
  107. chalk/_gen/chalk/server/v1/plandebug_pb2_grpc.pyi +60 -0
  108. chalk/_gen/chalk/server/v1/queries_pb2.py +66 -66
  109. chalk/_gen/chalk/server/v1/queries_pb2.pyi +32 -2
  110. chalk/_gen/chalk/server/v1/scheduled_query_run_pb2.py +12 -12
  111. chalk/_gen/chalk/server/v1/scheduled_query_run_pb2.pyi +16 -3
  112. chalk/_gen/chalk/server/v1/scheduler_pb2.py +24 -12
  113. chalk/_gen/chalk/server/v1/scheduler_pb2.pyi +61 -1
  114. chalk/_gen/chalk/server/v1/scheduler_pb2_grpc.py +90 -0
  115. chalk/_gen/chalk/server/v1/scheduler_pb2_grpc.pyi +24 -0
  116. chalk/_gen/chalk/server/v1/script_tasks_pb2.py +15 -3
  117. chalk/_gen/chalk/server/v1/script_tasks_pb2.pyi +22 -0
  118. chalk/_gen/chalk/server/v1/script_tasks_pb2_grpc.py +90 -0
  119. chalk/_gen/chalk/server/v1/script_tasks_pb2_grpc.pyi +24 -0
  120. chalk/_gen/chalk/server/v1/sql_interface_pb2.py +75 -0
  121. chalk/_gen/chalk/server/v1/sql_interface_pb2.pyi +142 -0
  122. chalk/_gen/chalk/server/v1/sql_interface_pb2_grpc.py +349 -0
  123. chalk/_gen/chalk/server/v1/sql_interface_pb2_grpc.pyi +114 -0
  124. chalk/_gen/chalk/server/v1/sql_queries_pb2.py +48 -0
  125. chalk/_gen/chalk/server/v1/sql_queries_pb2.pyi +150 -0
  126. chalk/_gen/chalk/server/v1/sql_queries_pb2_grpc.py +123 -0
  127. chalk/_gen/chalk/server/v1/sql_queries_pb2_grpc.pyi +52 -0
  128. chalk/_gen/chalk/server/v1/team_pb2.py +154 -141
  129. chalk/_gen/chalk/server/v1/team_pb2.pyi +30 -2
  130. chalk/_gen/chalk/server/v1/team_pb2_grpc.py +45 -0
  131. chalk/_gen/chalk/server/v1/team_pb2_grpc.pyi +12 -0
  132. chalk/_gen/chalk/server/v1/topic_pb2.py +5 -3
  133. chalk/_gen/chalk/server/v1/topic_pb2.pyi +10 -1
  134. chalk/_gen/chalk/server/v1/trace_pb2.py +44 -40
  135. chalk/_gen/chalk/server/v1/trace_pb2.pyi +20 -0
  136. chalk/_gen/chalk/streaming/v1/debug_service_pb2.py +62 -0
  137. chalk/_gen/chalk/streaming/v1/debug_service_pb2.pyi +75 -0
  138. chalk/_gen/chalk/streaming/v1/debug_service_pb2_grpc.py +221 -0
  139. chalk/_gen/chalk/streaming/v1/debug_service_pb2_grpc.pyi +88 -0
  140. chalk/_gen/chalk/streaming/v1/simple_streaming_service_pb2.py +16 -10
  141. chalk/_gen/chalk/streaming/v1/simple_streaming_service_pb2.pyi +52 -1
  142. chalk/_gen/chalk/streaming/v1/simple_streaming_service_pb2_grpc.py +48 -0
  143. chalk/_gen/chalk/streaming/v1/simple_streaming_service_pb2_grpc.pyi +20 -0
  144. chalk/_gen/chalk/utils/v1/field_change_pb2.py +32 -0
  145. chalk/_gen/chalk/utils/v1/field_change_pb2.pyi +42 -0
  146. chalk/_gen/chalk/utils/v1/field_change_pb2_grpc.py +4 -0
  147. chalk/_gen/chalk/utils/v1/field_change_pb2_grpc.pyi +4 -0
  148. chalk/_lsp/error_builder.py +11 -0
  149. chalk/_version.py +1 -1
  150. chalk/client/client.py +128 -43
  151. chalk/client/client_async.py +149 -0
  152. chalk/client/client_async_impl.py +22 -0
  153. chalk/client/client_grpc.py +539 -104
  154. chalk/client/client_impl.py +449 -122
  155. chalk/client/dataset.py +7 -1
  156. chalk/client/models.py +98 -0
  157. chalk/client/serialization/model_serialization.py +92 -9
  158. chalk/df/LazyFramePlaceholder.py +1154 -0
  159. chalk/features/_class_property.py +7 -0
  160. chalk/features/_embedding/embedding.py +1 -0
  161. chalk/features/_encoding/converter.py +83 -2
  162. chalk/features/feature_field.py +40 -30
  163. chalk/features/feature_set_decorator.py +1 -0
  164. chalk/features/feature_wrapper.py +42 -3
  165. chalk/features/hooks.py +81 -10
  166. chalk/features/inference.py +33 -31
  167. chalk/features/resolver.py +224 -24
  168. chalk/functions/__init__.py +65 -3
  169. chalk/gitignore/gitignore_parser.py +5 -1
  170. chalk/importer.py +142 -68
  171. chalk/ml/__init__.py +2 -0
  172. chalk/ml/model_hooks.py +194 -26
  173. chalk/ml/model_reference.py +56 -8
  174. chalk/ml/model_version.py +24 -15
  175. chalk/ml/utils.py +20 -17
  176. chalk/operators/_utils.py +10 -3
  177. chalk/parsed/_proto/export.py +22 -0
  178. chalk/parsed/duplicate_input_gql.py +3 -0
  179. chalk/parsed/json_conversions.py +20 -14
  180. chalk/parsed/to_proto.py +16 -4
  181. chalk/parsed/user_types_to_json.py +31 -10
  182. chalk/parsed/validation_from_registries.py +182 -0
  183. chalk/queries/named_query.py +16 -6
  184. chalk/queries/scheduled_query.py +9 -1
  185. chalk/serialization/parsed_annotation.py +24 -11
  186. chalk/sql/__init__.py +18 -0
  187. chalk/sql/_internal/integrations/databricks.py +55 -17
  188. chalk/sql/_internal/integrations/mssql.py +127 -62
  189. chalk/sql/_internal/integrations/redshift.py +4 -0
  190. chalk/sql/_internal/sql_file_resolver.py +53 -9
  191. chalk/sql/_internal/sql_source.py +35 -2
  192. chalk/streams/_kafka_source.py +5 -1
  193. chalk/streams/_windows.py +15 -2
  194. chalk/utils/_otel_version.py +13 -0
  195. chalk/utils/async_helpers.py +2 -2
  196. chalk/utils/missing_dependency.py +5 -4
  197. chalk/utils/tracing.py +185 -95
  198. {chalkpy-2.90.1.dist-info → chalkpy-2.95.3.dist-info}/METADATA +4 -6
  199. {chalkpy-2.90.1.dist-info → chalkpy-2.95.3.dist-info}/RECORD +202 -146
  200. {chalkpy-2.90.1.dist-info → chalkpy-2.95.3.dist-info}/WHEEL +0 -0
  201. {chalkpy-2.90.1.dist-info → chalkpy-2.95.3.dist-info}/entry_points.txt +0 -0
  202. {chalkpy-2.90.1.dist-info → chalkpy-2.95.3.dist-info}/top_level.txt +0 -0
chalk/utils/tracing.py CHANGED
@@ -8,37 +8,85 @@ import types
8
8
  from typing import TYPE_CHECKING, Any, Mapping, Union, cast
9
9
 
10
10
  from chalk.utils._ddtrace_version import can_use_datadog_statsd, can_use_ddtrace
11
+ from chalk.utils._otel_version import can_use_otel_trace
11
12
  from chalk.utils.environment_parsing import env_var_bool
13
+ from chalk.utils.log_with_context import get_logger
12
14
 
13
15
  if TYPE_CHECKING:
14
16
  import ddtrace.context
17
+ from opentelemetry import trace as otel_trace
15
18
 
16
- if can_use_ddtrace and can_use_datadog_statsd:
17
- import ddtrace
18
- from datadog.dogstatsd.base import statsd
19
- from ddtrace.propagation.http import HTTPPropagator
19
+ _logger = get_logger(__name__)
20
20
 
21
- def safe_set_gauge(gauge: str, value: int | float):
22
- statsd.gauge(gauge, value)
21
+ if can_use_otel_trace:
22
+ from opentelemetry import context as otel_context
23
+ from opentelemetry import trace as otel_trace
24
+ from opentelemetry.propagate import inject as otel_inject
23
25
 
24
- def safe_incr(counter: str, value: int | float, tags: list[str] | None = None):
25
- statsd.increment(counter, value, tags)
26
+ _logger.debug("OTEL trace packages installed, otel tracing is available")
26
27
 
27
- def safe_distribution(counter: str, value: int | float, tags: list[str] | None = None):
28
- statsd.distribution(counter, value, tags)
28
+ @contextlib.contextmanager
29
+ def safe_trace(span_id: str, attributes: Mapping[str, str] | None = None): # pyright: ignore[reportRedeclaration]
30
+ if attributes is None:
31
+ attributes = {}
32
+ attributes = dict(attributes)
33
+ attributes["thread_id"] = str(threading.get_native_id())
34
+ with otel_trace.get_tracer("chalk").start_as_current_span(span_id) as span:
35
+ span.set_attributes(attributes)
36
+ yield span
37
+
38
+ def safe_add_metrics(metrics: Mapping[str, Union[int, float]]): # pyright: ignore[reportRedeclaration]
39
+ current_span = otel_trace.get_current_span()
40
+ current_span.set_attributes(dict(metrics))
41
+
42
+ def safe_add_tags(tags: Mapping[str, str]):
43
+ current_span = otel_trace.get_current_span()
44
+ current_span.set_attributes(dict(tags))
45
+
46
+ def safe_current_trace_context() -> ddtrace.context.Context | otel_trace.SpanContext | None: # pyright: ignore[reportRedeclaration]
47
+ return otel_trace.get_current_span().get_span_context()
29
48
 
30
49
  @contextlib.contextmanager
31
- def safe_trace(span_id: str, attributes: Mapping[str, str] | None = None):
32
- if not ddtrace.tracer.enabled:
50
+ def safe_activate_trace_context( # pyright: ignore[reportRedeclaration]
51
+ ctx: ddtrace.context.Context
52
+ | ddtrace.Span
53
+ | otel_trace.SpanContext
54
+ | None, # pyright: ignore[reportPrivateImportUsage]
55
+ ):
56
+ if isinstance(ctx, otel_trace.SpanContext):
57
+ new_span = otel_trace.NonRecordingSpan(ctx)
58
+ new_context = otel_trace.set_span_in_context(new_span)
59
+ token = otel_context.attach(new_context)
33
60
  yield
34
- return
35
- if (current_ctx := ddtrace.tracer.current_trace_context()) is None:
61
+ otel_context.detach(token)
62
+ else:
36
63
  yield
37
- return
38
- if (priority := current_ctx.sampling_priority) is not None and priority <= 0:
39
- # If a priority is negative, then it won't be sampled
40
- # See https://github.com/DataDog/dd-trace-py/blob/09edef713bf9f0ab30f554bf7765d7a7c2ed6f30/ddtrace/constants.py#L74
41
- # Not sure what a priority=None means
64
+
65
+ def add_trace_headers( # pyright: ignore[reportRedeclaration]
66
+ input_headers: None | dict[str, str]
67
+ ) -> dict[str, str]:
68
+ current_span_ctx = otel_trace.get_current_span().get_span_context()
69
+ new_span_ctx = otel_trace.SpanContext(
70
+ trace_id=current_span_ctx.trace_id,
71
+ span_id=current_span_ctx.span_id,
72
+ is_remote=current_span_ctx.is_remote,
73
+ trace_flags=otel_trace.TraceFlags(otel_trace.TraceFlags.SAMPLED),
74
+ trace_state=current_span_ctx.trace_state,
75
+ )
76
+ ctx = otel_trace.set_span_in_context(otel_trace.NonRecordingSpan(new_span_ctx))
77
+ headers: dict[str, str] = dict(input_headers if input_headers is not None else {})
78
+ otel_inject(headers, context=ctx)
79
+ return headers
80
+
81
+ elif can_use_ddtrace:
82
+ import ddtrace
83
+ from ddtrace.propagation.http import HTTPPropagator
84
+
85
+ _logger.debug("ddtrace installed and available, using it to trace")
86
+
87
+ @contextlib.contextmanager
88
+ def safe_trace(span_id: str, attributes: Mapping[str, str] | None = None): # pyright: ignore[reportRedeclaration]
89
+ if not ddtrace.tracer.enabled:
42
90
  yield
43
91
  return
44
92
  if attributes is None:
@@ -57,69 +105,95 @@ if can_use_ddtrace and can_use_datadog_statsd:
57
105
  span.set_tags(cast(Any, attributes))
58
106
  yield
59
107
 
60
- def safe_add_metrics(metrics: Mapping[str, Union[int, float]]):
108
+ def safe_add_metrics(metrics: Mapping[str, Union[int, float]]): # pyright: ignore[reportRedeclaration]
61
109
  span = ddtrace.tracer.current_span()
62
110
  if span:
63
111
  span.set_metrics(cast(Any, metrics))
64
112
 
65
- def safe_add_tags(tags: Mapping[str, str]):
113
+ def safe_add_tags(tags: Mapping[str, str]): # pyright: ignore[reportRedeclaration]
66
114
  span = ddtrace.tracer.current_span()
67
115
  if span:
68
116
  span.set_tags(cast(Any, tags))
69
117
 
70
- def safe_current_trace_context(): # pyright: ignore[reportRedeclaration]
118
+ def safe_current_trace_context() -> ddtrace.context.Context | otel_trace.SpanContext | None: # pyright: ignore[reportRedeclaration]
71
119
  return ddtrace.tracer.current_trace_context()
72
120
 
73
- def safe_activate_trace_context(
74
- ctx: ddtrace.context.Context | ddtrace.Span | None, # pyright: ignore[reportPrivateImportUsage]
75
- ) -> None:
76
- ddtrace.tracer.context_provider.activate(ctx)
121
+ @contextlib.contextmanager
122
+ def safe_activate_trace_context( # pyright: ignore[reportRedeclaration]
123
+ ctx: ddtrace.context.Context
124
+ | ddtrace.Span
125
+ | otel_trace.SpanContext
126
+ | None, # pyright: ignore[reportPrivateImportUsage]
127
+ ):
128
+ if isinstance(ctx, ddtrace.context.Context) or isinstance(ctx, ddtrace.Span):
129
+ ddtrace.tracer.context_provider.activate(ctx)
130
+ yield
77
131
 
78
132
  def add_trace_headers( # pyright: ignore[reportRedeclaration]
79
133
  input_headers: None | dict[str, str]
80
134
  ) -> dict[str, str]:
81
- if input_headers is None:
82
- input_headers = dict[str, str]()
83
- headers = dict(input_headers)
135
+ headers: dict[str, str] = dict(input_headers if input_headers is not None else {})
84
136
  span = ddtrace.tracer.current_span()
85
137
  if span:
138
+ span.context.sampling_priority = 2
86
139
  span.set_tags({ddtrace.constants.SAMPLING_PRIORITY_KEY: 2}) # Ensure that sampling is enabled
87
140
  HTTPPropagator.inject(span.context, headers)
88
141
  return headers
89
142
 
90
143
  else:
144
+ _logger.debug("no trace packages found, tracing will not work")
91
145
 
92
- def safe_set_gauge(gauge: str, value: int | float):
146
+ @contextlib.contextmanager
147
+ def safe_trace(span_id: str, attributes: Mapping[str, str] | None = None): # pyright: ignore[reportRedeclaration]
148
+ yield
149
+
150
+ def safe_add_metrics(metrics: Mapping[str, Union[int, float]]): # pyright: ignore[reportRedeclaration]
93
151
  pass
94
152
 
95
- def safe_incr(counter: str, value: int | float, tags: list[str] | None = None):
153
+ def safe_add_tags(tags: Mapping[str, str]): # pyright: ignore[reportRedeclaration]
96
154
  pass
97
155
 
156
+ def safe_current_trace_context() -> ddtrace.context.Context | otel_trace.SpanContext | None: # pyright: ignore[reportRedeclaration]
157
+ return
158
+
98
159
  @contextlib.contextmanager
99
- def safe_trace(span_id: str, attributes: Mapping[str, str] | None = None):
160
+ def safe_activate_trace_context( # pyright: ignore[reportRedeclaration]
161
+ ctx: ddtrace.context.Context
162
+ | ddtrace.Span
163
+ | otel_trace.Context
164
+ | otel_trace.SpanContext
165
+ | None, # pyright: ignore[reportPrivateImportUsage]
166
+ ):
100
167
  yield
101
168
 
102
- def safe_add_metrics(metrics: Mapping[str, Union[int, float]]):
103
- pass
169
+ def add_trace_headers(headers: None | dict[str, str]) -> dict[str, str]: # pyright: ignore[reportRedeclaration]
170
+ if headers is None:
171
+ return {}
172
+ return headers
104
173
 
105
- def safe_add_tags(tags: Mapping[str, str]):
106
- pass
107
174
 
108
- def safe_current_trace_context():
109
- return
175
+ if can_use_datadog_statsd:
176
+ from datadog.dogstatsd.base import statsd
110
177
 
111
- def safe_activate_trace_context(
112
- ctx: ddtrace.context.Context | ddtrace.Span | None, # pyright: ignore[reportPrivateImportUsage]
113
- ) -> None:
114
- pass
178
+ def safe_set_gauge(gauge: str, value: int | float):
179
+ statsd.gauge(gauge, value)
180
+
181
+ def safe_incr(counter: str, value: int | float, tags: list[str] | None = None):
182
+ statsd.increment(counter, value, tags)
115
183
 
116
184
  def safe_distribution(counter: str, value: int | float, tags: list[str] | None = None):
185
+ statsd.distribution(counter, value, tags)
186
+
187
+ else:
188
+
189
+ def safe_set_gauge(gauge: str, value: int | float):
117
190
  pass
118
191
 
119
- def add_trace_headers(headers: None | dict[str, str]) -> dict[str, str]:
120
- if headers is None:
121
- return {}
122
- return headers
192
+ def safe_incr(counter: str, value: int | float, tags: list[str] | None = None):
193
+ pass
194
+
195
+ def safe_distribution(counter: str, value: int | float, tags: list[str] | None = None):
196
+ pass
123
197
 
124
198
 
125
199
  class PerfTimer:
@@ -153,54 +227,70 @@ def configure_tracing(default_service_name: str):
153
227
 
154
228
  _logger = get_logger(__name__)
155
229
 
156
- if not can_use_ddtrace:
157
- _logger.warning("ddtrace is not installed")
158
- return
159
-
160
- import ddtrace
161
- from ddtrace.filters import FilterRequestsOnUrl
162
-
163
- if ddtrace.config.service is None:
164
- ddtrace.config.service = default_service_name
165
- # Re-configuring the global tracer to capture any setting changes from environs from a .dotenv file
166
- # which might be loaded after the first ddtrace import
167
-
168
- ddtrace.tracer.configure(
169
- enabled=None if "DD_TRACE_ENABLED" not in os.environ else env_var_bool("DD_TRACE_ENABLED"),
170
- hostname=os.getenv("DD_AGENT_HOST") or os.getenv("DD_TRACE_AGENT_URL"),
171
- uds_path=os.getenv("DD_TRACE_AGENT_URL"),
172
- dogstatsd_url=os.getenv("DD_DOGSTATSD_URL"),
173
- api_version=os.getenv("DD_TRACE_API_VERSION"),
174
- compute_stats_enabled=env_var_bool("DD_TRACE_COMPUTE_STATS"),
175
- iast_enabled=None if "DD_IAST_ENABLED" not in os.environ else env_var_bool("DD_IAST_ENABLED"),
176
- # exclude healthcheck url from apm trace collection
177
- settings={
178
- "FILTERS": [
179
- FilterRequestsOnUrl(
180
- [
181
- r"^http://.*/healthcheck$",
182
- r"^http://.*/ready$",
183
- r"^http://[^/]*/$", # exclude "/"
184
- ]
185
- )
186
- ]
187
- },
188
- )
189
- if ddtrace.tracer.enabled:
190
- ddtrace.patch(
191
- asyncio=True,
192
- databricks=False,
193
- fastapi=True,
194
- futures=True,
195
- httplib=True,
196
- httpx=True,
197
- psycopg=True,
198
- redis=True,
199
- requests=True,
200
- sqlalchemy=False,
201
- urllib3=True,
230
+ if can_use_otel_trace:
231
+ from opentelemetry import trace as otel_trace
232
+ from opentelemetry.sdk.resources import Resource
233
+ from opentelemetry.sdk.trace import TracerProvider
234
+
235
+ provider = TracerProvider(
236
+ resource=Resource.create(
237
+ {
238
+ "service.name": default_service_name,
239
+ }
240
+ ),
241
+ )
242
+ otel_trace.set_tracer_provider(provider)
243
+
244
+ elif can_use_ddtrace:
245
+ import ddtrace
246
+ from ddtrace.filters import FilterRequestsOnUrl
247
+
248
+ if ddtrace.config.service is None:
249
+ ddtrace.config.service = default_service_name
250
+ # Re-configuring the global tracer to capture any setting changes from environs from a .dotenv file
251
+ # which might be loaded after the first ddtrace import
252
+
253
+ ddtrace.tracer.configure(
254
+ enabled=None if "DD_TRACE_ENABLED" not in os.environ else env_var_bool("DD_TRACE_ENABLED"),
255
+ hostname=os.getenv("DD_AGENT_HOST") or os.getenv("DD_TRACE_AGENT_URL"),
256
+ uds_path=os.getenv("DD_TRACE_AGENT_URL"),
257
+ dogstatsd_url=os.getenv("DD_DOGSTATSD_URL"),
258
+ api_version=os.getenv("DD_TRACE_API_VERSION"),
259
+ compute_stats_enabled=env_var_bool("DD_TRACE_COMPUTE_STATS"),
260
+ iast_enabled=None if "DD_IAST_ENABLED" not in os.environ else env_var_bool("DD_IAST_ENABLED"),
261
+ # exclude healthcheck url from apm trace collection
262
+ settings={
263
+ "FILTERS": [
264
+ FilterRequestsOnUrl(
265
+ [
266
+ r"^http://.*/healthcheck$",
267
+ r"^http://.*/ready$",
268
+ r"^http://[^/]*/$", # exclude "/"
269
+ ]
270
+ )
271
+ ]
272
+ },
202
273
  )
274
+ if ddtrace.tracer.enabled:
275
+ ddtrace.patch(
276
+ asyncio=True,
277
+ databricks=False,
278
+ fastapi=True,
279
+ futures=True,
280
+ httplib=True,
281
+ httpx=True,
282
+ psycopg=True,
283
+ redis=True,
284
+ requests=True,
285
+ sqlalchemy=False,
286
+ urllib3=True,
287
+ )
288
+
289
+ _logger.info(
290
+ f"Configuring DDtrace tracing: enabled={ddtrace.tracer.enabled}, service={ddtrace.config.service}, env={ddtrace.config.env}, trace_agent_url: {ddtrace.config._trace_agent_url}, effective trace agent: {ddtrace.tracer._agent_url}" # pyright: ignore [reportAttributeAccessIssue, reportPrivateUsage]
291
+ )
292
+ else:
293
+ _logger.warning("neither opentelemetry nor ddtrace are installed")
294
+
203
295
 
204
- _logger.info(
205
- f"Configuring DDtrace tracing: enabled={ddtrace.tracer.enabled}, service={ddtrace.config.service}, env={ddtrace.config.env}, trace_agent_url: {ddtrace.config._trace_agent_url}, effective trace agent: {ddtrace.tracer._agent_url}" # pyright: ignore [reportAttributeAccessIssue, reportPrivateUsage]
206
- )
296
+ configure_tracing("chalkpy")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chalkpy
3
- Version: 2.90.1
3
+ Version: 2.95.3
4
4
  Summary: Python SDK for Chalk
5
5
  Author: Chalk AI, Inc.
6
6
  Project-URL: Homepage, https://chalk.ai
@@ -24,7 +24,7 @@ Requires-Dist: cattrs<25,>=22.1.0
24
24
  Requires-Dist: dataclasses_json>=0.5.7
25
25
  Requires-Dist: executing<3,>=1.2.0
26
26
  Requires-Dist: googleapis-common-protos>=1.56.0
27
- Requires-Dist: grpcio<2,>=1.59.2
27
+ Requires-Dist: grpcio<2,>=1.63.0
28
28
  Requires-Dist: ipywidgets>=8.0.6
29
29
  Requires-Dist: isodate<0.8,>=0.6.1
30
30
  Requires-Dist: numpy<3
@@ -211,9 +211,8 @@ Requires-Dist: s3fs; extra == "redshift"
211
211
  Requires-Dist: sqlalchemy[asyncio]<2,>=1.4.26; extra == "redshift"
212
212
  Requires-Dist: sqlglot<21.2.0,>=19.0.0; extra == "redshift"
213
213
  Provides-Extra: mssql
214
- Requires-Dist: pymssql<3,>=2.2.0; extra == "mssql"
214
+ Requires-Dist: azure-identity<2,>=1.12.0; extra == "mssql"
215
215
  Requires-Dist: pyodbc<6,>=4.0.0; extra == "mssql"
216
- Requires-Dist: aioodbc<1,>=0.5.0; extra == "mssql"
217
216
  Requires-Dist: adlfs; extra == "mssql"
218
217
  Requires-Dist: duckdb<1.2.0,>=0.6; extra == "mssql"
219
218
  Requires-Dist: fsspec; extra == "mssql"
@@ -284,8 +283,8 @@ Provides-Extra: all
284
283
  Requires-Dist: PyAthena>=3.0.0; extra == "all"
285
284
  Requires-Dist: adlfs; extra == "all"
286
285
  Requires-Dist: aiomysql<0.3,>=0.1.1; extra == "all"
287
- Requires-Dist: aioodbc<1,>=0.5.0; extra == "all"
288
286
  Requires-Dist: aiosqlite<0.21,>=0.19.0; extra == "all"
287
+ Requires-Dist: azure-identity<2,>=1.12.0; extra == "all"
289
288
  Requires-Dist: boto3; extra == "all"
290
289
  Requires-Dist: chalk-sqlalchemy-redshift<0.9,>=0.8.11; extra == "all"
291
290
  Requires-Dist: clickhouse-driver; extra == "all"
@@ -309,7 +308,6 @@ Requires-Dist: polars[timezone]!=1.0,!=1.1,!=1.10,!=1.11,!=1.12,!=1.13,!=1.14,!=
309
308
  Requires-Dist: psycopg2<3,>=2.9.4; extra == "all"
310
309
  Requires-Dist: psycopg[binary]<3.3,>=3.1.9; extra == "all"
311
310
  Requires-Dist: pydynamodb<0.8,>=0.6; extra == "all"
312
- Requires-Dist: pymssql<3,>=2.2.0; extra == "all"
313
311
  Requires-Dist: pymysql<2,>=1.0.2; extra == "all"
314
312
  Requires-Dist: pyodbc<6,>=4.0.0; extra == "all"
315
313
  Requires-Dist: python-json-logger<4.0.0,>=3.0.0; extra == "all"