honeycomb-api 0.1.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.
- honeycomb/__init__.py +217 -0
- honeycomb/_generated/__init__.py +8 -0
- honeycomb/_generated/api/__init__.py +1 -0
- honeycomb/_generated/api/auth/__init__.py +0 -0
- honeycomb/_generated/api/auth/get_auth.py +172 -0
- honeycomb/_generated/api/auth/get_v2_auth.py +168 -0
- honeycomb/_generated/api/boards/__init__.py +0 -0
- honeycomb/_generated/api/boards/create_board.py +217 -0
- honeycomb/_generated/api/boards/create_board_view.py +237 -0
- honeycomb/_generated/api/boards/delete_board.py +191 -0
- honeycomb/_generated/api/boards/delete_board_view.py +210 -0
- honeycomb/_generated/api/boards/get_board.py +208 -0
- honeycomb/_generated/api/boards/get_board_view.py +214 -0
- honeycomb/_generated/api/boards/list_board_views.py +206 -0
- honeycomb/_generated/api/boards/list_boards.py +177 -0
- honeycomb/_generated/api/boards/update_board.py +238 -0
- honeycomb/_generated/api/boards/update_board_view.py +250 -0
- honeycomb/_generated/api/burn_alerts/__init__.py +0 -0
- honeycomb/_generated/api/burn_alerts/create_burn_alert.py +224 -0
- honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +204 -0
- honeycomb/_generated/api/burn_alerts/get_burn_alert.py +208 -0
- honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +220 -0
- honeycomb/_generated/api/calculated_fields/__init__.py +0 -0
- honeycomb/_generated/api/calculated_fields/create_calculated_field.py +239 -0
- honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +225 -0
- honeycomb/_generated/api/calculated_fields/get_calculated_field.py +207 -0
- honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +252 -0
- honeycomb/_generated/api/calculated_fields/update_calculated_field.py +242 -0
- honeycomb/_generated/api/columns/__init__.py +0 -0
- honeycomb/_generated/api/columns/create_column.py +241 -0
- honeycomb/_generated/api/columns/delete_column.py +221 -0
- honeycomb/_generated/api/columns/get_column.py +206 -0
- honeycomb/_generated/api/columns/list_columns.py +256 -0
- honeycomb/_generated/api/columns/update_column.py +242 -0
- honeycomb/_generated/api/dataset_definitions/__init__.py +0 -0
- honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +193 -0
- honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +235 -0
- honeycomb/_generated/api/datasets/__init__.py +0 -0
- honeycomb/_generated/api/datasets/create_dataset.py +227 -0
- honeycomb/_generated/api/datasets/delete_dataset.py +251 -0
- honeycomb/_generated/api/datasets/get_dataset.py +195 -0
- honeycomb/_generated/api/datasets/list_datasets.py +177 -0
- honeycomb/_generated/api/datasets/update_dataset.py +217 -0
- honeycomb/_generated/api/enhance/__init__.py +0 -0
- honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +231 -0
- honeycomb/_generated/api/environments/__init__.py +0 -0
- honeycomb/_generated/api/environments/create_environment.py +247 -0
- honeycomb/_generated/api/environments/delete_environment.py +245 -0
- honeycomb/_generated/api/environments/get_environment.py +213 -0
- honeycomb/_generated/api/environments/list_environments.py +245 -0
- honeycomb/_generated/api/environments/update_environment.py +254 -0
- honeycomb/_generated/api/events/__init__.py +0 -0
- honeycomb/_generated/api/events/create_event.py +269 -0
- honeycomb/_generated/api/events/create_events.py +314 -0
- honeycomb/_generated/api/key_management/__init__.py +0 -0
- honeycomb/_generated/api/key_management/create_api_key.py +286 -0
- honeycomb/_generated/api/key_management/delete_api_key.py +223 -0
- honeycomb/_generated/api/key_management/get_api_key.py +225 -0
- honeycomb/_generated/api/key_management/list_api_keys.py +281 -0
- honeycomb/_generated/api/key_management/update_api_key.py +270 -0
- honeycomb/_generated/api/kinesis_events/__init__.py +0 -0
- honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +220 -0
- honeycomb/_generated/api/marker_settings/__init__.py +0 -0
- honeycomb/_generated/api/marker_settings/create_marker_setting.py +209 -0
- honeycomb/_generated/api/marker_settings/delete_marker_settings.py +194 -0
- honeycomb/_generated/api/marker_settings/list_marker_settings.py +186 -0
- honeycomb/_generated/api/marker_settings/update_marker_settings.py +230 -0
- honeycomb/_generated/api/markers/__init__.py +0 -0
- honeycomb/_generated/api/markers/create_marker.py +220 -0
- honeycomb/_generated/api/markers/create_marker_v2.py +253 -0
- honeycomb/_generated/api/markers/delete_marker.py +200 -0
- honeycomb/_generated/api/markers/get_marker.py +194 -0
- honeycomb/_generated/api/markers/update_marker.py +233 -0
- honeycomb/_generated/api/markers/update_marker_v2.py +262 -0
- honeycomb/_generated/api/pipelines/__init__.py +0 -0
- honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +306 -0
- honeycomb/_generated/api/pipelines/record_pipeline_usage.py +244 -0
- honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +261 -0
- honeycomb/_generated/api/queries/__init__.py +0 -0
- honeycomb/_generated/api/queries/create_query.py +224 -0
- honeycomb/_generated/api/queries/get_query.py +208 -0
- honeycomb/_generated/api/query_annotations/__init__.py +0 -0
- honeycomb/_generated/api/query_annotations/create_query_annotation.py +226 -0
- honeycomb/_generated/api/query_annotations/delete_query_annotation.py +198 -0
- honeycomb/_generated/api/query_annotations/get_query_annotation.py +202 -0
- honeycomb/_generated/api/query_annotations/list_query_annotations.py +217 -0
- honeycomb/_generated/api/query_annotations/update_query_annotation.py +237 -0
- honeycomb/_generated/api/query_data/__init__.py +0 -0
- honeycomb/_generated/api/query_data/create_query_result.py +247 -0
- honeycomb/_generated/api/query_data/get_query_result.py +208 -0
- honeycomb/_generated/api/recipients/__init__.py +0 -0
- honeycomb/_generated/api/recipients/create_recipient.py +317 -0
- honeycomb/_generated/api/recipients/delete_recipient.py +199 -0
- honeycomb/_generated/api/recipients/get_recipient.py +252 -0
- honeycomb/_generated/api/recipients/list_recipients.py +230 -0
- honeycomb/_generated/api/recipients/update_recipient.py +323 -0
- honeycomb/_generated/api/reporting/__init__.py +0 -0
- honeycomb/_generated/api/reporting/get_slo_history.py +218 -0
- honeycomb/_generated/api/service_maps/__init__.py +0 -0
- honeycomb/_generated/api/service_maps/create_map_dependency_request.py +252 -0
- honeycomb/_generated/api/service_maps/get_map_dependencies.py +265 -0
- honeycomb/_generated/api/sl_os/__init__.py +0 -0
- honeycomb/_generated/api/sl_os/create_slo.py +229 -0
- honeycomb/_generated/api/sl_os/delete_slo.py +210 -0
- honeycomb/_generated/api/sl_os/get_slo.py +256 -0
- honeycomb/_generated/api/sl_os/list_slos.py +210 -0
- honeycomb/_generated/api/sl_os/update_slo.py +242 -0
- honeycomb/_generated/api/triggers/__init__.py +0 -0
- honeycomb/_generated/api/triggers/create_trigger.py +250 -0
- honeycomb/_generated/api/triggers/delete_trigger.py +204 -0
- honeycomb/_generated/api/triggers/get_trigger.py +214 -0
- honeycomb/_generated/api/triggers/list_triggers.py +206 -0
- honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +208 -0
- honeycomb/_generated/api/triggers/update_trigger.py +248 -0
- honeycomb/_generated/client.py +271 -0
- honeycomb/_generated/errors.py +14 -0
- honeycomb/_generated/models/__init__.py +561 -0
- honeycomb/_generated/models/api_key_create_request.py +78 -0
- honeycomb/_generated/models/api_key_create_request_data.py +130 -0
- honeycomb/_generated/models/api_key_create_request_data_relationships.py +78 -0
- honeycomb/_generated/models/api_key_create_request_data_type.py +7 -0
- honeycomb/_generated/models/api_key_list_response.py +112 -0
- honeycomb/_generated/models/api_key_object.py +189 -0
- honeycomb/_generated/models/api_key_object_links.py +74 -0
- honeycomb/_generated/models/api_key_object_relationships.py +150 -0
- honeycomb/_generated/models/api_key_object_type.py +7 -0
- honeycomb/_generated/models/api_key_response.py +78 -0
- honeycomb/_generated/models/api_key_update_request.py +104 -0
- honeycomb/_generated/models/auth.py +140 -0
- honeycomb/_generated/models/auth_api_key_access.py +154 -0
- honeycomb/_generated/models/auth_environment.py +82 -0
- honeycomb/_generated/models/auth_team.py +82 -0
- honeycomb/_generated/models/auth_type.py +8 -0
- honeycomb/_generated/models/auth_v2_response.py +108 -0
- honeycomb/_generated/models/auth_v2_response_data.py +122 -0
- honeycomb/_generated/models/auth_v2_response_data_attributes.py +141 -0
- honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +7 -0
- honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +107 -0
- honeycomb/_generated/models/auth_v2_response_data_relationships.py +59 -0
- honeycomb/_generated/models/auth_v2_response_data_type.py +7 -0
- honeycomb/_generated/models/base_trigger.py +367 -0
- honeycomb/_generated/models/base_trigger_alert_type.py +8 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +92 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +10 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +8 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule.py +83 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +8 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +103 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +13 -0
- honeycomb/_generated/models/base_trigger_threshold.py +95 -0
- honeycomb/_generated/models/base_trigger_threshold_op.py +10 -0
- honeycomb/_generated/models/batch_event.py +110 -0
- honeycomb/_generated/models/board.py +276 -0
- honeycomb/_generated/models/board_layout_generation.py +8 -0
- honeycomb/_generated/models/board_links.py +74 -0
- honeycomb/_generated/models/board_panel_position.py +104 -0
- honeycomb/_generated/models/board_query_visualization_settings.py +141 -0
- honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +113 -0
- honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +13 -0
- honeycomb/_generated/models/board_type.py +7 -0
- honeycomb/_generated/models/board_view_filter.py +93 -0
- honeycomb/_generated/models/board_view_filter_operation.py +22 -0
- honeycomb/_generated/models/board_view_response.py +111 -0
- honeycomb/_generated/models/budget_rate.py +189 -0
- honeycomb/_generated/models/budget_rate_alert_type.py +8 -0
- honeycomb/_generated/models/burn_alert_shared_params.py +136 -0
- honeycomb/_generated/models/calculated_field.py +117 -0
- honeycomb/_generated/models/configuration_key_attributes.py +140 -0
- honeycomb/_generated/models/configuration_key_attributes_key_type.py +7 -0
- honeycomb/_generated/models/configuration_key_attributes_timestamps.py +107 -0
- honeycomb/_generated/models/create_board_view_request.py +96 -0
- honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +232 -0
- honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +74 -0
- honeycomb/_generated/models/create_column.py +149 -0
- honeycomb/_generated/models/create_column_type.py +11 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +78 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +90 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +97 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +88 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +89 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +89 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +97 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +102 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +7 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +105 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +87 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +73 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +7 -0
- honeycomb/_generated/models/create_environment_request.py +78 -0
- honeycomb/_generated/models/create_environment_request_data.py +90 -0
- honeycomb/_generated/models/create_environment_request_data_attributes.py +102 -0
- honeycomb/_generated/models/create_environment_request_data_type.py +7 -0
- honeycomb/_generated/models/create_events_content_encoding.py +8 -0
- honeycomb/_generated/models/create_events_response_200_item.py +82 -0
- honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +217 -0
- honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +74 -0
- honeycomb/_generated/models/create_map_dependencies_request.py +128 -0
- honeycomb/_generated/models/create_map_dependencies_response.py +97 -0
- honeycomb/_generated/models/create_map_dependencies_response_status.py +9 -0
- honeycomb/_generated/models/create_pipeline_health_record_request.py +78 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data.py +98 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +88 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +88 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +89 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +89 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +97 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +102 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +7 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +105 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +87 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +73 -0
- honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +7 -0
- honeycomb/_generated/models/create_query_result_request.py +118 -0
- honeycomb/_generated/models/dataset.py +183 -0
- honeycomb/_generated/models/dataset_creation_payload.py +93 -0
- honeycomb/_generated/models/dataset_definition_type_1.py +96 -0
- honeycomb/_generated/models/dataset_definition_type_1_column_type.py +8 -0
- honeycomb/_generated/models/dataset_definitions.py +599 -0
- honeycomb/_generated/models/dataset_relationship.py +79 -0
- honeycomb/_generated/models/dataset_relationship_data.py +82 -0
- honeycomb/_generated/models/dataset_relationship_data_type.py +7 -0
- honeycomb/_generated/models/dataset_settings.py +73 -0
- honeycomb/_generated/models/dataset_update_payload.py +105 -0
- honeycomb/_generated/models/dataset_update_payload_settings.py +73 -0
- honeycomb/_generated/models/detailed_error.py +115 -0
- honeycomb/_generated/models/email_recipient.py +160 -0
- honeycomb/_generated/models/email_recipient_details.py +71 -0
- honeycomb/_generated/models/email_recipient_type.py +7 -0
- honeycomb/_generated/models/environment.py +112 -0
- honeycomb/_generated/models/environment_attributes.py +140 -0
- honeycomb/_generated/models/environment_attributes_color_type_1.py +7 -0
- honeycomb/_generated/models/environment_attributes_settings.py +70 -0
- honeycomb/_generated/models/environment_color.py +16 -0
- honeycomb/_generated/models/environment_links.py +70 -0
- honeycomb/_generated/models/environment_list_response.py +112 -0
- honeycomb/_generated/models/environment_relationship.py +79 -0
- honeycomb/_generated/models/environment_relationship_data.py +82 -0
- honeycomb/_generated/models/environment_relationship_data_type.py +7 -0
- honeycomb/_generated/models/environment_response.py +78 -0
- honeycomb/_generated/models/environment_type.py +7 -0
- honeycomb/_generated/models/error.py +74 -0
- honeycomb/_generated/models/event.py +71 -0
- honeycomb/_generated/models/exhaustion_time.py +174 -0
- honeycomb/_generated/models/exhaustion_time_alert_type.py +8 -0
- honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +198 -0
- honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +77 -0
- honeycomb/_generated/models/filter_op.py +22 -0
- honeycomb/_generated/models/get_map_dependencies_response.py +169 -0
- honeycomb/_generated/models/get_map_dependencies_response_status.py +9 -0
- honeycomb/_generated/models/having_calculate_op.py +29 -0
- honeycomb/_generated/models/having_op.py +12 -0
- honeycomb/_generated/models/included_resource.py +106 -0
- honeycomb/_generated/models/included_resource_attributes.py +62 -0
- honeycomb/_generated/models/ingest_key_attributes.py +153 -0
- honeycomb/_generated/models/ingest_key_attributes_key_type.py +7 -0
- honeycomb/_generated/models/ingest_key_attributes_permissions.py +74 -0
- honeycomb/_generated/models/ingest_key_attributes_timestamps.py +107 -0
- honeycomb/_generated/models/ingest_key_type.py +90 -0
- honeycomb/_generated/models/ingest_key_type_key_type.py +7 -0
- honeycomb/_generated/models/jsonapi_error_source.py +92 -0
- honeycomb/_generated/models/kinesis_event.py +111 -0
- honeycomb/_generated/models/kinesis_event_record.py +73 -0
- honeycomb/_generated/models/kinesis_response.py +91 -0
- honeycomb/_generated/models/list_api_keys_filtertype.py +8 -0
- honeycomb/_generated/models/map_dependency.py +118 -0
- honeycomb/_generated/models/map_node.py +97 -0
- honeycomb/_generated/models/map_node_type.py +7 -0
- honeycomb/_generated/models/marker.py +151 -0
- honeycomb/_generated/models/marker_create_request.py +78 -0
- honeycomb/_generated/models/marker_create_request_data.py +104 -0
- honeycomb/_generated/models/marker_create_request_data_attributes.py +110 -0
- honeycomb/_generated/models/marker_create_request_data_relationships.py +92 -0
- honeycomb/_generated/models/marker_create_request_data_type.py +7 -0
- honeycomb/_generated/models/marker_object.py +136 -0
- honeycomb/_generated/models/marker_object_attributes.py +146 -0
- honeycomb/_generated/models/marker_object_attributes_timestamps.py +107 -0
- honeycomb/_generated/models/marker_object_links.py +74 -0
- honeycomb/_generated/models/marker_object_relationships.py +111 -0
- honeycomb/_generated/models/marker_object_relationships_dataset.py +104 -0
- honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +94 -0
- honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +7 -0
- honeycomb/_generated/models/marker_object_type.py +7 -0
- honeycomb/_generated/models/marker_response.py +78 -0
- honeycomb/_generated/models/marker_setting.py +125 -0
- honeycomb/_generated/models/marker_update_request.py +78 -0
- honeycomb/_generated/models/marker_update_request_data.py +104 -0
- honeycomb/_generated/models/marker_update_request_data_attributes.py +111 -0
- honeycomb/_generated/models/marker_update_request_data_relationships.py +92 -0
- honeycomb/_generated/models/marker_update_request_data_type.py +7 -0
- honeycomb/_generated/models/ms_teams_recipient.py +161 -0
- honeycomb/_generated/models/ms_teams_recipient_details.py +80 -0
- honeycomb/_generated/models/ms_teams_recipient_type.py +7 -0
- honeycomb/_generated/models/ms_teams_workflow_recipient.py +161 -0
- honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +80 -0
- honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +7 -0
- honeycomb/_generated/models/notification_recipient.py +131 -0
- honeycomb/_generated/models/notification_recipient_details.py +117 -0
- honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +10 -0
- honeycomb/_generated/models/notification_recipient_details_variables_item.py +81 -0
- honeycomb/_generated/models/pager_duty_recipient.py +160 -0
- honeycomb/_generated/models/pager_duty_recipient_details.py +79 -0
- honeycomb/_generated/models/pager_duty_recipient_type.py +7 -0
- honeycomb/_generated/models/pagination_links.py +80 -0
- honeycomb/_generated/models/payload_template.py +73 -0
- honeycomb/_generated/models/pipeline_configuration_response.py +112 -0
- honeycomb/_generated/models/pipeline_configuration_response_attributes.py +101 -0
- honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +85 -0
- honeycomb/_generated/models/pipeline_configuration_response_links.py +73 -0
- honeycomb/_generated/models/pipeline_configuration_response_type.py +7 -0
- honeycomb/_generated/models/pipeline_configuration_rollout.py +112 -0
- honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +75 -0
- honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +12 -0
- honeycomb/_generated/models/pipeline_configuration_rollout_links.py +73 -0
- honeycomb/_generated/models/pipeline_configuration_rollout_type.py +7 -0
- honeycomb/_generated/models/preset_filter.py +78 -0
- honeycomb/_generated/models/query.py +346 -0
- honeycomb/_generated/models/query_annotation.py +166 -0
- honeycomb/_generated/models/query_annotation_source.py +8 -0
- honeycomb/_generated/models/query_calculated_fields_item.py +80 -0
- honeycomb/_generated/models/query_calculations_item.py +98 -0
- honeycomb/_generated/models/query_compare_time_offset_seconds.py +14 -0
- honeycomb/_generated/models/query_filter_combination.py +8 -0
- honeycomb/_generated/models/query_filters_item.py +126 -0
- honeycomb/_generated/models/query_havings_item.py +128 -0
- honeycomb/_generated/models/query_op.py +30 -0
- honeycomb/_generated/models/query_orders_item.py +115 -0
- honeycomb/_generated/models/query_orders_item_order.py +8 -0
- honeycomb/_generated/models/query_panel.py +114 -0
- honeycomb/_generated/models/query_panel_query_panel.py +143 -0
- honeycomb/_generated/models/query_panel_query_panel_query_style.py +9 -0
- honeycomb/_generated/models/query_result.py +130 -0
- honeycomb/_generated/models/query_result_details.py +156 -0
- honeycomb/_generated/models/query_result_details_data.py +188 -0
- honeycomb/_generated/models/query_result_details_links.py +85 -0
- honeycomb/_generated/models/query_result_links.py +85 -0
- honeycomb/_generated/models/query_results_data.py +89 -0
- honeycomb/_generated/models/query_results_data_data.py +71 -0
- honeycomb/_generated/models/query_results_series.py +97 -0
- honeycomb/_generated/models/recipient_properties.py +137 -0
- honeycomb/_generated/models/recipient_type.py +12 -0
- honeycomb/_generated/models/slack_recipient.py +160 -0
- honeycomb/_generated/models/slack_recipient_details.py +71 -0
- honeycomb/_generated/models/slack_recipient_type.py +7 -0
- honeycomb/_generated/models/slo.py +245 -0
- honeycomb/_generated/models/slo_create.py +245 -0
- honeycomb/_generated/models/slo_create_sli.py +75 -0
- honeycomb/_generated/models/slo_detailed_response.py +312 -0
- honeycomb/_generated/models/slo_detailed_response_status.py +10 -0
- honeycomb/_generated/models/slo_history.py +94 -0
- honeycomb/_generated/models/slo_history_request.py +93 -0
- honeycomb/_generated/models/slo_history_response.py +91 -0
- honeycomb/_generated/models/slo_panel.py +114 -0
- honeycomb/_generated/models/slo_panel_slo_panel.py +75 -0
- honeycomb/_generated/models/slo_sli.py +74 -0
- honeycomb/_generated/models/tag.py +79 -0
- honeycomb/_generated/models/team_relationship.py +78 -0
- honeycomb/_generated/models/team_relationship_team.py +78 -0
- honeycomb/_generated/models/team_relationship_team_data.py +82 -0
- honeycomb/_generated/models/team_relationship_team_data_type.py +7 -0
- honeycomb/_generated/models/template_variable_definition.py +81 -0
- honeycomb/_generated/models/text_panel.py +114 -0
- honeycomb/_generated/models/text_panel_text_panel.py +71 -0
- honeycomb/_generated/models/trigger_response.py +399 -0
- honeycomb/_generated/models/trigger_with_inline_query.py +390 -0
- honeycomb/_generated/models/trigger_with_inline_query_query.py +60 -0
- honeycomb/_generated/models/trigger_with_query_reference.py +376 -0
- honeycomb/_generated/models/update_board_view_request.py +107 -0
- honeycomb/_generated/models/update_environment_request.py +78 -0
- honeycomb/_generated/models/update_environment_request_data.py +98 -0
- honeycomb/_generated/models/update_environment_request_data_attributes.py +118 -0
- honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +73 -0
- honeycomb/_generated/models/update_environment_request_data_type.py +7 -0
- honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +202 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout.py +98 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +75 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +12 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +78 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +98 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +75 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +12 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +7 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +78 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +7 -0
- honeycomb/_generated/models/user_relationship.py +78 -0
- honeycomb/_generated/models/user_relationship_data.py +82 -0
- honeycomb/_generated/models/user_relationship_data_type.py +7 -0
- honeycomb/_generated/models/validation_error.py +145 -0
- honeycomb/_generated/models/validation_error_type_detail_item.py +103 -0
- honeycomb/_generated/models/validation_error_type_detail_item_code.py +10 -0
- honeycomb/_generated/models/webhook_header.py +81 -0
- honeycomb/_generated/models/webhook_recipient.py +160 -0
- honeycomb/_generated/models/webhook_recipient_details.py +142 -0
- honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +117 -0
- honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +126 -0
- honeycomb/_generated/models/webhook_recipient_type.py +7 -0
- honeycomb/_generated/py.typed +1 -0
- honeycomb/_generated/types.py +46 -0
- honeycomb/auth.py +152 -0
- honeycomb/client.py +736 -0
- honeycomb/exceptions.py +236 -0
- honeycomb/models/__init__.py +157 -0
- honeycomb/models/api_keys.py +81 -0
- honeycomb/models/board_builder.py +387 -0
- honeycomb/models/boards.py +86 -0
- honeycomb/models/burn_alerts.py +124 -0
- honeycomb/models/columns.py +59 -0
- honeycomb/models/datasets.py +51 -0
- honeycomb/models/derived_columns.py +107 -0
- honeycomb/models/environments.py +106 -0
- honeycomb/models/events.py +35 -0
- honeycomb/models/marker_builder.py +136 -0
- honeycomb/models/markers.py +73 -0
- honeycomb/models/queries.py +210 -0
- honeycomb/models/query_annotations.py +63 -0
- honeycomb/models/query_builder.py +840 -0
- honeycomb/models/recipient_builder.py +248 -0
- honeycomb/models/recipients.py +43 -0
- honeycomb/models/service_map_dependencies.py +126 -0
- honeycomb/models/slo_builder.py +463 -0
- honeycomb/models/slos.py +66 -0
- honeycomb/models/tags_mixin.py +79 -0
- honeycomb/models/trigger_builder.py +561 -0
- honeycomb/models/triggers.py +208 -0
- honeycomb/resources/__init__.py +35 -0
- honeycomb/resources/_recipient_utils.py +156 -0
- honeycomb/resources/api_keys.py +303 -0
- honeycomb/resources/base.py +142 -0
- honeycomb/resources/boards.py +350 -0
- honeycomb/resources/burn_alerts.py +205 -0
- honeycomb/resources/columns.py +185 -0
- honeycomb/resources/datasets.py +163 -0
- honeycomb/resources/derived_columns.py +233 -0
- honeycomb/resources/environments.py +295 -0
- honeycomb/resources/events.py +156 -0
- honeycomb/resources/markers.py +334 -0
- honeycomb/resources/queries.py +256 -0
- honeycomb/resources/query_annotations.py +207 -0
- honeycomb/resources/query_results.py +886 -0
- honeycomb/resources/recipients.py +202 -0
- honeycomb/resources/service_map_dependencies.py +389 -0
- honeycomb/resources/slos.py +353 -0
- honeycomb/resources/triggers.py +284 -0
- honeycomb/tools/__init__.py +85 -0
- honeycomb/tools/__main__.py +204 -0
- honeycomb/tools/builders.py +512 -0
- honeycomb/tools/descriptions.py +523 -0
- honeycomb/tools/executor.py +860 -0
- honeycomb/tools/generator.py +2386 -0
- honeycomb/tools/schemas.py +184 -0
- honeycomb_api-0.1.0.dist-info/METADATA +451 -0
- honeycomb_api-0.1.0.dist-info/RECORD +453 -0
- honeycomb_api-0.1.0.dist-info/WHEEL +4 -0
- honeycomb_api-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
"""Builder pattern for Honeycomb Triggers with integrated query building."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
7
|
+
|
|
8
|
+
from typing_extensions import Self
|
|
9
|
+
|
|
10
|
+
from .query_builder import QueryBuilder
|
|
11
|
+
from .recipient_builder import RecipientMixin
|
|
12
|
+
from .tags_mixin import TagsMixin
|
|
13
|
+
from .triggers import (
|
|
14
|
+
TriggerAlertType,
|
|
15
|
+
TriggerCreate,
|
|
16
|
+
TriggerQuery,
|
|
17
|
+
TriggerThreshold,
|
|
18
|
+
TriggerThresholdOp,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class TriggerBundle:
|
|
27
|
+
"""Bundle for trigger creation with inline recipients.
|
|
28
|
+
|
|
29
|
+
Orchestrates:
|
|
30
|
+
1. Create inline recipients via Recipients API
|
|
31
|
+
2. Create trigger with recipient IDs
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
dataset: Dataset slug or "__all__" for environment-wide
|
|
35
|
+
trigger: The TriggerCreate object
|
|
36
|
+
inline_recipients: Recipients without 'id' field (need creation)
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
dataset: str
|
|
40
|
+
trigger: TriggerCreate
|
|
41
|
+
inline_recipients: list[dict[str, Any]]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class TriggerBuilder(QueryBuilder, RecipientMixin, TagsMixin):
|
|
45
|
+
"""Fluent builder for triggers with integrated query building.
|
|
46
|
+
|
|
47
|
+
Extends QueryBuilder with trigger-specific constraints:
|
|
48
|
+
- Only one calculation allowed
|
|
49
|
+
- Time range limited to 3600 seconds (1 hour)
|
|
50
|
+
- No absolute time ranges (start_time/end_time)
|
|
51
|
+
- Dataset is optional (can be dataset-scoped or environment-wide)
|
|
52
|
+
|
|
53
|
+
Example - Dataset-scoped trigger:
|
|
54
|
+
>>> trigger = (
|
|
55
|
+
... TriggerBuilder("High Error Rate")
|
|
56
|
+
... .dataset("api-logs")
|
|
57
|
+
... .last_30_minutes()
|
|
58
|
+
... .count()
|
|
59
|
+
... .gte("status", 500)
|
|
60
|
+
... .threshold_gt(100)
|
|
61
|
+
... .every_5_minutes()
|
|
62
|
+
... .email("oncall@example.com")
|
|
63
|
+
... .slack("#alerts")
|
|
64
|
+
... .build()
|
|
65
|
+
... )
|
|
66
|
+
>>> await client.triggers.create_async(trigger.get_dataset(), trigger)
|
|
67
|
+
|
|
68
|
+
Example - Environment-wide trigger:
|
|
69
|
+
>>> trigger = (
|
|
70
|
+
... TriggerBuilder("Global Error Spike")
|
|
71
|
+
... .environment_wide()
|
|
72
|
+
... .last_10_minutes()
|
|
73
|
+
... .count()
|
|
74
|
+
... .eq("level", "error")
|
|
75
|
+
... .threshold_gt(1000)
|
|
76
|
+
... .every_minute()
|
|
77
|
+
... .pagerduty("routing-key-123", severity="critical")
|
|
78
|
+
... .build()
|
|
79
|
+
... )
|
|
80
|
+
>>> await client.triggers.create_environment_wide_async(trigger)
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
def __init__(self, name: str):
|
|
84
|
+
"""Initialize TriggerBuilder with a name.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
name: Human-readable name for the trigger.
|
|
88
|
+
"""
|
|
89
|
+
QueryBuilder.__init__(self)
|
|
90
|
+
RecipientMixin.__init__(self)
|
|
91
|
+
TagsMixin.__init__(self)
|
|
92
|
+
self._name = name
|
|
93
|
+
self._description: str | None = None
|
|
94
|
+
self._dataset: str | None = None # None = environment-wide
|
|
95
|
+
self._threshold_op: TriggerThresholdOp | None = None
|
|
96
|
+
self._threshold_value: float | None = None
|
|
97
|
+
self._exceeded_limit: int | None = None
|
|
98
|
+
self._frequency: int = 900 # Default 15 minutes
|
|
99
|
+
self._alert_type: TriggerAlertType = TriggerAlertType.ON_CHANGE
|
|
100
|
+
self._disabled: bool = False
|
|
101
|
+
self._baseline_details: dict[str, int | str] | None = None
|
|
102
|
+
|
|
103
|
+
# -------------------------------------------------------------------------
|
|
104
|
+
# Scope
|
|
105
|
+
# -------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
def description(self, desc: str) -> Self:
|
|
108
|
+
"""Set trigger description.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
desc: Longer description for the trigger.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Self for method chaining.
|
|
115
|
+
"""
|
|
116
|
+
self._description = desc
|
|
117
|
+
return self
|
|
118
|
+
|
|
119
|
+
def dataset(self, dataset_slug: str) -> Self:
|
|
120
|
+
"""Scope trigger to a specific dataset.
|
|
121
|
+
|
|
122
|
+
If not called, trigger will be environment-wide.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
dataset_slug: Dataset slug to scope trigger to.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
Self for method chaining.
|
|
129
|
+
"""
|
|
130
|
+
self._dataset = dataset_slug
|
|
131
|
+
return self
|
|
132
|
+
|
|
133
|
+
def environment_wide(self) -> Self:
|
|
134
|
+
"""Explicitly mark trigger as environment-wide (no dataset).
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Self for method chaining.
|
|
138
|
+
"""
|
|
139
|
+
self._dataset = None
|
|
140
|
+
return self
|
|
141
|
+
|
|
142
|
+
# -------------------------------------------------------------------------
|
|
143
|
+
# Threshold shortcuts
|
|
144
|
+
# -------------------------------------------------------------------------
|
|
145
|
+
|
|
146
|
+
def threshold_gt(self, value: float) -> Self:
|
|
147
|
+
"""Trigger when value > threshold.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
value: Threshold value.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
Self for method chaining.
|
|
154
|
+
"""
|
|
155
|
+
self._threshold_op = TriggerThresholdOp.GREATER_THAN
|
|
156
|
+
self._threshold_value = value
|
|
157
|
+
return self
|
|
158
|
+
|
|
159
|
+
def threshold_gte(self, value: float) -> Self:
|
|
160
|
+
"""Trigger when value >= threshold.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
value: Threshold value.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Self for method chaining.
|
|
167
|
+
"""
|
|
168
|
+
self._threshold_op = TriggerThresholdOp.GREATER_THAN_OR_EQUAL
|
|
169
|
+
self._threshold_value = value
|
|
170
|
+
return self
|
|
171
|
+
|
|
172
|
+
def threshold_lt(self, value: float) -> Self:
|
|
173
|
+
"""Trigger when value < threshold.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
value: Threshold value.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Self for method chaining.
|
|
180
|
+
"""
|
|
181
|
+
self._threshold_op = TriggerThresholdOp.LESS_THAN
|
|
182
|
+
self._threshold_value = value
|
|
183
|
+
return self
|
|
184
|
+
|
|
185
|
+
def threshold_lte(self, value: float) -> Self:
|
|
186
|
+
"""Trigger when value <= threshold.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
value: Threshold value.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
Self for method chaining.
|
|
193
|
+
"""
|
|
194
|
+
self._threshold_op = TriggerThresholdOp.LESS_THAN_OR_EQUAL
|
|
195
|
+
self._threshold_value = value
|
|
196
|
+
return self
|
|
197
|
+
|
|
198
|
+
def exceeded_limit(self, times: int) -> Self:
|
|
199
|
+
"""Require threshold to be exceeded N times before alerting.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
times: Number of times threshold must be exceeded (1-5).
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
Self for method chaining.
|
|
206
|
+
|
|
207
|
+
Raises:
|
|
208
|
+
ValueError: If times is not between 1 and 5.
|
|
209
|
+
"""
|
|
210
|
+
if not 1 <= times <= 5:
|
|
211
|
+
raise ValueError("exceeded_limit must be between 1 and 5")
|
|
212
|
+
self._exceeded_limit = times
|
|
213
|
+
return self
|
|
214
|
+
|
|
215
|
+
# -------------------------------------------------------------------------
|
|
216
|
+
# Frequency presets
|
|
217
|
+
# -------------------------------------------------------------------------
|
|
218
|
+
|
|
219
|
+
def every_minute(self) -> Self:
|
|
220
|
+
"""Check trigger every minute (60 seconds).
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Self for method chaining.
|
|
224
|
+
"""
|
|
225
|
+
self._frequency = 60
|
|
226
|
+
return self
|
|
227
|
+
|
|
228
|
+
def every_5_minutes(self) -> Self:
|
|
229
|
+
"""Check trigger every 5 minutes (300 seconds).
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
Self for method chaining.
|
|
233
|
+
"""
|
|
234
|
+
self._frequency = 300
|
|
235
|
+
return self
|
|
236
|
+
|
|
237
|
+
def every_15_minutes(self) -> Self:
|
|
238
|
+
"""Check trigger every 15 minutes (900 seconds) - default.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
Self for method chaining.
|
|
242
|
+
"""
|
|
243
|
+
self._frequency = 900
|
|
244
|
+
return self
|
|
245
|
+
|
|
246
|
+
def every_30_minutes(self) -> Self:
|
|
247
|
+
"""Check trigger every 30 minutes (1800 seconds).
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Self for method chaining.
|
|
251
|
+
"""
|
|
252
|
+
self._frequency = 1800
|
|
253
|
+
return self
|
|
254
|
+
|
|
255
|
+
def every_hour(self) -> Self:
|
|
256
|
+
"""Check trigger every hour (3600 seconds).
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
Self for method chaining.
|
|
260
|
+
"""
|
|
261
|
+
self._frequency = 3600
|
|
262
|
+
return self
|
|
263
|
+
|
|
264
|
+
def frequency(self, seconds: int) -> Self:
|
|
265
|
+
"""Set custom frequency in seconds (60-86400).
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
seconds: Check frequency in seconds (60-86400).
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
Self for method chaining.
|
|
272
|
+
|
|
273
|
+
Raises:
|
|
274
|
+
ValueError: If frequency is outside valid range.
|
|
275
|
+
"""
|
|
276
|
+
if not 60 <= seconds <= 86400:
|
|
277
|
+
raise ValueError("Frequency must be between 60 and 86400 seconds")
|
|
278
|
+
self._frequency = seconds
|
|
279
|
+
return self
|
|
280
|
+
|
|
281
|
+
# -------------------------------------------------------------------------
|
|
282
|
+
# Alert behavior
|
|
283
|
+
# -------------------------------------------------------------------------
|
|
284
|
+
|
|
285
|
+
def alert_on_change(self) -> Self:
|
|
286
|
+
"""Alert only when state changes (default).
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
Self for method chaining.
|
|
290
|
+
"""
|
|
291
|
+
self._alert_type = TriggerAlertType.ON_CHANGE
|
|
292
|
+
return self
|
|
293
|
+
|
|
294
|
+
def alert_on_true(self) -> Self:
|
|
295
|
+
"""Alert every time threshold is exceeded.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
Self for method chaining.
|
|
299
|
+
"""
|
|
300
|
+
self._alert_type = TriggerAlertType.ON_TRUE
|
|
301
|
+
return self
|
|
302
|
+
|
|
303
|
+
def disabled(self, is_disabled: bool = True) -> Self:
|
|
304
|
+
"""Create trigger in disabled state.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
is_disabled: Whether trigger should be disabled.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
Self for method chaining.
|
|
311
|
+
"""
|
|
312
|
+
self._disabled = is_disabled
|
|
313
|
+
return self
|
|
314
|
+
|
|
315
|
+
# -------------------------------------------------------------------------
|
|
316
|
+
# Baseline thresholds
|
|
317
|
+
# -------------------------------------------------------------------------
|
|
318
|
+
|
|
319
|
+
def baseline_1_hour_ago(
|
|
320
|
+
self, comparison_type: Literal["percentage", "value"] = "percentage"
|
|
321
|
+
) -> Self:
|
|
322
|
+
"""Compare against results from 1 hour ago.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
comparison_type: "percentage" for (current-baseline)/baseline,
|
|
326
|
+
"value" for current-baseline
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
Self for method chaining.
|
|
330
|
+
"""
|
|
331
|
+
self._baseline_details = {"offset_minutes": 60, "type": comparison_type}
|
|
332
|
+
return self
|
|
333
|
+
|
|
334
|
+
def baseline_1_day_ago(
|
|
335
|
+
self, comparison_type: Literal["percentage", "value"] = "percentage"
|
|
336
|
+
) -> Self:
|
|
337
|
+
"""Compare against results from 1 day ago.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
comparison_type: "percentage" or "value"
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
Self for method chaining.
|
|
344
|
+
"""
|
|
345
|
+
self._baseline_details = {"offset_minutes": 1440, "type": comparison_type}
|
|
346
|
+
return self
|
|
347
|
+
|
|
348
|
+
def baseline_1_week_ago(
|
|
349
|
+
self, comparison_type: Literal["percentage", "value"] = "percentage"
|
|
350
|
+
) -> Self:
|
|
351
|
+
"""Compare against results from 1 week ago.
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
comparison_type: "percentage" or "value"
|
|
355
|
+
|
|
356
|
+
Returns:
|
|
357
|
+
Self for method chaining.
|
|
358
|
+
"""
|
|
359
|
+
self._baseline_details = {"offset_minutes": 10080, "type": comparison_type}
|
|
360
|
+
return self
|
|
361
|
+
|
|
362
|
+
def baseline_4_weeks_ago(
|
|
363
|
+
self, comparison_type: Literal["percentage", "value"] = "percentage"
|
|
364
|
+
) -> Self:
|
|
365
|
+
"""Compare against results from 4 weeks ago.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
comparison_type: "percentage" or "value"
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
Self for method chaining.
|
|
372
|
+
"""
|
|
373
|
+
self._baseline_details = {"offset_minutes": 40320, "type": comparison_type}
|
|
374
|
+
return self
|
|
375
|
+
|
|
376
|
+
def baseline(
|
|
377
|
+
self, offset_minutes: int, comparison_type: Literal["percentage", "value"]
|
|
378
|
+
) -> Self:
|
|
379
|
+
"""Set custom baseline comparison.
|
|
380
|
+
|
|
381
|
+
Args:
|
|
382
|
+
offset_minutes: How far back to compare. Must be one of: 60, 1440, 10080, 40320.
|
|
383
|
+
comparison_type: "percentage" or "value"
|
|
384
|
+
|
|
385
|
+
Returns:
|
|
386
|
+
Self for method chaining.
|
|
387
|
+
|
|
388
|
+
Raises:
|
|
389
|
+
ValueError: If offset_minutes is not a valid value.
|
|
390
|
+
"""
|
|
391
|
+
valid_offsets = {60, 1440, 10080, 40320}
|
|
392
|
+
if offset_minutes not in valid_offsets:
|
|
393
|
+
raise ValueError(
|
|
394
|
+
f"offset_minutes must be one of {valid_offsets} (1 hour, 1 day, 7 days, or 28 days)"
|
|
395
|
+
)
|
|
396
|
+
self._baseline_details = {"offset_minutes": offset_minutes, "type": comparison_type}
|
|
397
|
+
return self
|
|
398
|
+
|
|
399
|
+
# -------------------------------------------------------------------------
|
|
400
|
+
# Build
|
|
401
|
+
# -------------------------------------------------------------------------
|
|
402
|
+
|
|
403
|
+
def _validate_and_get_components(
|
|
404
|
+
self,
|
|
405
|
+
) -> tuple[
|
|
406
|
+
TriggerThreshold,
|
|
407
|
+
TriggerQuery,
|
|
408
|
+
list[dict[str, Any]] | None,
|
|
409
|
+
list[dict[str, str]] | None,
|
|
410
|
+
dict[str, int | str] | None,
|
|
411
|
+
]:
|
|
412
|
+
"""Validate trigger configuration and return components.
|
|
413
|
+
|
|
414
|
+
Returns:
|
|
415
|
+
Tuple of (threshold, query, recipients, tags, baseline_details)
|
|
416
|
+
|
|
417
|
+
Raises:
|
|
418
|
+
ValueError: If constraints are violated
|
|
419
|
+
"""
|
|
420
|
+
# Validate single calculation
|
|
421
|
+
if len(self._calculations) > 1:
|
|
422
|
+
raise ValueError(
|
|
423
|
+
f"Triggers can only have one calculation, got {len(self._calculations)}. "
|
|
424
|
+
"Use multiple triggers for multiple calculations."
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
# Validate no absolute time
|
|
428
|
+
if self._start_time is not None or self._end_time is not None:
|
|
429
|
+
raise ValueError(
|
|
430
|
+
"Triggers do not support absolute time ranges. "
|
|
431
|
+
"Use time_range() or time presets like last_30_minutes()."
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
# Validate time range
|
|
435
|
+
time_range = self._time_range or 3600 # Default 1 hour
|
|
436
|
+
if time_range > 3600:
|
|
437
|
+
raise ValueError(
|
|
438
|
+
f"Trigger time range must be <= 3600 seconds (1 hour), got {time_range}. "
|
|
439
|
+
"Use a shorter time preset like last_30_minutes()."
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
# Validate frequency vs duration constraint
|
|
443
|
+
# API rule: duration <= frequency * 4
|
|
444
|
+
if time_range > self._frequency * 4:
|
|
445
|
+
raise ValueError(
|
|
446
|
+
f"Time range ({time_range}s) cannot be more than 4x frequency ({self._frequency}s). "
|
|
447
|
+
f"Maximum time range for this frequency: {self._frequency * 4}s. "
|
|
448
|
+
f"Either increase frequency or decrease time range."
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
# Validate threshold
|
|
452
|
+
if self._threshold_op is None or self._threshold_value is None:
|
|
453
|
+
raise ValueError(
|
|
454
|
+
"Threshold is required. Use threshold_gt(), threshold_gte(), "
|
|
455
|
+
"threshold_lt(), or threshold_lte()."
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
# Build threshold
|
|
459
|
+
threshold = TriggerThreshold(
|
|
460
|
+
op=self._threshold_op,
|
|
461
|
+
value=self._threshold_value,
|
|
462
|
+
exceeded_limit=self._exceeded_limit,
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Build query
|
|
466
|
+
query = TriggerQuery(
|
|
467
|
+
time_range=time_range,
|
|
468
|
+
granularity=self._granularity,
|
|
469
|
+
calculations=self._calculations if self._calculations else None,
|
|
470
|
+
filters=self._filters if self._filters else None,
|
|
471
|
+
breakdowns=self._breakdowns if self._breakdowns else None,
|
|
472
|
+
filter_combination=self._filter_combination,
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
# Get recipients, tags, baseline if any
|
|
476
|
+
recipients = self._get_all_recipients() if self._get_all_recipients() else None
|
|
477
|
+
tags = self._get_all_tags()
|
|
478
|
+
baseline = self._baseline_details
|
|
479
|
+
|
|
480
|
+
return threshold, query, recipients, tags, baseline
|
|
481
|
+
|
|
482
|
+
def build(self) -> TriggerBundle: # type: ignore[override]
|
|
483
|
+
"""Build TriggerBundle with validation for orchestrated creation.
|
|
484
|
+
|
|
485
|
+
Returns:
|
|
486
|
+
TriggerBundle containing trigger and inline recipients
|
|
487
|
+
|
|
488
|
+
Raises:
|
|
489
|
+
ValueError: If constraints are violated:
|
|
490
|
+
- More than one calculation
|
|
491
|
+
- Time range > 3600 seconds
|
|
492
|
+
- Absolute time used
|
|
493
|
+
- Missing threshold
|
|
494
|
+
- Frequency vs duration constraint (duration <= frequency * 4)
|
|
495
|
+
"""
|
|
496
|
+
threshold, query, recipients, tags, baseline = self._validate_and_get_components()
|
|
497
|
+
|
|
498
|
+
# Separate inline recipients (without 'id') from those with IDs
|
|
499
|
+
inline_recipients: list[dict[str, Any]] = []
|
|
500
|
+
recipients_with_ids: list[dict[str, Any]] = []
|
|
501
|
+
|
|
502
|
+
if recipients:
|
|
503
|
+
for recip in recipients:
|
|
504
|
+
if "id" in recip:
|
|
505
|
+
recipients_with_ids.append(recip)
|
|
506
|
+
else:
|
|
507
|
+
inline_recipients.append(recip.copy())
|
|
508
|
+
|
|
509
|
+
# Build trigger with only the recipients that already have IDs
|
|
510
|
+
trigger = TriggerCreate(
|
|
511
|
+
name=self._name,
|
|
512
|
+
description=self._description,
|
|
513
|
+
threshold=threshold,
|
|
514
|
+
frequency=self._frequency,
|
|
515
|
+
query=query,
|
|
516
|
+
disabled=self._disabled,
|
|
517
|
+
alert_type=self._alert_type,
|
|
518
|
+
recipients=recipients_with_ids if recipients_with_ids else None,
|
|
519
|
+
tags=tags,
|
|
520
|
+
baseline_details=baseline,
|
|
521
|
+
)
|
|
522
|
+
|
|
523
|
+
return TriggerBundle(
|
|
524
|
+
dataset=self.get_dataset(),
|
|
525
|
+
trigger=trigger,
|
|
526
|
+
inline_recipients=inline_recipients,
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
def build_trigger(self) -> TriggerCreate:
|
|
530
|
+
"""Build TriggerCreate with validation (legacy method).
|
|
531
|
+
|
|
532
|
+
Deprecated: Use build() which returns TriggerBundle for better orchestration.
|
|
533
|
+
|
|
534
|
+
Returns:
|
|
535
|
+
TriggerCreate object ready for API submission.
|
|
536
|
+
|
|
537
|
+
Raises:
|
|
538
|
+
ValueError: If constraints are violated (same as build())
|
|
539
|
+
"""
|
|
540
|
+
threshold, query, recipients, tags, baseline = self._validate_and_get_components()
|
|
541
|
+
|
|
542
|
+
return TriggerCreate(
|
|
543
|
+
name=self._name,
|
|
544
|
+
description=self._description,
|
|
545
|
+
threshold=threshold,
|
|
546
|
+
frequency=self._frequency,
|
|
547
|
+
query=query,
|
|
548
|
+
disabled=self._disabled,
|
|
549
|
+
alert_type=self._alert_type,
|
|
550
|
+
recipients=recipients,
|
|
551
|
+
tags=tags,
|
|
552
|
+
baseline_details=baseline,
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
def get_dataset(self) -> str:
|
|
556
|
+
"""Get the dataset this trigger is scoped to.
|
|
557
|
+
|
|
558
|
+
Returns:
|
|
559
|
+
Dataset slug or "__all__" for environment-wide triggers.
|
|
560
|
+
"""
|
|
561
|
+
return self._dataset if self._dataset else "__all__"
|