ob-metaflow 2.11.13.1__py2.py3-none-any.whl → 2.19.7.1rc0__py2.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 (289) hide show
  1. metaflow/R.py +10 -7
  2. metaflow/__init__.py +40 -25
  3. metaflow/_vendor/imghdr/__init__.py +186 -0
  4. metaflow/_vendor/importlib_metadata/__init__.py +1063 -0
  5. metaflow/_vendor/importlib_metadata/_adapters.py +68 -0
  6. metaflow/_vendor/importlib_metadata/_collections.py +30 -0
  7. metaflow/_vendor/importlib_metadata/_compat.py +71 -0
  8. metaflow/_vendor/importlib_metadata/_functools.py +104 -0
  9. metaflow/_vendor/importlib_metadata/_itertools.py +73 -0
  10. metaflow/_vendor/importlib_metadata/_meta.py +48 -0
  11. metaflow/_vendor/importlib_metadata/_text.py +99 -0
  12. metaflow/_vendor/importlib_metadata/py.typed +0 -0
  13. metaflow/_vendor/typeguard/__init__.py +48 -0
  14. metaflow/_vendor/typeguard/_checkers.py +1070 -0
  15. metaflow/_vendor/typeguard/_config.py +108 -0
  16. metaflow/_vendor/typeguard/_decorators.py +233 -0
  17. metaflow/_vendor/typeguard/_exceptions.py +42 -0
  18. metaflow/_vendor/typeguard/_functions.py +308 -0
  19. metaflow/_vendor/typeguard/_importhook.py +213 -0
  20. metaflow/_vendor/typeguard/_memo.py +48 -0
  21. metaflow/_vendor/typeguard/_pytest_plugin.py +127 -0
  22. metaflow/_vendor/typeguard/_suppression.py +86 -0
  23. metaflow/_vendor/typeguard/_transformer.py +1229 -0
  24. metaflow/_vendor/typeguard/_union_transformer.py +55 -0
  25. metaflow/_vendor/typeguard/_utils.py +173 -0
  26. metaflow/_vendor/typeguard/py.typed +0 -0
  27. metaflow/_vendor/typing_extensions.py +3641 -0
  28. metaflow/_vendor/v3_7/importlib_metadata/__init__.py +1063 -0
  29. metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +68 -0
  30. metaflow/_vendor/v3_7/importlib_metadata/_collections.py +30 -0
  31. metaflow/_vendor/v3_7/importlib_metadata/_compat.py +71 -0
  32. metaflow/_vendor/v3_7/importlib_metadata/_functools.py +104 -0
  33. metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +73 -0
  34. metaflow/_vendor/v3_7/importlib_metadata/_meta.py +48 -0
  35. metaflow/_vendor/v3_7/importlib_metadata/_text.py +99 -0
  36. metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
  37. metaflow/_vendor/v3_7/typeguard/__init__.py +48 -0
  38. metaflow/_vendor/v3_7/typeguard/_checkers.py +906 -0
  39. metaflow/_vendor/v3_7/typeguard/_config.py +108 -0
  40. metaflow/_vendor/v3_7/typeguard/_decorators.py +237 -0
  41. metaflow/_vendor/v3_7/typeguard/_exceptions.py +42 -0
  42. metaflow/_vendor/v3_7/typeguard/_functions.py +310 -0
  43. metaflow/_vendor/v3_7/typeguard/_importhook.py +213 -0
  44. metaflow/_vendor/v3_7/typeguard/_memo.py +48 -0
  45. metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +100 -0
  46. metaflow/_vendor/v3_7/typeguard/_suppression.py +88 -0
  47. metaflow/_vendor/v3_7/typeguard/_transformer.py +1207 -0
  48. metaflow/_vendor/v3_7/typeguard/_union_transformer.py +54 -0
  49. metaflow/_vendor/v3_7/typeguard/_utils.py +169 -0
  50. metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
  51. metaflow/_vendor/v3_7/typing_extensions.py +3072 -0
  52. metaflow/_vendor/yaml/__init__.py +427 -0
  53. metaflow/_vendor/yaml/composer.py +139 -0
  54. metaflow/_vendor/yaml/constructor.py +748 -0
  55. metaflow/_vendor/yaml/cyaml.py +101 -0
  56. metaflow/_vendor/yaml/dumper.py +62 -0
  57. metaflow/_vendor/yaml/emitter.py +1137 -0
  58. metaflow/_vendor/yaml/error.py +75 -0
  59. metaflow/_vendor/yaml/events.py +86 -0
  60. metaflow/_vendor/yaml/loader.py +63 -0
  61. metaflow/_vendor/yaml/nodes.py +49 -0
  62. metaflow/_vendor/yaml/parser.py +589 -0
  63. metaflow/_vendor/yaml/reader.py +185 -0
  64. metaflow/_vendor/yaml/representer.py +389 -0
  65. metaflow/_vendor/yaml/resolver.py +227 -0
  66. metaflow/_vendor/yaml/scanner.py +1435 -0
  67. metaflow/_vendor/yaml/serializer.py +111 -0
  68. metaflow/_vendor/yaml/tokens.py +104 -0
  69. metaflow/cards.py +5 -0
  70. metaflow/cli.py +331 -785
  71. metaflow/cli_args.py +17 -0
  72. metaflow/cli_components/__init__.py +0 -0
  73. metaflow/cli_components/dump_cmd.py +96 -0
  74. metaflow/cli_components/init_cmd.py +52 -0
  75. metaflow/cli_components/run_cmds.py +546 -0
  76. metaflow/cli_components/step_cmd.py +334 -0
  77. metaflow/cli_components/utils.py +140 -0
  78. metaflow/client/__init__.py +1 -0
  79. metaflow/client/core.py +467 -73
  80. metaflow/client/filecache.py +75 -35
  81. metaflow/clone_util.py +7 -1
  82. metaflow/cmd/code/__init__.py +231 -0
  83. metaflow/cmd/develop/stub_generator.py +756 -288
  84. metaflow/cmd/develop/stubs.py +12 -28
  85. metaflow/cmd/main_cli.py +6 -4
  86. metaflow/cmd/make_wrapper.py +78 -0
  87. metaflow/datastore/__init__.py +1 -0
  88. metaflow/datastore/content_addressed_store.py +41 -10
  89. metaflow/datastore/datastore_set.py +11 -2
  90. metaflow/datastore/flow_datastore.py +156 -10
  91. metaflow/datastore/spin_datastore.py +91 -0
  92. metaflow/datastore/task_datastore.py +154 -39
  93. metaflow/debug.py +5 -0
  94. metaflow/decorators.py +404 -78
  95. metaflow/exception.py +8 -2
  96. metaflow/extension_support/__init__.py +527 -376
  97. metaflow/extension_support/_empty_file.py +2 -2
  98. metaflow/extension_support/plugins.py +49 -31
  99. metaflow/flowspec.py +482 -33
  100. metaflow/graph.py +210 -42
  101. metaflow/includefile.py +84 -40
  102. metaflow/lint.py +141 -22
  103. metaflow/meta_files.py +13 -0
  104. metaflow/{metadata → metadata_provider}/heartbeat.py +24 -8
  105. metaflow/{metadata → metadata_provider}/metadata.py +86 -1
  106. metaflow/metaflow_config.py +175 -28
  107. metaflow/metaflow_config_funcs.py +51 -3
  108. metaflow/metaflow_current.py +4 -10
  109. metaflow/metaflow_environment.py +139 -53
  110. metaflow/metaflow_git.py +115 -0
  111. metaflow/metaflow_profile.py +18 -0
  112. metaflow/metaflow_version.py +150 -66
  113. metaflow/mflog/__init__.py +4 -3
  114. metaflow/mflog/save_logs.py +2 -2
  115. metaflow/multicore_utils.py +31 -14
  116. metaflow/package/__init__.py +673 -0
  117. metaflow/packaging_sys/__init__.py +880 -0
  118. metaflow/packaging_sys/backend.py +128 -0
  119. metaflow/packaging_sys/distribution_support.py +153 -0
  120. metaflow/packaging_sys/tar_backend.py +99 -0
  121. metaflow/packaging_sys/utils.py +54 -0
  122. metaflow/packaging_sys/v1.py +527 -0
  123. metaflow/parameters.py +149 -28
  124. metaflow/plugins/__init__.py +74 -5
  125. metaflow/plugins/airflow/airflow.py +40 -25
  126. metaflow/plugins/airflow/airflow_cli.py +22 -5
  127. metaflow/plugins/airflow/airflow_decorator.py +1 -1
  128. metaflow/plugins/airflow/airflow_utils.py +5 -3
  129. metaflow/plugins/airflow/sensors/base_sensor.py +4 -4
  130. metaflow/plugins/airflow/sensors/external_task_sensor.py +2 -2
  131. metaflow/plugins/airflow/sensors/s3_sensor.py +2 -2
  132. metaflow/plugins/argo/argo_client.py +78 -33
  133. metaflow/plugins/argo/argo_events.py +6 -6
  134. metaflow/plugins/argo/argo_workflows.py +2410 -527
  135. metaflow/plugins/argo/argo_workflows_cli.py +571 -121
  136. metaflow/plugins/argo/argo_workflows_decorator.py +43 -12
  137. metaflow/plugins/argo/argo_workflows_deployer.py +106 -0
  138. metaflow/plugins/argo/argo_workflows_deployer_objects.py +453 -0
  139. metaflow/plugins/argo/capture_error.py +73 -0
  140. metaflow/plugins/argo/conditional_input_paths.py +35 -0
  141. metaflow/plugins/argo/exit_hooks.py +209 -0
  142. metaflow/plugins/argo/jobset_input_paths.py +15 -0
  143. metaflow/plugins/argo/param_val.py +19 -0
  144. metaflow/plugins/aws/aws_client.py +10 -3
  145. metaflow/plugins/aws/aws_utils.py +55 -2
  146. metaflow/plugins/aws/batch/batch.py +72 -5
  147. metaflow/plugins/aws/batch/batch_cli.py +33 -10
  148. metaflow/plugins/aws/batch/batch_client.py +4 -3
  149. metaflow/plugins/aws/batch/batch_decorator.py +102 -35
  150. metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +13 -10
  151. metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -3
  152. metaflow/plugins/aws/step_functions/production_token.py +1 -1
  153. metaflow/plugins/aws/step_functions/step_functions.py +65 -8
  154. metaflow/plugins/aws/step_functions/step_functions_cli.py +101 -7
  155. metaflow/plugins/aws/step_functions/step_functions_decorator.py +1 -2
  156. metaflow/plugins/aws/step_functions/step_functions_deployer.py +97 -0
  157. metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +264 -0
  158. metaflow/plugins/azure/azure_exceptions.py +1 -1
  159. metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +240 -0
  160. metaflow/plugins/azure/azure_tail.py +1 -1
  161. metaflow/plugins/azure/includefile_support.py +2 -0
  162. metaflow/plugins/cards/card_cli.py +66 -30
  163. metaflow/plugins/cards/card_creator.py +25 -1
  164. metaflow/plugins/cards/card_datastore.py +21 -49
  165. metaflow/plugins/cards/card_decorator.py +132 -8
  166. metaflow/plugins/cards/card_modules/basic.py +112 -17
  167. metaflow/plugins/cards/card_modules/bundle.css +1 -1
  168. metaflow/plugins/cards/card_modules/card.py +16 -1
  169. metaflow/plugins/cards/card_modules/chevron/renderer.py +1 -1
  170. metaflow/plugins/cards/card_modules/components.py +665 -28
  171. metaflow/plugins/cards/card_modules/convert_to_native_type.py +36 -7
  172. metaflow/plugins/cards/card_modules/json_viewer.py +232 -0
  173. metaflow/plugins/cards/card_modules/main.css +1 -0
  174. metaflow/plugins/cards/card_modules/main.js +68 -49
  175. metaflow/plugins/cards/card_modules/renderer_tools.py +1 -0
  176. metaflow/plugins/cards/card_modules/test_cards.py +26 -12
  177. metaflow/plugins/cards/card_server.py +39 -14
  178. metaflow/plugins/cards/component_serializer.py +2 -9
  179. metaflow/plugins/cards/metadata.py +22 -0
  180. metaflow/plugins/catch_decorator.py +9 -0
  181. metaflow/plugins/datastores/azure_storage.py +10 -1
  182. metaflow/plugins/datastores/gs_storage.py +6 -2
  183. metaflow/plugins/datastores/local_storage.py +12 -6
  184. metaflow/plugins/datastores/spin_storage.py +12 -0
  185. metaflow/plugins/datatools/local.py +2 -0
  186. metaflow/plugins/datatools/s3/s3.py +126 -75
  187. metaflow/plugins/datatools/s3/s3op.py +254 -121
  188. metaflow/plugins/env_escape/__init__.py +3 -3
  189. metaflow/plugins/env_escape/client_modules.py +102 -72
  190. metaflow/plugins/env_escape/server.py +7 -0
  191. metaflow/plugins/env_escape/stub.py +24 -5
  192. metaflow/plugins/events_decorator.py +343 -185
  193. metaflow/plugins/exit_hook/__init__.py +0 -0
  194. metaflow/plugins/exit_hook/exit_hook_decorator.py +46 -0
  195. metaflow/plugins/exit_hook/exit_hook_script.py +52 -0
  196. metaflow/plugins/gcp/__init__.py +1 -1
  197. metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +11 -6
  198. metaflow/plugins/gcp/gs_tail.py +10 -6
  199. metaflow/plugins/gcp/includefile_support.py +3 -0
  200. metaflow/plugins/kubernetes/kube_utils.py +108 -0
  201. metaflow/plugins/kubernetes/kubernetes.py +411 -130
  202. metaflow/plugins/kubernetes/kubernetes_cli.py +168 -36
  203. metaflow/plugins/kubernetes/kubernetes_client.py +104 -2
  204. metaflow/plugins/kubernetes/kubernetes_decorator.py +246 -88
  205. metaflow/plugins/kubernetes/kubernetes_job.py +253 -581
  206. metaflow/plugins/kubernetes/kubernetes_jobsets.py +1071 -0
  207. metaflow/plugins/kubernetes/spot_metadata_cli.py +69 -0
  208. metaflow/plugins/kubernetes/spot_monitor_sidecar.py +109 -0
  209. metaflow/plugins/logs_cli.py +359 -0
  210. metaflow/plugins/{metadata → metadata_providers}/local.py +144 -84
  211. metaflow/plugins/{metadata → metadata_providers}/service.py +103 -26
  212. metaflow/plugins/metadata_providers/spin.py +16 -0
  213. metaflow/plugins/package_cli.py +36 -24
  214. metaflow/plugins/parallel_decorator.py +128 -11
  215. metaflow/plugins/parsers.py +16 -0
  216. metaflow/plugins/project_decorator.py +51 -5
  217. metaflow/plugins/pypi/bootstrap.py +357 -105
  218. metaflow/plugins/pypi/conda_decorator.py +82 -81
  219. metaflow/plugins/pypi/conda_environment.py +187 -52
  220. metaflow/plugins/pypi/micromamba.py +157 -47
  221. metaflow/plugins/pypi/parsers.py +268 -0
  222. metaflow/plugins/pypi/pip.py +88 -13
  223. metaflow/plugins/pypi/pypi_decorator.py +37 -1
  224. metaflow/plugins/pypi/utils.py +48 -2
  225. metaflow/plugins/resources_decorator.py +2 -2
  226. metaflow/plugins/secrets/__init__.py +3 -0
  227. metaflow/plugins/secrets/secrets_decorator.py +26 -181
  228. metaflow/plugins/secrets/secrets_func.py +49 -0
  229. metaflow/plugins/secrets/secrets_spec.py +101 -0
  230. metaflow/plugins/secrets/utils.py +74 -0
  231. metaflow/plugins/tag_cli.py +4 -7
  232. metaflow/plugins/test_unbounded_foreach_decorator.py +41 -6
  233. metaflow/plugins/timeout_decorator.py +3 -3
  234. metaflow/plugins/uv/__init__.py +0 -0
  235. metaflow/plugins/uv/bootstrap.py +128 -0
  236. metaflow/plugins/uv/uv_environment.py +72 -0
  237. metaflow/procpoll.py +1 -1
  238. metaflow/pylint_wrapper.py +5 -1
  239. metaflow/runner/__init__.py +0 -0
  240. metaflow/runner/click_api.py +717 -0
  241. metaflow/runner/deployer.py +470 -0
  242. metaflow/runner/deployer_impl.py +201 -0
  243. metaflow/runner/metaflow_runner.py +714 -0
  244. metaflow/runner/nbdeploy.py +132 -0
  245. metaflow/runner/nbrun.py +225 -0
  246. metaflow/runner/subprocess_manager.py +650 -0
  247. metaflow/runner/utils.py +335 -0
  248. metaflow/runtime.py +1078 -260
  249. metaflow/sidecar/sidecar_worker.py +1 -1
  250. metaflow/system/__init__.py +5 -0
  251. metaflow/system/system_logger.py +85 -0
  252. metaflow/system/system_monitor.py +108 -0
  253. metaflow/system/system_utils.py +19 -0
  254. metaflow/task.py +521 -225
  255. metaflow/tracing/__init__.py +7 -7
  256. metaflow/tracing/span_exporter.py +31 -38
  257. metaflow/tracing/tracing_modules.py +38 -43
  258. metaflow/tuple_util.py +27 -0
  259. metaflow/user_configs/__init__.py +0 -0
  260. metaflow/user_configs/config_options.py +563 -0
  261. metaflow/user_configs/config_parameters.py +598 -0
  262. metaflow/user_decorators/__init__.py +0 -0
  263. metaflow/user_decorators/common.py +144 -0
  264. metaflow/user_decorators/mutable_flow.py +512 -0
  265. metaflow/user_decorators/mutable_step.py +424 -0
  266. metaflow/user_decorators/user_flow_decorator.py +264 -0
  267. metaflow/user_decorators/user_step_decorator.py +749 -0
  268. metaflow/util.py +243 -27
  269. metaflow/vendor.py +23 -7
  270. metaflow/version.py +1 -1
  271. ob_metaflow-2.19.7.1rc0.data/data/share/metaflow/devtools/Makefile +355 -0
  272. ob_metaflow-2.19.7.1rc0.data/data/share/metaflow/devtools/Tiltfile +726 -0
  273. ob_metaflow-2.19.7.1rc0.data/data/share/metaflow/devtools/pick_services.sh +105 -0
  274. ob_metaflow-2.19.7.1rc0.dist-info/METADATA +87 -0
  275. ob_metaflow-2.19.7.1rc0.dist-info/RECORD +445 -0
  276. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/WHEEL +1 -1
  277. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/entry_points.txt +1 -0
  278. metaflow/_vendor/v3_5/__init__.py +0 -1
  279. metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -644
  280. metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -152
  281. metaflow/package.py +0 -188
  282. ob_metaflow-2.11.13.1.dist-info/METADATA +0 -85
  283. ob_metaflow-2.11.13.1.dist-info/RECORD +0 -308
  284. /metaflow/_vendor/{v3_5/zipp.py → zipp.py} +0 -0
  285. /metaflow/{metadata → metadata_provider}/__init__.py +0 -0
  286. /metaflow/{metadata → metadata_provider}/util.py +0 -0
  287. /metaflow/plugins/{metadata → metadata_providers}/__init__.py +0 -0
  288. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info/licenses}/LICENSE +0 -0
  289. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/top_level.txt +0 -0
@@ -20,15 +20,15 @@ def post_fork():
20
20
  yield
21
21
 
22
22
 
23
- def cli_entrypoint(name: str):
24
- def cli_entrypoint_wrap(func):
23
+ def cli(name: str):
24
+ def cli_wrap(func):
25
25
  @wraps(func)
26
26
  def wrapper_func(*args, **kwargs):
27
27
  return func(*args, **kwargs)
28
28
 
29
29
  return wrapper_func
30
30
 
31
- return cli_entrypoint_wrap
31
+ return cli_wrap
32
32
 
33
33
 
34
34
  def inject_tracing_vars(env_dict: Dict[str, str]) -> Dict[str, str]:
@@ -40,7 +40,9 @@ def get_trace_id() -> str:
40
40
 
41
41
 
42
42
  @contextlib.contextmanager
43
- def traced(name, attrs={}):
43
+ def traced(name, attrs=None):
44
+ if attrs is None:
45
+ attrs = {}
44
46
  yield
45
47
 
46
48
 
@@ -54,17 +56,15 @@ def tracing(func):
54
56
 
55
57
  if not DISABLE_TRACING and (CONSOLE_TRACE_ENABLED or OTEL_ENDPOINT or ZIPKIN_ENDPOINT):
56
58
  try:
57
- # Overrides No-Op implementations if a specific provider is configured.
58
59
  from .tracing_modules import (
59
60
  init_tracing,
60
61
  post_fork,
61
- cli_entrypoint,
62
+ cli,
62
63
  inject_tracing_vars,
63
64
  get_trace_id,
64
65
  traced,
65
66
  tracing,
66
67
  )
67
-
68
68
  except ImportError as e:
69
69
  # We keep the errors silent by default so that having tracing environment variables present
70
70
  # does not affect users with no need for tracing.
@@ -3,6 +3,8 @@ from metaflow.metaflow_config import (
3
3
  OTEL_ENDPOINT,
4
4
  ZIPKIN_ENDPOINT,
5
5
  CONSOLE_TRACE_ENABLED,
6
+ SERVICE_AUTH_KEY,
7
+ SERVICE_HEADERS,
6
8
  )
7
9
 
8
10
  if OTEL_ENDPOINT:
@@ -11,56 +13,47 @@ if OTEL_ENDPOINT:
11
13
 
12
14
 
13
15
  def get_span_exporter():
14
- if OTEL_ENDPOINT:
15
- return set_otel_exporter()
16
+ exporter_map = {
17
+ OTEL_ENDPOINT: _create_otel_exporter,
18
+ ZIPKIN_ENDPOINT: _create_zipkin_exporter,
19
+ CONSOLE_TRACE_ENABLED: _create_console_exporter,
20
+ }
16
21
 
17
- elif ZIPKIN_ENDPOINT:
18
- return set_zipkin_exporter()
22
+ for config, create_exporter in exporter_map.items():
23
+ if config:
24
+ return create_exporter()
19
25
 
20
- elif CONSOLE_TRACE_ENABLED:
21
- return set_console_exporter()
22
- else:
23
- print("WARNING: endpoints not set up for Opentelemetry", file=sys.stderr)
24
- return
26
+ print("WARNING: endpoints not set up for OpenTelemetry", file=sys.stderr)
27
+ return None
25
28
 
26
29
 
27
- def set_otel_exporter():
30
+ def _create_otel_exporter():
28
31
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
29
32
 
30
- from metaflow.metaflow_config import (
31
- SERVICE_AUTH_KEY,
32
- SERVICE_HEADERS,
33
- )
33
+ if not any([SERVICE_AUTH_KEY, SERVICE_HEADERS]):
34
+ print("WARNING: no auth settings for OpenTelemetry", file=sys.stderr)
35
+ return None
36
+
37
+ config = {
38
+ "endpoint": OTEL_ENDPOINT,
39
+ "timeout": 15,
40
+ }
34
41
 
35
42
  if SERVICE_AUTH_KEY:
36
- span_exporter = OTLPSpanExporter(
37
- endpoint=OTEL_ENDPOINT,
38
- headers={"x-api-key": SERVICE_AUTH_KEY},
39
- timeout=15,
40
- )
43
+ config["headers"] = {"x-api-key": SERVICE_AUTH_KEY}
41
44
  elif SERVICE_HEADERS:
42
- span_exporter = OTLPSpanExporter(
43
- endpoint=OTEL_ENDPOINT,
44
- headers=SERVICE_HEADERS,
45
- timeout=15,
46
- )
47
- else:
48
- print("WARNING: no auth settings for Opentelemetry", file=sys.stderr)
49
- return
50
- return span_exporter
51
-
52
-
53
- def set_zipkin_exporter():
45
+ config["headers"] = SERVICE_HEADERS
46
+
47
+ return OTLPSpanExporter(**config)
48
+
49
+
50
+ def _create_zipkin_exporter():
54
51
  from opentelemetry.exporter.zipkin.proto.http import ZipkinExporter
55
52
 
56
- span_exporter = ZipkinExporter(
57
- endpoint=ZIPKIN_ENDPOINT,
58
- )
59
- return span_exporter
53
+ return ZipkinExporter(endpoint=ZIPKIN_ENDPOINT)
60
54
 
61
55
 
62
- def set_console_exporter():
56
+ def _create_console_exporter():
63
57
  from opentelemetry.sdk.trace.export import ConsoleSpanExporter
64
58
 
65
- span_exporter = ConsoleSpanExporter()
66
- return span_exporter
59
+ return ConsoleSpanExporter()
@@ -13,29 +13,31 @@ from typing import Dict, List, Optional
13
13
  from opentelemetry import trace as trace_api, context
14
14
  from .span_exporter import get_span_exporter
15
15
 
16
- tracer_provider = None
16
+ tracer_provider: Optional[TracerProvider] = None
17
17
 
18
18
 
19
19
  def init_tracing():
20
20
  global tracer_provider
21
+ # Disable logging from opentelemetry
22
+ import logging
23
+ logging.getLogger("opentelemetry").setLevel(logging.FATAL)
21
24
  if tracer_provider is not None:
22
- print("Tracing already initialized", file=sys.stderr)
23
25
  return
24
26
 
25
27
  from .propagator import EnvPropagator
26
28
 
27
29
  set_global_textmap(EnvPropagator(None))
28
- span_exporter = get_span_exporter()
29
30
 
30
- if "METAFLOW_KUBERNETES_POD_NAMESPACE" in os.environ:
31
- service_name = "metaflow-kubernetes"
32
- elif "AWS_BATCH_JOB_ID" in os.environ:
33
- service_name = "metaflow-awsbatch"
34
- else:
35
- service_name = "metaflow-local"
31
+ span_exporter = get_span_exporter()
32
+ if span_exporter is None:
33
+ return
36
34
 
37
35
  tracer_provider = TracerProvider(
38
- resource=Resource.create({SERVICE_NAME: service_name})
36
+ resource=Resource.create(
37
+ {
38
+ SERVICE_NAME: "metaflow",
39
+ }
40
+ )
39
41
  )
40
42
  trace_api.set_tracer_provider(tracer_provider)
41
43
 
@@ -45,7 +47,9 @@ def init_tracing():
45
47
  try:
46
48
  from opentelemetry.instrumentation.requests import RequestsInstrumentor
47
49
 
48
- RequestsInstrumentor().instrument()
50
+ RequestsInstrumentor().instrument(
51
+ tracer_provider=tracer_provider,
52
+ )
49
53
  except ImportError:
50
54
  # Its possible that this environment has opentelemetry but not requests
51
55
  # instrumentation. We don't want to fail in that case.
@@ -55,8 +59,10 @@ def init_tracing():
55
59
  @contextlib.contextmanager
56
60
  def post_fork():
57
61
  global tracer_provider
62
+
58
63
  tracer_provider = None
59
64
  init_tracing()
65
+
60
66
  token = context.attach(extract(os.environ))
61
67
  try:
62
68
  tracer = trace_api.get_tracer_provider().get_tracer(__name__)
@@ -64,47 +70,27 @@ def post_fork():
64
70
  "fork", kind=trace_api.SpanKind.SERVER
65
71
  ) as span:
66
72
  span.set_attribute("cmd", " ".join(sys.argv))
73
+ span.set_attribute("pid", str(os.getpid()))
67
74
  yield
68
75
  finally:
69
76
  context.detach(token)
70
77
 
71
78
 
72
- def _extract_token_after(tokens: List[str], before_token: str) -> Optional[str]:
73
- for i, tok in enumerate(tokens):
74
- if i > 0 and tokens[i - 1] == before_token:
75
- return tok
76
-
77
-
78
- def cli_entrypoint(name: str):
79
- def cli_entrypoint_wrap(func):
79
+ def cli(name: str):
80
+ def cli_wrap(func):
80
81
  @wraps(func)
81
82
  def wrapper_func(*args, **kwargs):
82
83
  global tracer_provider
83
-
84
84
  init_tracing()
85
85
 
86
- assert tracer_provider is not None # make type checker happy
86
+ if tracer_provider is None:
87
+ return func(*args, **kwargs)
87
88
 
88
89
  token = context.attach(extract(os.environ))
89
90
  try:
90
91
  tracer = trace_api.get_tracer_provider().get_tracer(__name__)
91
-
92
- card_subcommand = _extract_token_after(sys.argv, "card")
93
-
94
- step_name = _extract_token_after(sys.argv, "step")
95
- task_id = _extract_token_after(sys.argv, "--task-id")
96
- run_id = _extract_token_after(sys.argv, "--run-id")
97
- if step_name and task_id and run_id:
98
- better_name = "/".join([run_id, step_name, task_id])
99
- elif card_subcommand:
100
- better_name = "card/" + card_subcommand
101
- elif "run" in sys.argv:
102
- better_name = "run"
103
- else:
104
- better_name = None
105
-
106
92
  with tracer.start_as_current_span(
107
- better_name or name, kind=trace_api.SpanKind.SERVER
93
+ name, kind=trace_api.SpanKind.SERVER
108
94
  ) as span:
109
95
  span.set_attribute("cmd", " ".join(sys.argv))
110
96
  span.set_attribute("pid", str(os.getpid()))
@@ -118,7 +104,7 @@ def cli_entrypoint(name: str):
118
104
 
119
105
  return wrapper_func
120
106
 
121
- return cli_entrypoint_wrap
107
+ return cli_wrap
122
108
 
123
109
 
124
110
  def inject_tracing_vars(env_dict: Dict[str, str]) -> Dict[str, str]:
@@ -127,23 +113,32 @@ def inject_tracing_vars(env_dict: Dict[str, str]) -> Dict[str, str]:
127
113
 
128
114
 
129
115
  def get_trace_id() -> str:
130
- return format_trace_id(trace_api.get_current_span().get_span_context().trace_id)
116
+ try:
117
+ return format_trace_id(trace_api.get_current_span().get_span_context().trace_id)
118
+ except Exception:
119
+ return ""
131
120
 
132
121
 
133
122
  @contextlib.contextmanager
134
- def traced(name, attrs={}):
123
+ def traced(name: str, attrs: Optional[Dict] = None):
124
+ if tracer_provider is None:
125
+ yield
126
+ return
135
127
  tracer = trace_api.get_tracer_provider().get_tracer(__name__)
136
128
  with tracer.start_as_current_span(name) as span:
137
- for k, v in attrs.items():
138
- span.set_attribute(k, v)
129
+ if attrs:
130
+ for k, v in attrs.items():
131
+ span.set_attribute(k, v)
139
132
  yield
140
133
 
141
134
 
142
135
  def tracing(func):
143
136
  @wraps(func)
144
137
  def wrapper_func(*args, **kwargs):
145
- tracer = trace_api.get_tracer_provider().get_tracer(func.__module__.__name__)
138
+ if tracer_provider is None:
139
+ return func(*args, **kwargs)
146
140
 
141
+ tracer = trace_api.get_tracer_provider().get_tracer(func.__module__)
147
142
  with tracer.start_as_current_span(func.__name__):
148
143
  return func(*args, **kwargs)
149
144
 
metaflow/tuple_util.py ADDED
@@ -0,0 +1,27 @@
1
+ # Keep this file minimum dependency as this will be imported by metaflow at bootup.
2
+ def namedtuple_with_defaults(typename, field_descr, defaults=()):
3
+ from typing import NamedTuple
4
+
5
+ T = NamedTuple(typename, field_descr)
6
+ T.__new__.__defaults__ = tuple(defaults)
7
+
8
+ # Adding the following to ensure the named tuple can be (un)pickled correctly.
9
+ import __main__
10
+
11
+ setattr(__main__, T.__name__, T)
12
+ T.__module__ = "__main__"
13
+ return T
14
+
15
+
16
+ # Define the namedtuple with default here if they need to be accessible in client
17
+ # (and w/o a real flow).
18
+ foreach_frame_field_list = [
19
+ ("step", str),
20
+ ("var", str),
21
+ ("num_splits", int),
22
+ ("index", int),
23
+ ("value", str),
24
+ ]
25
+ ForeachFrame = namedtuple_with_defaults(
26
+ "ForeachFrame", foreach_frame_field_list, (None,) * (len(foreach_frame_field_list))
27
+ )
File without changes