genesis-flow 1.0.0__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.
- genesis_flow-1.0.0.dist-info/METADATA +822 -0
- genesis_flow-1.0.0.dist-info/RECORD +645 -0
- genesis_flow-1.0.0.dist-info/WHEEL +5 -0
- genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
- genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
- genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
- mlflow/__init__.py +367 -0
- mlflow/__main__.py +3 -0
- mlflow/ag2/__init__.py +56 -0
- mlflow/ag2/ag2_logger.py +294 -0
- mlflow/anthropic/__init__.py +40 -0
- mlflow/anthropic/autolog.py +129 -0
- mlflow/anthropic/chat.py +144 -0
- mlflow/artifacts/__init__.py +268 -0
- mlflow/autogen/__init__.py +144 -0
- mlflow/autogen/chat.py +142 -0
- mlflow/azure/__init__.py +26 -0
- mlflow/azure/auth_handler.py +257 -0
- mlflow/azure/client.py +319 -0
- mlflow/azure/config.py +120 -0
- mlflow/azure/connection_factory.py +340 -0
- mlflow/azure/exceptions.py +27 -0
- mlflow/azure/stores.py +327 -0
- mlflow/azure/utils.py +183 -0
- mlflow/bedrock/__init__.py +45 -0
- mlflow/bedrock/_autolog.py +202 -0
- mlflow/bedrock/chat.py +122 -0
- mlflow/bedrock/stream.py +160 -0
- mlflow/bedrock/utils.py +43 -0
- mlflow/cli.py +707 -0
- mlflow/client.py +12 -0
- mlflow/config/__init__.py +56 -0
- mlflow/crewai/__init__.py +79 -0
- mlflow/crewai/autolog.py +253 -0
- mlflow/crewai/chat.py +29 -0
- mlflow/data/__init__.py +75 -0
- mlflow/data/artifact_dataset_sources.py +170 -0
- mlflow/data/code_dataset_source.py +40 -0
- mlflow/data/dataset.py +123 -0
- mlflow/data/dataset_registry.py +168 -0
- mlflow/data/dataset_source.py +110 -0
- mlflow/data/dataset_source_registry.py +219 -0
- mlflow/data/delta_dataset_source.py +167 -0
- mlflow/data/digest_utils.py +108 -0
- mlflow/data/evaluation_dataset.py +562 -0
- mlflow/data/filesystem_dataset_source.py +81 -0
- mlflow/data/http_dataset_source.py +145 -0
- mlflow/data/huggingface_dataset.py +258 -0
- mlflow/data/huggingface_dataset_source.py +118 -0
- mlflow/data/meta_dataset.py +104 -0
- mlflow/data/numpy_dataset.py +223 -0
- mlflow/data/pandas_dataset.py +231 -0
- mlflow/data/polars_dataset.py +352 -0
- mlflow/data/pyfunc_dataset_mixin.py +31 -0
- mlflow/data/schema.py +76 -0
- mlflow/data/sources.py +1 -0
- mlflow/data/spark_dataset.py +406 -0
- mlflow/data/spark_dataset_source.py +74 -0
- mlflow/data/spark_delta_utils.py +118 -0
- mlflow/data/tensorflow_dataset.py +350 -0
- mlflow/data/uc_volume_dataset_source.py +81 -0
- mlflow/db.py +27 -0
- mlflow/dspy/__init__.py +17 -0
- mlflow/dspy/autolog.py +197 -0
- mlflow/dspy/callback.py +398 -0
- mlflow/dspy/constant.py +1 -0
- mlflow/dspy/load.py +93 -0
- mlflow/dspy/save.py +393 -0
- mlflow/dspy/util.py +109 -0
- mlflow/dspy/wrapper.py +226 -0
- mlflow/entities/__init__.py +104 -0
- mlflow/entities/_mlflow_object.py +52 -0
- mlflow/entities/assessment.py +545 -0
- mlflow/entities/assessment_error.py +80 -0
- mlflow/entities/assessment_source.py +141 -0
- mlflow/entities/dataset.py +92 -0
- mlflow/entities/dataset_input.py +51 -0
- mlflow/entities/dataset_summary.py +62 -0
- mlflow/entities/document.py +48 -0
- mlflow/entities/experiment.py +109 -0
- mlflow/entities/experiment_tag.py +35 -0
- mlflow/entities/file_info.py +45 -0
- mlflow/entities/input_tag.py +35 -0
- mlflow/entities/lifecycle_stage.py +35 -0
- mlflow/entities/logged_model.py +228 -0
- mlflow/entities/logged_model_input.py +26 -0
- mlflow/entities/logged_model_output.py +32 -0
- mlflow/entities/logged_model_parameter.py +46 -0
- mlflow/entities/logged_model_status.py +74 -0
- mlflow/entities/logged_model_tag.py +33 -0
- mlflow/entities/metric.py +200 -0
- mlflow/entities/model_registry/__init__.py +29 -0
- mlflow/entities/model_registry/_model_registry_entity.py +13 -0
- mlflow/entities/model_registry/model_version.py +243 -0
- mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
- mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
- mlflow/entities/model_registry/model_version_search.py +25 -0
- mlflow/entities/model_registry/model_version_stages.py +25 -0
- mlflow/entities/model_registry/model_version_status.py +35 -0
- mlflow/entities/model_registry/model_version_tag.py +35 -0
- mlflow/entities/model_registry/prompt.py +73 -0
- mlflow/entities/model_registry/prompt_version.py +244 -0
- mlflow/entities/model_registry/registered_model.py +175 -0
- mlflow/entities/model_registry/registered_model_alias.py +35 -0
- mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
- mlflow/entities/model_registry/registered_model_search.py +25 -0
- mlflow/entities/model_registry/registered_model_tag.py +35 -0
- mlflow/entities/multipart_upload.py +74 -0
- mlflow/entities/param.py +49 -0
- mlflow/entities/run.py +97 -0
- mlflow/entities/run_data.py +84 -0
- mlflow/entities/run_info.py +188 -0
- mlflow/entities/run_inputs.py +59 -0
- mlflow/entities/run_outputs.py +43 -0
- mlflow/entities/run_status.py +41 -0
- mlflow/entities/run_tag.py +36 -0
- mlflow/entities/source_type.py +31 -0
- mlflow/entities/span.py +774 -0
- mlflow/entities/span_event.py +96 -0
- mlflow/entities/span_status.py +102 -0
- mlflow/entities/trace.py +317 -0
- mlflow/entities/trace_data.py +71 -0
- mlflow/entities/trace_info.py +220 -0
- mlflow/entities/trace_info_v2.py +162 -0
- mlflow/entities/trace_location.py +173 -0
- mlflow/entities/trace_state.py +39 -0
- mlflow/entities/trace_status.py +68 -0
- mlflow/entities/view_type.py +51 -0
- mlflow/environment_variables.py +866 -0
- mlflow/evaluation/__init__.py +16 -0
- mlflow/evaluation/assessment.py +369 -0
- mlflow/evaluation/evaluation.py +411 -0
- mlflow/evaluation/evaluation_tag.py +61 -0
- mlflow/evaluation/fluent.py +48 -0
- mlflow/evaluation/utils.py +201 -0
- mlflow/exceptions.py +213 -0
- mlflow/experiments.py +140 -0
- mlflow/gemini/__init__.py +81 -0
- mlflow/gemini/autolog.py +186 -0
- mlflow/gemini/chat.py +261 -0
- mlflow/genai/__init__.py +71 -0
- mlflow/genai/datasets/__init__.py +67 -0
- mlflow/genai/datasets/evaluation_dataset.py +131 -0
- mlflow/genai/evaluation/__init__.py +3 -0
- mlflow/genai/evaluation/base.py +411 -0
- mlflow/genai/evaluation/constant.py +23 -0
- mlflow/genai/evaluation/utils.py +244 -0
- mlflow/genai/judges/__init__.py +21 -0
- mlflow/genai/judges/databricks.py +404 -0
- mlflow/genai/label_schemas/__init__.py +153 -0
- mlflow/genai/label_schemas/label_schemas.py +209 -0
- mlflow/genai/labeling/__init__.py +159 -0
- mlflow/genai/labeling/labeling.py +250 -0
- mlflow/genai/optimize/__init__.py +13 -0
- mlflow/genai/optimize/base.py +198 -0
- mlflow/genai/optimize/optimizers/__init__.py +4 -0
- mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
- mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
- mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
- mlflow/genai/optimize/types.py +75 -0
- mlflow/genai/optimize/util.py +30 -0
- mlflow/genai/prompts/__init__.py +206 -0
- mlflow/genai/scheduled_scorers.py +431 -0
- mlflow/genai/scorers/__init__.py +26 -0
- mlflow/genai/scorers/base.py +492 -0
- mlflow/genai/scorers/builtin_scorers.py +765 -0
- mlflow/genai/scorers/scorer_utils.py +138 -0
- mlflow/genai/scorers/validation.py +165 -0
- mlflow/genai/utils/data_validation.py +146 -0
- mlflow/genai/utils/enum_utils.py +23 -0
- mlflow/genai/utils/trace_utils.py +211 -0
- mlflow/groq/__init__.py +42 -0
- mlflow/groq/_groq_autolog.py +74 -0
- mlflow/johnsnowlabs/__init__.py +888 -0
- mlflow/langchain/__init__.py +24 -0
- mlflow/langchain/api_request_parallel_processor.py +330 -0
- mlflow/langchain/autolog.py +147 -0
- mlflow/langchain/chat_agent_langgraph.py +340 -0
- mlflow/langchain/constant.py +1 -0
- mlflow/langchain/constants.py +1 -0
- mlflow/langchain/databricks_dependencies.py +444 -0
- mlflow/langchain/langchain_tracer.py +597 -0
- mlflow/langchain/model.py +919 -0
- mlflow/langchain/output_parsers.py +142 -0
- mlflow/langchain/retriever_chain.py +153 -0
- mlflow/langchain/runnables.py +527 -0
- mlflow/langchain/utils/chat.py +402 -0
- mlflow/langchain/utils/logging.py +671 -0
- mlflow/langchain/utils/serialization.py +36 -0
- mlflow/legacy_databricks_cli/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/provider.py +482 -0
- mlflow/litellm/__init__.py +175 -0
- mlflow/llama_index/__init__.py +22 -0
- mlflow/llama_index/autolog.py +55 -0
- mlflow/llama_index/chat.py +43 -0
- mlflow/llama_index/constant.py +1 -0
- mlflow/llama_index/model.py +577 -0
- mlflow/llama_index/pyfunc_wrapper.py +332 -0
- mlflow/llama_index/serialize_objects.py +188 -0
- mlflow/llama_index/tracer.py +561 -0
- mlflow/metrics/__init__.py +479 -0
- mlflow/metrics/base.py +39 -0
- mlflow/metrics/genai/__init__.py +25 -0
- mlflow/metrics/genai/base.py +101 -0
- mlflow/metrics/genai/genai_metric.py +771 -0
- mlflow/metrics/genai/metric_definitions.py +450 -0
- mlflow/metrics/genai/model_utils.py +371 -0
- mlflow/metrics/genai/prompt_template.py +68 -0
- mlflow/metrics/genai/prompts/__init__.py +0 -0
- mlflow/metrics/genai/prompts/v1.py +422 -0
- mlflow/metrics/genai/utils.py +6 -0
- mlflow/metrics/metric_definitions.py +619 -0
- mlflow/mismatch.py +34 -0
- mlflow/mistral/__init__.py +34 -0
- mlflow/mistral/autolog.py +71 -0
- mlflow/mistral/chat.py +135 -0
- mlflow/ml_package_versions.py +452 -0
- mlflow/models/__init__.py +97 -0
- mlflow/models/auth_policy.py +83 -0
- mlflow/models/cli.py +354 -0
- mlflow/models/container/__init__.py +294 -0
- mlflow/models/container/scoring_server/__init__.py +0 -0
- mlflow/models/container/scoring_server/nginx.conf +39 -0
- mlflow/models/dependencies_schemas.py +287 -0
- mlflow/models/display_utils.py +158 -0
- mlflow/models/docker_utils.py +211 -0
- mlflow/models/evaluation/__init__.py +23 -0
- mlflow/models/evaluation/_shap_patch.py +64 -0
- mlflow/models/evaluation/artifacts.py +194 -0
- mlflow/models/evaluation/base.py +1811 -0
- mlflow/models/evaluation/calibration_curve.py +109 -0
- mlflow/models/evaluation/default_evaluator.py +996 -0
- mlflow/models/evaluation/deprecated.py +23 -0
- mlflow/models/evaluation/evaluator_registry.py +80 -0
- mlflow/models/evaluation/evaluators/classifier.py +704 -0
- mlflow/models/evaluation/evaluators/default.py +233 -0
- mlflow/models/evaluation/evaluators/regressor.py +96 -0
- mlflow/models/evaluation/evaluators/shap.py +296 -0
- mlflow/models/evaluation/lift_curve.py +178 -0
- mlflow/models/evaluation/utils/metric.py +123 -0
- mlflow/models/evaluation/utils/trace.py +179 -0
- mlflow/models/evaluation/validation.py +434 -0
- mlflow/models/flavor_backend.py +93 -0
- mlflow/models/flavor_backend_registry.py +53 -0
- mlflow/models/model.py +1639 -0
- mlflow/models/model_config.py +150 -0
- mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
- mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
- mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
- mlflow/models/python_api.py +369 -0
- mlflow/models/rag_signatures.py +128 -0
- mlflow/models/resources.py +321 -0
- mlflow/models/signature.py +662 -0
- mlflow/models/utils.py +2054 -0
- mlflow/models/wheeled_model.py +280 -0
- mlflow/openai/__init__.py +57 -0
- mlflow/openai/_agent_tracer.py +364 -0
- mlflow/openai/api_request_parallel_processor.py +131 -0
- mlflow/openai/autolog.py +509 -0
- mlflow/openai/constant.py +1 -0
- mlflow/openai/model.py +824 -0
- mlflow/openai/utils/chat_schema.py +367 -0
- mlflow/optuna/__init__.py +3 -0
- mlflow/optuna/storage.py +646 -0
- mlflow/plugins/__init__.py +72 -0
- mlflow/plugins/base.py +358 -0
- mlflow/plugins/builtin/__init__.py +24 -0
- mlflow/plugins/builtin/pytorch_plugin.py +150 -0
- mlflow/plugins/builtin/sklearn_plugin.py +158 -0
- mlflow/plugins/builtin/transformers_plugin.py +187 -0
- mlflow/plugins/cli.py +321 -0
- mlflow/plugins/discovery.py +340 -0
- mlflow/plugins/manager.py +465 -0
- mlflow/plugins/registry.py +316 -0
- mlflow/plugins/templates/framework_plugin_template.py +329 -0
- mlflow/prompt/constants.py +20 -0
- mlflow/prompt/promptlab_model.py +197 -0
- mlflow/prompt/registry_utils.py +248 -0
- mlflow/promptflow/__init__.py +495 -0
- mlflow/protos/__init__.py +0 -0
- mlflow/protos/assessments_pb2.py +174 -0
- mlflow/protos/databricks_artifacts_pb2.py +489 -0
- mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
- mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
- mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
- mlflow/protos/databricks_pb2.py +267 -0
- mlflow/protos/databricks_trace_server_pb2.py +374 -0
- mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
- mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
- mlflow/protos/facet_feature_statistics_pb2.py +296 -0
- mlflow/protos/internal_pb2.py +77 -0
- mlflow/protos/mlflow_artifacts_pb2.py +336 -0
- mlflow/protos/model_registry_pb2.py +1073 -0
- mlflow/protos/scalapb/__init__.py +0 -0
- mlflow/protos/scalapb/scalapb_pb2.py +104 -0
- mlflow/protos/service_pb2.py +2600 -0
- mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
- mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
- mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
- mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
- mlflow/py.typed +0 -0
- mlflow/pydantic_ai/__init__.py +57 -0
- mlflow/pydantic_ai/autolog.py +173 -0
- mlflow/pyfunc/__init__.py +3844 -0
- mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
- mlflow/pyfunc/backend.py +523 -0
- mlflow/pyfunc/context.py +78 -0
- mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
- mlflow/pyfunc/loaders/__init__.py +7 -0
- mlflow/pyfunc/loaders/chat_agent.py +117 -0
- mlflow/pyfunc/loaders/chat_model.py +125 -0
- mlflow/pyfunc/loaders/code_model.py +31 -0
- mlflow/pyfunc/loaders/responses_agent.py +112 -0
- mlflow/pyfunc/mlserver.py +46 -0
- mlflow/pyfunc/model.py +1473 -0
- mlflow/pyfunc/scoring_server/__init__.py +604 -0
- mlflow/pyfunc/scoring_server/app.py +7 -0
- mlflow/pyfunc/scoring_server/client.py +146 -0
- mlflow/pyfunc/spark_model_cache.py +48 -0
- mlflow/pyfunc/stdin_server.py +44 -0
- mlflow/pyfunc/utils/__init__.py +3 -0
- mlflow/pyfunc/utils/data_validation.py +224 -0
- mlflow/pyfunc/utils/environment.py +22 -0
- mlflow/pyfunc/utils/input_converter.py +47 -0
- mlflow/pyfunc/utils/serving_data_parser.py +11 -0
- mlflow/pytorch/__init__.py +1171 -0
- mlflow/pytorch/_lightning_autolog.py +580 -0
- mlflow/pytorch/_pytorch_autolog.py +50 -0
- mlflow/pytorch/pickle_module.py +35 -0
- mlflow/rfunc/__init__.py +42 -0
- mlflow/rfunc/backend.py +134 -0
- mlflow/runs.py +89 -0
- mlflow/server/__init__.py +302 -0
- mlflow/server/auth/__init__.py +1224 -0
- mlflow/server/auth/__main__.py +4 -0
- mlflow/server/auth/basic_auth.ini +6 -0
- mlflow/server/auth/cli.py +11 -0
- mlflow/server/auth/client.py +537 -0
- mlflow/server/auth/config.py +34 -0
- mlflow/server/auth/db/__init__.py +0 -0
- mlflow/server/auth/db/cli.py +18 -0
- mlflow/server/auth/db/migrations/__init__.py +0 -0
- mlflow/server/auth/db/migrations/alembic.ini +110 -0
- mlflow/server/auth/db/migrations/env.py +76 -0
- mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
- mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
- mlflow/server/auth/db/models.py +67 -0
- mlflow/server/auth/db/utils.py +37 -0
- mlflow/server/auth/entities.py +165 -0
- mlflow/server/auth/logo.py +14 -0
- mlflow/server/auth/permissions.py +65 -0
- mlflow/server/auth/routes.py +18 -0
- mlflow/server/auth/sqlalchemy_store.py +263 -0
- mlflow/server/graphql/__init__.py +0 -0
- mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
- mlflow/server/graphql/graphql_custom_scalars.py +24 -0
- mlflow/server/graphql/graphql_errors.py +15 -0
- mlflow/server/graphql/graphql_no_batching.py +89 -0
- mlflow/server/graphql/graphql_schema_extensions.py +74 -0
- mlflow/server/handlers.py +3217 -0
- mlflow/server/prometheus_exporter.py +17 -0
- mlflow/server/validation.py +30 -0
- mlflow/shap/__init__.py +691 -0
- mlflow/sklearn/__init__.py +1994 -0
- mlflow/sklearn/utils.py +1041 -0
- mlflow/smolagents/__init__.py +66 -0
- mlflow/smolagents/autolog.py +139 -0
- mlflow/smolagents/chat.py +29 -0
- mlflow/store/__init__.py +10 -0
- mlflow/store/_unity_catalog/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/constants.py +2 -0
- mlflow/store/_unity_catalog/registry/__init__.py +6 -0
- mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
- mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
- mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
- mlflow/store/_unity_catalog/registry/utils.py +121 -0
- mlflow/store/artifact/__init__.py +0 -0
- mlflow/store/artifact/artifact_repo.py +472 -0
- mlflow/store/artifact/artifact_repository_registry.py +154 -0
- mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
- mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
- mlflow/store/artifact/cli.py +141 -0
- mlflow/store/artifact/cloud_artifact_repo.py +332 -0
- mlflow/store/artifact/databricks_artifact_repo.py +729 -0
- mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
- mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
- mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
- mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
- mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
- mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
- mlflow/store/artifact/ftp_artifact_repo.py +132 -0
- mlflow/store/artifact/gcs_artifact_repo.py +296 -0
- mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
- mlflow/store/artifact/http_artifact_repo.py +218 -0
- mlflow/store/artifact/local_artifact_repo.py +142 -0
- mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
- mlflow/store/artifact/models_artifact_repo.py +259 -0
- mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
- mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
- mlflow/store/artifact/r2_artifact_repo.py +70 -0
- mlflow/store/artifact/runs_artifact_repo.py +265 -0
- mlflow/store/artifact/s3_artifact_repo.py +330 -0
- mlflow/store/artifact/sftp_artifact_repo.py +141 -0
- mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
- mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
- mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
- mlflow/store/artifact/utils/__init__.py +0 -0
- mlflow/store/artifact/utils/models.py +148 -0
- mlflow/store/db/__init__.py +0 -0
- mlflow/store/db/base_sql_model.py +3 -0
- mlflow/store/db/db_types.py +10 -0
- mlflow/store/db/utils.py +314 -0
- mlflow/store/db_migrations/__init__.py +0 -0
- mlflow/store/db_migrations/alembic.ini +74 -0
- mlflow/store/db_migrations/env.py +84 -0
- mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
- mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
- mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
- mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
- mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
- mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
- mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
- mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
- mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
- mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
- mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
- mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
- mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
- mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
- mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
- mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
- mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
- mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
- mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
- mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
- mlflow/store/db_migrations/versions/__init__.py +0 -0
- mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
- mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
- mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
- mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
- mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
- mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
- mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
- mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
- mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
- mlflow/store/entities/__init__.py +3 -0
- mlflow/store/entities/paged_list.py +18 -0
- mlflow/store/model_registry/__init__.py +10 -0
- mlflow/store/model_registry/abstract_store.py +1081 -0
- mlflow/store/model_registry/base_rest_store.py +44 -0
- mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
- mlflow/store/model_registry/dbmodels/__init__.py +0 -0
- mlflow/store/model_registry/dbmodels/models.py +206 -0
- mlflow/store/model_registry/file_store.py +1091 -0
- mlflow/store/model_registry/rest_store.py +481 -0
- mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
- mlflow/store/tracking/__init__.py +23 -0
- mlflow/store/tracking/abstract_store.py +816 -0
- mlflow/store/tracking/dbmodels/__init__.py +0 -0
- mlflow/store/tracking/dbmodels/initial_models.py +243 -0
- mlflow/store/tracking/dbmodels/models.py +1073 -0
- mlflow/store/tracking/file_store.py +2438 -0
- mlflow/store/tracking/postgres_managed_identity.py +146 -0
- mlflow/store/tracking/rest_store.py +1131 -0
- mlflow/store/tracking/sqlalchemy_store.py +2785 -0
- mlflow/system_metrics/__init__.py +61 -0
- mlflow/system_metrics/metrics/__init__.py +0 -0
- mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
- mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
- mlflow/system_metrics/metrics/disk_monitor.py +21 -0
- mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
- mlflow/system_metrics/metrics/network_monitor.py +34 -0
- mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
- mlflow/system_metrics/system_metrics_monitor.py +198 -0
- mlflow/tracing/__init__.py +16 -0
- mlflow/tracing/assessment.py +356 -0
- mlflow/tracing/client.py +531 -0
- mlflow/tracing/config.py +125 -0
- mlflow/tracing/constant.py +105 -0
- mlflow/tracing/destination.py +81 -0
- mlflow/tracing/display/__init__.py +40 -0
- mlflow/tracing/display/display_handler.py +196 -0
- mlflow/tracing/export/async_export_queue.py +186 -0
- mlflow/tracing/export/inference_table.py +138 -0
- mlflow/tracing/export/mlflow_v3.py +137 -0
- mlflow/tracing/export/utils.py +70 -0
- mlflow/tracing/fluent.py +1417 -0
- mlflow/tracing/processor/base_mlflow.py +199 -0
- mlflow/tracing/processor/inference_table.py +175 -0
- mlflow/tracing/processor/mlflow_v3.py +47 -0
- mlflow/tracing/processor/otel.py +73 -0
- mlflow/tracing/provider.py +487 -0
- mlflow/tracing/trace_manager.py +200 -0
- mlflow/tracing/utils/__init__.py +616 -0
- mlflow/tracing/utils/artifact_utils.py +28 -0
- mlflow/tracing/utils/copy.py +55 -0
- mlflow/tracing/utils/environment.py +55 -0
- mlflow/tracing/utils/exception.py +21 -0
- mlflow/tracing/utils/once.py +35 -0
- mlflow/tracing/utils/otlp.py +63 -0
- mlflow/tracing/utils/processor.py +54 -0
- mlflow/tracing/utils/search.py +292 -0
- mlflow/tracing/utils/timeout.py +250 -0
- mlflow/tracing/utils/token.py +19 -0
- mlflow/tracing/utils/truncation.py +124 -0
- mlflow/tracing/utils/warning.py +76 -0
- mlflow/tracking/__init__.py +39 -0
- mlflow/tracking/_model_registry/__init__.py +1 -0
- mlflow/tracking/_model_registry/client.py +764 -0
- mlflow/tracking/_model_registry/fluent.py +853 -0
- mlflow/tracking/_model_registry/registry.py +67 -0
- mlflow/tracking/_model_registry/utils.py +251 -0
- mlflow/tracking/_tracking_service/__init__.py +0 -0
- mlflow/tracking/_tracking_service/client.py +883 -0
- mlflow/tracking/_tracking_service/registry.py +56 -0
- mlflow/tracking/_tracking_service/utils.py +275 -0
- mlflow/tracking/artifact_utils.py +179 -0
- mlflow/tracking/client.py +5900 -0
- mlflow/tracking/context/__init__.py +0 -0
- mlflow/tracking/context/abstract_context.py +35 -0
- mlflow/tracking/context/databricks_cluster_context.py +15 -0
- mlflow/tracking/context/databricks_command_context.py +15 -0
- mlflow/tracking/context/databricks_job_context.py +49 -0
- mlflow/tracking/context/databricks_notebook_context.py +41 -0
- mlflow/tracking/context/databricks_repo_context.py +43 -0
- mlflow/tracking/context/default_context.py +51 -0
- mlflow/tracking/context/git_context.py +32 -0
- mlflow/tracking/context/registry.py +98 -0
- mlflow/tracking/context/system_environment_context.py +15 -0
- mlflow/tracking/default_experiment/__init__.py +1 -0
- mlflow/tracking/default_experiment/abstract_context.py +43 -0
- mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
- mlflow/tracking/default_experiment/registry.py +75 -0
- mlflow/tracking/fluent.py +3595 -0
- mlflow/tracking/metric_value_conversion_utils.py +93 -0
- mlflow/tracking/multimedia.py +206 -0
- mlflow/tracking/registry.py +86 -0
- mlflow/tracking/request_auth/__init__.py +0 -0
- mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
- mlflow/tracking/request_auth/registry.py +60 -0
- mlflow/tracking/request_header/__init__.py +0 -0
- mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
- mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
- mlflow/tracking/request_header/default_request_header_provider.py +17 -0
- mlflow/tracking/request_header/registry.py +79 -0
- mlflow/transformers/__init__.py +2982 -0
- mlflow/transformers/flavor_config.py +258 -0
- mlflow/transformers/hub_utils.py +83 -0
- mlflow/transformers/llm_inference_utils.py +468 -0
- mlflow/transformers/model_io.py +301 -0
- mlflow/transformers/peft.py +51 -0
- mlflow/transformers/signature.py +183 -0
- mlflow/transformers/torch_utils.py +55 -0
- mlflow/types/__init__.py +21 -0
- mlflow/types/agent.py +270 -0
- mlflow/types/chat.py +240 -0
- mlflow/types/llm.py +935 -0
- mlflow/types/responses.py +139 -0
- mlflow/types/responses_helpers.py +416 -0
- mlflow/types/schema.py +1505 -0
- mlflow/types/type_hints.py +647 -0
- mlflow/types/utils.py +753 -0
- mlflow/utils/__init__.py +283 -0
- mlflow/utils/_capture_modules.py +256 -0
- mlflow/utils/_capture_transformers_modules.py +75 -0
- mlflow/utils/_spark_utils.py +201 -0
- mlflow/utils/_unity_catalog_oss_utils.py +97 -0
- mlflow/utils/_unity_catalog_utils.py +479 -0
- mlflow/utils/annotations.py +218 -0
- mlflow/utils/arguments_utils.py +16 -0
- mlflow/utils/async_logging/__init__.py +1 -0
- mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
- mlflow/utils/async_logging/async_logging_queue.py +366 -0
- mlflow/utils/async_logging/run_artifact.py +38 -0
- mlflow/utils/async_logging/run_batch.py +58 -0
- mlflow/utils/async_logging/run_operations.py +49 -0
- mlflow/utils/autologging_utils/__init__.py +737 -0
- mlflow/utils/autologging_utils/client.py +432 -0
- mlflow/utils/autologging_utils/config.py +33 -0
- mlflow/utils/autologging_utils/events.py +294 -0
- mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
- mlflow/utils/autologging_utils/metrics_queue.py +71 -0
- mlflow/utils/autologging_utils/safety.py +1104 -0
- mlflow/utils/autologging_utils/versioning.py +95 -0
- mlflow/utils/checkpoint_utils.py +206 -0
- mlflow/utils/class_utils.py +6 -0
- mlflow/utils/cli_args.py +257 -0
- mlflow/utils/conda.py +354 -0
- mlflow/utils/credentials.py +231 -0
- mlflow/utils/data_utils.py +17 -0
- mlflow/utils/databricks_utils.py +1436 -0
- mlflow/utils/docstring_utils.py +477 -0
- mlflow/utils/doctor.py +133 -0
- mlflow/utils/download_cloud_file_chunk.py +43 -0
- mlflow/utils/env_manager.py +16 -0
- mlflow/utils/env_pack.py +131 -0
- mlflow/utils/environment.py +1009 -0
- mlflow/utils/exception_utils.py +14 -0
- mlflow/utils/file_utils.py +978 -0
- mlflow/utils/git_utils.py +77 -0
- mlflow/utils/gorilla.py +797 -0
- mlflow/utils/import_hooks/__init__.py +363 -0
- mlflow/utils/lazy_load.py +51 -0
- mlflow/utils/logging_utils.py +168 -0
- mlflow/utils/mime_type_utils.py +58 -0
- mlflow/utils/mlflow_tags.py +103 -0
- mlflow/utils/model_utils.py +486 -0
- mlflow/utils/name_utils.py +346 -0
- mlflow/utils/nfs_on_spark.py +62 -0
- mlflow/utils/openai_utils.py +164 -0
- mlflow/utils/os.py +12 -0
- mlflow/utils/oss_registry_utils.py +29 -0
- mlflow/utils/plugins.py +17 -0
- mlflow/utils/process.py +182 -0
- mlflow/utils/promptlab_utils.py +146 -0
- mlflow/utils/proto_json_utils.py +743 -0
- mlflow/utils/pydantic_utils.py +54 -0
- mlflow/utils/request_utils.py +279 -0
- mlflow/utils/requirements_utils.py +704 -0
- mlflow/utils/rest_utils.py +673 -0
- mlflow/utils/search_logged_model_utils.py +127 -0
- mlflow/utils/search_utils.py +2111 -0
- mlflow/utils/secure_loading.py +221 -0
- mlflow/utils/security_validation.py +384 -0
- mlflow/utils/server_cli_utils.py +61 -0
- mlflow/utils/spark_utils.py +15 -0
- mlflow/utils/string_utils.py +138 -0
- mlflow/utils/thread_utils.py +63 -0
- mlflow/utils/time.py +54 -0
- mlflow/utils/timeout.py +42 -0
- mlflow/utils/uri.py +572 -0
- mlflow/utils/validation.py +662 -0
- mlflow/utils/virtualenv.py +458 -0
- mlflow/utils/warnings_utils.py +25 -0
- mlflow/utils/yaml_utils.py +179 -0
- mlflow/version.py +24 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from typing import Any, Optional
|
4
|
+
|
5
|
+
from opentelemetry.context import Context
|
6
|
+
from opentelemetry.sdk.trace import ReadableSpan as OTelReadableSpan
|
7
|
+
from opentelemetry.sdk.trace import Span as OTelSpan
|
8
|
+
from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter
|
9
|
+
|
10
|
+
from mlflow.entities.trace_info import TraceInfo
|
11
|
+
from mlflow.tracing.constant import (
|
12
|
+
MAX_CHARS_IN_TRACE_INFO_METADATA,
|
13
|
+
TRUNCATION_SUFFIX,
|
14
|
+
SpanAttributeKey,
|
15
|
+
TraceMetadataKey,
|
16
|
+
TraceTagKey,
|
17
|
+
)
|
18
|
+
from mlflow.tracing.trace_manager import InMemoryTraceManager, _Trace
|
19
|
+
from mlflow.tracing.utils import (
|
20
|
+
aggregate_usage_from_spans,
|
21
|
+
deduplicate_span_names_in_place,
|
22
|
+
get_otel_attribute,
|
23
|
+
maybe_get_dependencies_schemas,
|
24
|
+
maybe_get_logged_model_id,
|
25
|
+
maybe_get_request_id,
|
26
|
+
update_trace_state_from_span_conditionally,
|
27
|
+
)
|
28
|
+
from mlflow.tracing.utils.environment import resolve_env_metadata
|
29
|
+
from mlflow.tracking.fluent import (
|
30
|
+
_get_active_model_id_global,
|
31
|
+
_get_experiment_id,
|
32
|
+
_get_latest_active_run,
|
33
|
+
)
|
34
|
+
|
35
|
+
_logger = logging.getLogger(__name__)
|
36
|
+
|
37
|
+
|
38
|
+
class BaseMlflowSpanProcessor(SimpleSpanProcessor):
|
39
|
+
"""
|
40
|
+
Defines custom hooks to be executed when a span is started or ended (before exporting).
|
41
|
+
|
42
|
+
"""
|
43
|
+
|
44
|
+
def __init__(
|
45
|
+
self,
|
46
|
+
span_exporter: SpanExporter,
|
47
|
+
experiment_id: Optional[str] = None,
|
48
|
+
):
|
49
|
+
self.span_exporter = span_exporter
|
50
|
+
self._experiment_id = experiment_id
|
51
|
+
self._trace_manager = InMemoryTraceManager.get_instance()
|
52
|
+
self._env_metadata = resolve_env_metadata()
|
53
|
+
|
54
|
+
def on_start(self, span: OTelSpan, parent_context: Optional[Context] = None):
|
55
|
+
"""
|
56
|
+
Handle the start of a span. This method is called when an OpenTelemetry span is started.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
span: An OpenTelemetry Span object that is started.
|
60
|
+
parent_context: The context of the span. Note that this is only passed when the context
|
61
|
+
object is explicitly specified to OpenTelemetry start_span call. If the parent span
|
62
|
+
is obtained from the global context, it won't be passed here so we should not rely
|
63
|
+
on it.
|
64
|
+
"""
|
65
|
+
trace_id = self._trace_manager.get_mlflow_trace_id_from_otel_id(span.context.trace_id)
|
66
|
+
|
67
|
+
if not trace_id and span.parent is not None:
|
68
|
+
_logger.debug(
|
69
|
+
"Received a non-root span but the trace ID is not found."
|
70
|
+
"The trace has likely been halted due to a timeout expiration."
|
71
|
+
)
|
72
|
+
return
|
73
|
+
|
74
|
+
if span.parent is None:
|
75
|
+
trace_info = self._start_trace(span)
|
76
|
+
trace_id = trace_info.trace_id
|
77
|
+
|
78
|
+
span.set_attribute(SpanAttributeKey.REQUEST_ID, json.dumps(trace_id))
|
79
|
+
|
80
|
+
def _start_trace(self, root_span: OTelSpan) -> TraceInfo:
|
81
|
+
raise NotImplementedError("Subclasses must implement this method.")
|
82
|
+
|
83
|
+
def on_end(self, span: OTelReadableSpan) -> None:
|
84
|
+
"""
|
85
|
+
Handle the end of a span. This method is called when an OpenTelemetry span is ended.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
span: An OpenTelemetry ReadableSpan object that is ended.
|
89
|
+
"""
|
90
|
+
# Processing the trace only when the root span is found.
|
91
|
+
if span._parent is not None:
|
92
|
+
return
|
93
|
+
|
94
|
+
trace_id = get_otel_attribute(span, SpanAttributeKey.REQUEST_ID)
|
95
|
+
with self._trace_manager.get_trace(trace_id) as trace:
|
96
|
+
if trace is None:
|
97
|
+
_logger.debug(f"Trace data with request ID {trace_id} not found.")
|
98
|
+
return
|
99
|
+
|
100
|
+
self._update_trace_info(trace, span)
|
101
|
+
deduplicate_span_names_in_place(list(trace.span_dict.values()))
|
102
|
+
|
103
|
+
super().on_end(span)
|
104
|
+
|
105
|
+
def _get_experiment_id_for_trace(self, span: OTelReadableSpan) -> str:
|
106
|
+
"""
|
107
|
+
Determine the experiment ID to associate with the trace.
|
108
|
+
|
109
|
+
The experiment ID can be configured in multiple ways, in order of precedence:
|
110
|
+
1. An experiment ID specified via the span creation API i.e. MlflowClient().start_trace()
|
111
|
+
2. An experiment ID specified via the processor constructor
|
112
|
+
3. An experiment ID of an active run.
|
113
|
+
4. The default experiment ID
|
114
|
+
"""
|
115
|
+
from mlflow.tracking.fluent import _get_latest_active_run
|
116
|
+
|
117
|
+
if experiment_id := get_otel_attribute(span, SpanAttributeKey.EXPERIMENT_ID):
|
118
|
+
return experiment_id
|
119
|
+
|
120
|
+
if self._experiment_id:
|
121
|
+
return self._experiment_id
|
122
|
+
|
123
|
+
if run := _get_latest_active_run():
|
124
|
+
return run.info.experiment_id
|
125
|
+
|
126
|
+
return _get_experiment_id()
|
127
|
+
|
128
|
+
def _get_basic_trace_metadata(self) -> dict[str, Any]:
|
129
|
+
metadata = self._env_metadata.copy()
|
130
|
+
|
131
|
+
# If the span is started within an active MLflow run, we should record it as a trace tag
|
132
|
+
# Note `mlflow.active_run()` can only get thread-local active run,
|
133
|
+
# but tracing routine might be applied to model inference worker threads
|
134
|
+
# in the following cases:
|
135
|
+
# - langchain model `chain.batch` which uses thread pool to spawn workers.
|
136
|
+
# - MLflow langchain pyfunc model `predict` which calls `api_request_parallel_processor`.
|
137
|
+
# Therefore, we use `_get_global_active_run()` instead to get the active run from
|
138
|
+
# all threads and set it as the tracing source run.
|
139
|
+
if run := _get_latest_active_run():
|
140
|
+
metadata[TraceMetadataKey.SOURCE_RUN] = run.info.run_id
|
141
|
+
|
142
|
+
# The order is:
|
143
|
+
# 1. model_id of the current active model set by `set_active_model`
|
144
|
+
# 2. model_id from the current prediction context
|
145
|
+
# (set by mlflow pyfunc predict, or explicitly using set_prediction_context)
|
146
|
+
if active_model_id := _get_active_model_id_global():
|
147
|
+
metadata[TraceMetadataKey.MODEL_ID] = active_model_id
|
148
|
+
elif model_id := maybe_get_logged_model_id():
|
149
|
+
metadata[TraceMetadataKey.MODEL_ID] = model_id
|
150
|
+
|
151
|
+
return metadata
|
152
|
+
|
153
|
+
def _get_basic_trace_tags(self, span: OTelReadableSpan) -> dict[str, Any]:
|
154
|
+
# If the trace is created in the context of MLflow model evaluation, we extract the request
|
155
|
+
# ID from the prediction context. Otherwise, we create a new trace info by calling the
|
156
|
+
# backend API.
|
157
|
+
tags = {}
|
158
|
+
if request_id := maybe_get_request_id(is_evaluate=True):
|
159
|
+
tags.update({TraceTagKey.EVAL_REQUEST_ID: request_id})
|
160
|
+
if dependencies_schema := maybe_get_dependencies_schemas():
|
161
|
+
tags.update(dependencies_schema)
|
162
|
+
tags.update({TraceTagKey.TRACE_NAME: span.name})
|
163
|
+
return tags
|
164
|
+
|
165
|
+
def _update_trace_info(self, trace: _Trace, root_span: OTelReadableSpan):
|
166
|
+
"""Update the trace info with the final values from the root span."""
|
167
|
+
# The trace/span start time needs adjustment to exclude the latency of
|
168
|
+
# the backend API call. We already adjusted the span start time in the
|
169
|
+
# on_start method, so we reflect the same to the trace start time here.
|
170
|
+
trace.info.request_time = root_span.start_time // 1_000_000 # nanosecond to millisecond
|
171
|
+
trace.info.execution_duration = (root_span.end_time - root_span.start_time) // 1_000_000
|
172
|
+
|
173
|
+
# Update trace state from span status, but only if the user hasn't explicitly set
|
174
|
+
# a different trace status
|
175
|
+
update_trace_state_from_span_conditionally(trace, root_span)
|
176
|
+
trace.info.trace_metadata.update(
|
177
|
+
{
|
178
|
+
TraceMetadataKey.INPUTS: self._truncate_metadata(
|
179
|
+
root_span.attributes.get(SpanAttributeKey.INPUTS)
|
180
|
+
),
|
181
|
+
TraceMetadataKey.OUTPUTS: self._truncate_metadata(
|
182
|
+
root_span.attributes.get(SpanAttributeKey.OUTPUTS)
|
183
|
+
),
|
184
|
+
}
|
185
|
+
)
|
186
|
+
|
187
|
+
# Aggregate token usage information from all spans
|
188
|
+
if usage := aggregate_usage_from_spans(trace.span_dict.values()):
|
189
|
+
trace.info.request_metadata[TraceMetadataKey.TOKEN_USAGE] = json.dumps(usage)
|
190
|
+
|
191
|
+
def _truncate_metadata(self, value: Optional[str]) -> str:
|
192
|
+
"""Get truncated value of the attribute if it exceeds the maximum length."""
|
193
|
+
if not value:
|
194
|
+
return ""
|
195
|
+
|
196
|
+
if len(value) > MAX_CHARS_IN_TRACE_INFO_METADATA:
|
197
|
+
trunc_length = MAX_CHARS_IN_TRACE_INFO_METADATA - len(TRUNCATION_SUFFIX)
|
198
|
+
value = value[:trunc_length] + TRUNCATION_SUFFIX
|
199
|
+
return value
|
@@ -0,0 +1,175 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from typing import Optional
|
4
|
+
|
5
|
+
from opentelemetry.context import Context
|
6
|
+
from opentelemetry.sdk.trace import ReadableSpan as OTelReadableSpan
|
7
|
+
from opentelemetry.sdk.trace import Span as OTelSpan
|
8
|
+
from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter
|
9
|
+
|
10
|
+
from mlflow.entities.trace_info import TraceInfo
|
11
|
+
from mlflow.entities.trace_location import TraceLocation
|
12
|
+
from mlflow.entities.trace_state import TraceState
|
13
|
+
from mlflow.environment_variables import MLFLOW_EXPERIMENT_ID
|
14
|
+
from mlflow.tracing.constant import (
|
15
|
+
TRACE_SCHEMA_VERSION,
|
16
|
+
TRACE_SCHEMA_VERSION_KEY,
|
17
|
+
SpanAttributeKey,
|
18
|
+
TraceMetadataKey,
|
19
|
+
)
|
20
|
+
from mlflow.tracing.trace_manager import InMemoryTraceManager
|
21
|
+
from mlflow.tracing.utils import (
|
22
|
+
_try_get_prediction_context,
|
23
|
+
aggregate_usage_from_spans,
|
24
|
+
deduplicate_span_names_in_place,
|
25
|
+
generate_trace_id_v3,
|
26
|
+
get_otel_attribute,
|
27
|
+
maybe_get_dependencies_schemas,
|
28
|
+
maybe_get_request_id,
|
29
|
+
update_trace_state_from_span_conditionally,
|
30
|
+
)
|
31
|
+
from mlflow.utils.mlflow_tags import MLFLOW_DATABRICKS_MODEL_SERVING_ENDPOINT_NAME
|
32
|
+
|
33
|
+
_logger = logging.getLogger(__name__)
|
34
|
+
|
35
|
+
|
36
|
+
_HEADER_REQUEST_ID_KEY = "X-Request-Id"
|
37
|
+
|
38
|
+
|
39
|
+
# Extracting for testing purposes
|
40
|
+
def _get_flask_request():
|
41
|
+
import flask
|
42
|
+
|
43
|
+
if flask.has_request_context():
|
44
|
+
return flask.request
|
45
|
+
|
46
|
+
|
47
|
+
class InferenceTableSpanProcessor(SimpleSpanProcessor):
|
48
|
+
"""
|
49
|
+
Defines custom hooks to be executed when a span is started or ended (before exporting).
|
50
|
+
|
51
|
+
This processor is used when the tracing destination is Databricks Inference Table.
|
52
|
+
"""
|
53
|
+
|
54
|
+
def __init__(self, span_exporter: SpanExporter):
|
55
|
+
self.span_exporter = span_exporter
|
56
|
+
self._trace_manager = InMemoryTraceManager.get_instance()
|
57
|
+
|
58
|
+
def on_start(self, span: OTelSpan, parent_context: Optional[Context] = None):
|
59
|
+
"""
|
60
|
+
Handle the start of a span. This method is called when an OpenTelemetry span is started.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
span: An OpenTelemetry Span object that is started.
|
64
|
+
parent_context: The context of the span. Note that this is only passed when the context
|
65
|
+
object is explicitly specified to OpenTelemetry start_span call. If the parent
|
66
|
+
span is obtained from the global context, it won't be passed here so we should not
|
67
|
+
rely on it.
|
68
|
+
"""
|
69
|
+
databricks_request_id = maybe_get_request_id()
|
70
|
+
if databricks_request_id is None:
|
71
|
+
# NB: This is currently used for streaming inference in Databricks Model Serving.
|
72
|
+
# In normal prediction, serving logic pass the request ID using the
|
73
|
+
# `with set_prediction_context` context manager that wraps `model.predict`
|
74
|
+
# call. However, in streaming case, the context manager is not applicable
|
75
|
+
# so we still need to rely on Flask request context (which is set to the
|
76
|
+
# stream response via flask.stream_with_context()
|
77
|
+
if flask_request := _get_flask_request():
|
78
|
+
databricks_request_id = flask_request.headers.get(_HEADER_REQUEST_ID_KEY)
|
79
|
+
if not databricks_request_id:
|
80
|
+
_logger.warning(
|
81
|
+
"Databricks request ID not found in the request headers. "
|
82
|
+
"Skipping trace processing."
|
83
|
+
)
|
84
|
+
return
|
85
|
+
else:
|
86
|
+
_logger.warning(
|
87
|
+
"Failed to get Databricks request ID from the request headers because "
|
88
|
+
"request context is not available. Skipping trace processing."
|
89
|
+
)
|
90
|
+
return
|
91
|
+
|
92
|
+
trace_id = generate_trace_id_v3(span)
|
93
|
+
span.set_attribute(SpanAttributeKey.REQUEST_ID, json.dumps(trace_id))
|
94
|
+
tags = {}
|
95
|
+
if dependencies_schema := maybe_get_dependencies_schemas():
|
96
|
+
tags.update(dependencies_schema)
|
97
|
+
|
98
|
+
if span._parent is None:
|
99
|
+
trace_info = TraceInfo(
|
100
|
+
trace_id=trace_id,
|
101
|
+
client_request_id=databricks_request_id,
|
102
|
+
# NB: Agent framework populate the MLFLOW_EXPERIMENT_ID environment variable
|
103
|
+
# with the experiment ID to which the model is logged. We don't use the
|
104
|
+
# _get_experiment_id() method because it will fallback to the default
|
105
|
+
# experiment if the MLFLOW_EXPERIMENT_ID is not set.
|
106
|
+
trace_location=TraceLocation.from_experiment_id(MLFLOW_EXPERIMENT_ID.get()),
|
107
|
+
request_time=span.start_time // 1_000_000, # nanosecond to millisecond
|
108
|
+
execution_duration=None,
|
109
|
+
state=TraceState.IN_PROGRESS,
|
110
|
+
trace_metadata=self._get_trace_metadata(),
|
111
|
+
tags=tags,
|
112
|
+
)
|
113
|
+
self._trace_manager.register_trace(span.context.trace_id, trace_info)
|
114
|
+
|
115
|
+
def on_end(self, span: OTelReadableSpan) -> None:
|
116
|
+
"""
|
117
|
+
Handle the end of a span. This method is called when an OpenTelemetry span is ended.
|
118
|
+
|
119
|
+
Args:
|
120
|
+
span: An OpenTelemetry ReadableSpan object that is ended.
|
121
|
+
"""
|
122
|
+
# Processing the trace only when the root span is found.
|
123
|
+
if span._parent is not None:
|
124
|
+
return
|
125
|
+
|
126
|
+
trace_id = get_otel_attribute(span, SpanAttributeKey.REQUEST_ID)
|
127
|
+
with self._trace_manager.get_trace(trace_id) as trace:
|
128
|
+
if trace is None:
|
129
|
+
_logger.debug(f"Trace data with trace ID {trace_id} not found.")
|
130
|
+
return
|
131
|
+
|
132
|
+
trace.info.execution_duration = (span.end_time - span.start_time) // 1_000_000
|
133
|
+
|
134
|
+
# Update trace state from span status, but only if the user hasn't explicitly set
|
135
|
+
# a different trace status
|
136
|
+
update_trace_state_from_span_conditionally(trace, span)
|
137
|
+
|
138
|
+
spans = list(trace.span_dict.values())
|
139
|
+
deduplicate_span_names_in_place(spans)
|
140
|
+
|
141
|
+
# Aggregate token usage information from all spans
|
142
|
+
if usage := aggregate_usage_from_spans(spans):
|
143
|
+
trace.info.request_metadata[TraceMetadataKey.TOKEN_USAGE] = json.dumps(usage)
|
144
|
+
|
145
|
+
super().on_end(span)
|
146
|
+
|
147
|
+
def _get_trace_metadata(self) -> dict[str, str]:
|
148
|
+
metadata = {TRACE_SCHEMA_VERSION_KEY: str(TRACE_SCHEMA_VERSION)}
|
149
|
+
|
150
|
+
context = _try_get_prediction_context()
|
151
|
+
if context:
|
152
|
+
metadata[MLFLOW_DATABRICKS_MODEL_SERVING_ENDPOINT_NAME] = context.endpoint_name or ""
|
153
|
+
|
154
|
+
# The model ID fetch order is
|
155
|
+
# 1. from the context, this could be set by databricks serving
|
156
|
+
# 2. from the active model, this could be set by model loading or with environment variable
|
157
|
+
if context and context.model_id:
|
158
|
+
metadata[TraceMetadataKey.MODEL_ID] = context.model_id
|
159
|
+
_logger.debug(f"Model id fetched from the context: {context.model_id}")
|
160
|
+
else:
|
161
|
+
try:
|
162
|
+
from mlflow.tracking.fluent import _get_active_model_id_global
|
163
|
+
|
164
|
+
if active_model_id := _get_active_model_id_global():
|
165
|
+
metadata[TraceMetadataKey.MODEL_ID] = active_model_id
|
166
|
+
_logger.debug(
|
167
|
+
f"Adding active model ID {active_model_id} to the trace metadata."
|
168
|
+
)
|
169
|
+
except Exception as e:
|
170
|
+
_logger.debug(
|
171
|
+
f"Failed to get model ID from the active model: {e}. "
|
172
|
+
"Skipping adding model ID to trace metadata.",
|
173
|
+
exc_info=True,
|
174
|
+
)
|
175
|
+
return metadata
|
@@ -0,0 +1,47 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from opentelemetry.sdk.trace import Span as OTelSpan
|
4
|
+
from opentelemetry.sdk.trace.export import SpanExporter
|
5
|
+
|
6
|
+
from mlflow.entities.trace_info import TraceInfo
|
7
|
+
from mlflow.entities.trace_location import TraceLocation
|
8
|
+
from mlflow.entities.trace_state import TraceState
|
9
|
+
from mlflow.tracing.processor.base_mlflow import BaseMlflowSpanProcessor
|
10
|
+
from mlflow.tracing.utils import generate_trace_id_v3
|
11
|
+
|
12
|
+
|
13
|
+
class MlflowV3SpanProcessor(BaseMlflowSpanProcessor):
|
14
|
+
"""
|
15
|
+
Defines custom hooks to be executed when a span is started or ended (before exporting).
|
16
|
+
|
17
|
+
This processor is used for exporting traces to MLflow Tracking Server
|
18
|
+
using the V3 trace schema and API.
|
19
|
+
"""
|
20
|
+
|
21
|
+
def __init__(
|
22
|
+
self,
|
23
|
+
span_exporter: SpanExporter,
|
24
|
+
experiment_id: Optional[str] = None,
|
25
|
+
):
|
26
|
+
super().__init__(span_exporter, experiment_id)
|
27
|
+
|
28
|
+
def _start_trace(self, root_span: OTelSpan) -> TraceInfo:
|
29
|
+
"""
|
30
|
+
Create a new TraceInfo object and register it with the trace manager.
|
31
|
+
|
32
|
+
This method is called in the on_start method of the base class.
|
33
|
+
"""
|
34
|
+
trace_info = TraceInfo(
|
35
|
+
trace_id=generate_trace_id_v3(root_span),
|
36
|
+
trace_location=TraceLocation.from_experiment_id(
|
37
|
+
self._get_experiment_id_for_trace(root_span)
|
38
|
+
),
|
39
|
+
request_time=root_span.start_time // 1_000_000, # nanosecond to millisecond
|
40
|
+
execution_duration=None,
|
41
|
+
state=TraceState.IN_PROGRESS,
|
42
|
+
trace_metadata=self._get_basic_trace_metadata(),
|
43
|
+
tags=self._get_basic_trace_tags(root_span),
|
44
|
+
)
|
45
|
+
self._trace_manager.register_trace(root_span.context.trace_id, trace_info)
|
46
|
+
|
47
|
+
return trace_info
|
@@ -0,0 +1,73 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from opentelemetry.context import Context
|
5
|
+
from opentelemetry.sdk.trace import ReadableSpan as OTelReadableSpan
|
6
|
+
from opentelemetry.sdk.trace import Span as OTelSpan
|
7
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter
|
8
|
+
|
9
|
+
from mlflow.entities.trace_info import TraceInfo
|
10
|
+
from mlflow.entities.trace_location import TraceLocation
|
11
|
+
from mlflow.entities.trace_state import TraceState
|
12
|
+
from mlflow.tracing.constant import TRACE_SCHEMA_VERSION, TRACE_SCHEMA_VERSION_KEY, SpanAttributeKey
|
13
|
+
from mlflow.tracing.trace_manager import InMemoryTraceManager
|
14
|
+
from mlflow.tracing.utils import generate_trace_id_v3
|
15
|
+
|
16
|
+
|
17
|
+
class OtelSpanProcessor(BatchSpanProcessor):
|
18
|
+
"""
|
19
|
+
SpanProcessor implementation to export MLflow traces to a OpenTelemetry collector.
|
20
|
+
|
21
|
+
Extending OpenTelemetry BatchSpanProcessor to add some custom hooks to be executed when a span
|
22
|
+
is started or ended (before exporting).
|
23
|
+
"""
|
24
|
+
|
25
|
+
def __init__(self, span_exporter: SpanExporter):
|
26
|
+
super().__init__(span_exporter)
|
27
|
+
# In opentelemetry-sdk 1.34.0, the `span_exporter` field was removed from the
|
28
|
+
# `BatchSpanProcessor` class.
|
29
|
+
# https://github.com/open-telemetry/opentelemetry-python/issues/4616
|
30
|
+
#
|
31
|
+
# The `span_exporter` field was restored as a property in 1.34.1
|
32
|
+
# https://github.com/open-telemetry/opentelemetry-python/pull/4621
|
33
|
+
#
|
34
|
+
# We use a try-except block to maintain compatibility with both versions.
|
35
|
+
try:
|
36
|
+
self.span_exporter = span_exporter
|
37
|
+
except AttributeError:
|
38
|
+
pass
|
39
|
+
self._trace_manager = InMemoryTraceManager.get_instance()
|
40
|
+
|
41
|
+
def on_start(self, span: OTelSpan, parent_context: Optional[Context] = None):
|
42
|
+
"""
|
43
|
+
Handle the start of a span. This method is called when an OpenTelemetry span is started.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
span: An OpenTelemetry Span object that is started.
|
47
|
+
parent_context: The context of the span. Note that this is only passed when the context
|
48
|
+
object is explicitly specified to OpenTelemetry start_span call. If the parent
|
49
|
+
span is obtained from the global context, it won't be passed here so we should not
|
50
|
+
rely on it.
|
51
|
+
"""
|
52
|
+
trace_id = generate_trace_id_v3(span)
|
53
|
+
trace_info = TraceInfo(
|
54
|
+
trace_id=trace_id,
|
55
|
+
trace_location=TraceLocation.from_experiment_id(None),
|
56
|
+
request_time=span.start_time // 1_000_000, # nanosecond to millisecond
|
57
|
+
execution_duration=None,
|
58
|
+
state=TraceState.IN_PROGRESS,
|
59
|
+
trace_metadata={TRACE_SCHEMA_VERSION_KEY: str(TRACE_SCHEMA_VERSION)},
|
60
|
+
tags={},
|
61
|
+
)
|
62
|
+
span.set_attribute(SpanAttributeKey.REQUEST_ID, json.dumps(trace_id))
|
63
|
+
|
64
|
+
self._trace_manager.register_trace(span.context.trace_id, trace_info)
|
65
|
+
|
66
|
+
super().on_start(span, parent_context)
|
67
|
+
|
68
|
+
def on_end(self, span: OTelReadableSpan):
|
69
|
+
# Pops the trace entry from the in-memory trace manager to avoid memory leak
|
70
|
+
if span._parent is None:
|
71
|
+
self._trace_manager.pop_trace(span.context.trace_id)
|
72
|
+
|
73
|
+
super().on_end(span)
|