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,463 @@
|
|
|
1
|
+
"""SLO Builder - Fluent interface for creating SLOs with burn alerts."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from honeycomb.models.burn_alerts import BurnAlertType
|
|
9
|
+
from honeycomb.models.recipient_builder import RecipientMixin
|
|
10
|
+
from honeycomb.models.slos import SLI, SLOCreate
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from honeycomb.models.derived_columns import DerivedColumnCreate
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class SLIDefinition:
|
|
18
|
+
"""SLI definition - either references existing DC or creates new one."""
|
|
19
|
+
|
|
20
|
+
alias: str
|
|
21
|
+
expression: str | None = None # None = use existing DC
|
|
22
|
+
description: str | None = None
|
|
23
|
+
|
|
24
|
+
def is_new_derived_column(self) -> bool:
|
|
25
|
+
"""Check if this SLI requires creating a new derived column."""
|
|
26
|
+
return self.expression is not None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class BurnAlertDefinition:
|
|
31
|
+
"""Burn alert definition with embedded recipients."""
|
|
32
|
+
|
|
33
|
+
alert_type: BurnAlertType
|
|
34
|
+
description: str | None = None
|
|
35
|
+
# Exhaustion time fields
|
|
36
|
+
exhaustion_minutes: int | None = None
|
|
37
|
+
# Budget rate fields
|
|
38
|
+
budget_rate_window_minutes: int | None = None
|
|
39
|
+
budget_rate_decrease_percent: float | None = None
|
|
40
|
+
# Recipients
|
|
41
|
+
recipients: list[dict] = field(default_factory=list)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class SLOBundle:
|
|
46
|
+
"""Bundle containing SLO and related resources to create.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
slo: The SLOCreate object
|
|
50
|
+
datasets: List of dataset slugs (single or multiple)
|
|
51
|
+
derived_column: DerivedColumnCreate if SLI needs new DC
|
|
52
|
+
derived_column_environment_wide: True if multi-dataset
|
|
53
|
+
burn_alerts: List of burn alert definitions
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
slo: SLOCreate
|
|
57
|
+
datasets: list[str]
|
|
58
|
+
derived_column: DerivedColumnCreate | None
|
|
59
|
+
derived_column_environment_wide: bool
|
|
60
|
+
burn_alerts: list[BurnAlertDefinition]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class BurnAlertBuilder(RecipientMixin):
|
|
64
|
+
"""Builder for burn alerts with recipients.
|
|
65
|
+
|
|
66
|
+
Example - Exhaustion time alert:
|
|
67
|
+
alert = (
|
|
68
|
+
BurnAlertBuilder(BurnAlertType.EXHAUSTION_TIME)
|
|
69
|
+
.exhaustion_minutes(60)
|
|
70
|
+
.description("Alert when budget exhausts in 1 hour")
|
|
71
|
+
.email("oncall@example.com")
|
|
72
|
+
.slack("#alerts")
|
|
73
|
+
.build()
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
Example - Budget rate alert:
|
|
77
|
+
alert = (
|
|
78
|
+
BurnAlertBuilder(BurnAlertType.BUDGET_RATE)
|
|
79
|
+
.window_minutes(60)
|
|
80
|
+
.threshold_percent(1.0)
|
|
81
|
+
.pagerduty("routing-key", severity="critical")
|
|
82
|
+
.build()
|
|
83
|
+
)
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
def __init__(self, alert_type: BurnAlertType):
|
|
87
|
+
RecipientMixin.__init__(self)
|
|
88
|
+
self._alert_type = alert_type
|
|
89
|
+
self._description: str | None = None
|
|
90
|
+
self._exhaustion_minutes: int | None = None
|
|
91
|
+
self._budget_rate_window_minutes: int | None = None
|
|
92
|
+
self._budget_rate_decrease_percent: float | None = None
|
|
93
|
+
|
|
94
|
+
def description(self, desc: str) -> BurnAlertBuilder:
|
|
95
|
+
"""Set burn alert description."""
|
|
96
|
+
self._description = desc
|
|
97
|
+
return self
|
|
98
|
+
|
|
99
|
+
# -------------------------------------------------------------------------
|
|
100
|
+
# Exhaustion time config
|
|
101
|
+
# -------------------------------------------------------------------------
|
|
102
|
+
|
|
103
|
+
def exhaustion_minutes(self, minutes: int) -> BurnAlertBuilder:
|
|
104
|
+
"""Set exhaustion time threshold in minutes.
|
|
105
|
+
|
|
106
|
+
Alert triggers when error budget will be exhausted within this timeframe.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
minutes: Minutes until exhaustion threshold (e.g., 60 = 1 hour)
|
|
110
|
+
"""
|
|
111
|
+
self._exhaustion_minutes = minutes
|
|
112
|
+
return self
|
|
113
|
+
|
|
114
|
+
# -------------------------------------------------------------------------
|
|
115
|
+
# Budget rate config
|
|
116
|
+
# -------------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
def window_minutes(self, minutes: int) -> BurnAlertBuilder:
|
|
119
|
+
"""Set budget rate window in minutes.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
minutes: Time window for budget rate calculation
|
|
123
|
+
"""
|
|
124
|
+
self._budget_rate_window_minutes = minutes
|
|
125
|
+
return self
|
|
126
|
+
|
|
127
|
+
def threshold_percent(self, percent: float) -> BurnAlertBuilder:
|
|
128
|
+
"""Set budget decrease threshold as percentage.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
percent: Budget decrease threshold (e.g., 1.0 = 1%)
|
|
132
|
+
"""
|
|
133
|
+
self._budget_rate_decrease_percent = percent
|
|
134
|
+
return self
|
|
135
|
+
|
|
136
|
+
# -------------------------------------------------------------------------
|
|
137
|
+
# Build
|
|
138
|
+
# -------------------------------------------------------------------------
|
|
139
|
+
|
|
140
|
+
def build(self) -> BurnAlertDefinition:
|
|
141
|
+
"""Build BurnAlertDefinition with validation.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
BurnAlertDefinition with all configured settings
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
ValueError: If required fields for alert type are missing
|
|
148
|
+
"""
|
|
149
|
+
# Validate alert type specific fields
|
|
150
|
+
if self._alert_type == BurnAlertType.EXHAUSTION_TIME:
|
|
151
|
+
if self._exhaustion_minutes is None:
|
|
152
|
+
raise ValueError(
|
|
153
|
+
"exhaustion_minutes is required for EXHAUSTION_TIME alerts. "
|
|
154
|
+
"Use exhaustion_minutes()."
|
|
155
|
+
)
|
|
156
|
+
elif self._alert_type == BurnAlertType.BUDGET_RATE:
|
|
157
|
+
if self._budget_rate_window_minutes is None:
|
|
158
|
+
raise ValueError(
|
|
159
|
+
"window_minutes is required for BUDGET_RATE alerts. Use window_minutes()."
|
|
160
|
+
)
|
|
161
|
+
if self._budget_rate_decrease_percent is None:
|
|
162
|
+
raise ValueError(
|
|
163
|
+
"threshold_percent is required for BUDGET_RATE alerts. Use threshold_percent()."
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
return BurnAlertDefinition(
|
|
167
|
+
alert_type=self._alert_type,
|
|
168
|
+
description=self._description,
|
|
169
|
+
exhaustion_minutes=self._exhaustion_minutes,
|
|
170
|
+
budget_rate_window_minutes=self._budget_rate_window_minutes,
|
|
171
|
+
budget_rate_decrease_percent=self._budget_rate_decrease_percent,
|
|
172
|
+
recipients=self._get_all_recipients(),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class SLOBuilder:
|
|
177
|
+
"""Fluent builder for SLOs with burn alerts and derived columns.
|
|
178
|
+
|
|
179
|
+
Example - Single dataset with existing derived column:
|
|
180
|
+
slo = (
|
|
181
|
+
SLOBuilder("API Availability")
|
|
182
|
+
.dataset("api-logs")
|
|
183
|
+
.target_percentage(99.9)
|
|
184
|
+
.time_period_days(30)
|
|
185
|
+
.sli(alias="api_success_rate")
|
|
186
|
+
.exhaustion_alert(
|
|
187
|
+
BurnAlertBuilder(BurnAlertType.EXHAUSTION_TIME)
|
|
188
|
+
.exhaustion_minutes(60)
|
|
189
|
+
.email("oncall@example.com")
|
|
190
|
+
)
|
|
191
|
+
.build()
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
Example - Multiple datasets with new derived column:
|
|
195
|
+
slo = (
|
|
196
|
+
SLOBuilder("Cross-Service Availability")
|
|
197
|
+
.datasets(["api-logs", "web-logs", "worker-logs"])
|
|
198
|
+
.target_nines(3) # 99.9%
|
|
199
|
+
.sli(
|
|
200
|
+
alias="service_success",
|
|
201
|
+
expression="IF(EQUALS($status, 200), 1, 0)",
|
|
202
|
+
description="1 for success, 0 for failure"
|
|
203
|
+
)
|
|
204
|
+
.budget_rate_alert(
|
|
205
|
+
BurnAlertBuilder(BurnAlertType.BUDGET_RATE)
|
|
206
|
+
.window_minutes(60)
|
|
207
|
+
.threshold_percent(1.0)
|
|
208
|
+
.pagerduty("routing-key", severity="critical")
|
|
209
|
+
)
|
|
210
|
+
.build()
|
|
211
|
+
)
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
def __init__(self, name: str):
|
|
215
|
+
self._name = name
|
|
216
|
+
self._description: str | None = None
|
|
217
|
+
self._datasets: list[str] = []
|
|
218
|
+
self._target_per_million: int | None = None
|
|
219
|
+
self._time_period_days: int = 30
|
|
220
|
+
self._sli: SLIDefinition | None = None
|
|
221
|
+
self._burn_alerts: list[BurnAlertDefinition] = []
|
|
222
|
+
|
|
223
|
+
# -------------------------------------------------------------------------
|
|
224
|
+
# Basic configuration
|
|
225
|
+
# -------------------------------------------------------------------------
|
|
226
|
+
|
|
227
|
+
def description(self, desc: str) -> SLOBuilder:
|
|
228
|
+
"""Set SLO description."""
|
|
229
|
+
self._description = desc
|
|
230
|
+
return self
|
|
231
|
+
|
|
232
|
+
# -------------------------------------------------------------------------
|
|
233
|
+
# Dataset scope
|
|
234
|
+
# -------------------------------------------------------------------------
|
|
235
|
+
|
|
236
|
+
def dataset(self, dataset_slug: str) -> SLOBuilder:
|
|
237
|
+
"""Scope SLO to a single dataset.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
dataset_slug: Dataset slug
|
|
241
|
+
"""
|
|
242
|
+
self._datasets = [dataset_slug]
|
|
243
|
+
return self
|
|
244
|
+
|
|
245
|
+
def datasets(self, dataset_slugs: list[str]) -> SLOBuilder:
|
|
246
|
+
"""Scope SLO to multiple datasets.
|
|
247
|
+
|
|
248
|
+
Note: When using multiple datasets, any new derived column
|
|
249
|
+
will be created as environment-wide.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
dataset_slugs: List of dataset slugs
|
|
253
|
+
"""
|
|
254
|
+
self._datasets = dataset_slugs
|
|
255
|
+
return self
|
|
256
|
+
|
|
257
|
+
# -------------------------------------------------------------------------
|
|
258
|
+
# Target configuration
|
|
259
|
+
# -------------------------------------------------------------------------
|
|
260
|
+
|
|
261
|
+
def target_percentage(self, percent: float) -> SLOBuilder:
|
|
262
|
+
"""Set target as percentage (e.g., 99.9 -> 999000 per million).
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
percent: Target percentage (e.g., 99.9)
|
|
266
|
+
"""
|
|
267
|
+
self._target_per_million = int(percent * 10000)
|
|
268
|
+
return self
|
|
269
|
+
|
|
270
|
+
def target_nines(self, nines: int) -> SLOBuilder:
|
|
271
|
+
"""Set target by number of nines.
|
|
272
|
+
|
|
273
|
+
Examples:
|
|
274
|
+
2 nines = 99%
|
|
275
|
+
3 nines = 99.9%
|
|
276
|
+
4 nines = 99.99%
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
nines: Number of nines (1-5)
|
|
280
|
+
"""
|
|
281
|
+
percentage = 100 - (100 / (10**nines))
|
|
282
|
+
return self.target_percentage(percentage)
|
|
283
|
+
|
|
284
|
+
def target_per_million(self, value: int) -> SLOBuilder:
|
|
285
|
+
"""Set target directly as per-million value.
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
value: Target per million (e.g., 999000 = 99.9%)
|
|
289
|
+
"""
|
|
290
|
+
self._target_per_million = value
|
|
291
|
+
return self
|
|
292
|
+
|
|
293
|
+
# -------------------------------------------------------------------------
|
|
294
|
+
# Time period
|
|
295
|
+
# -------------------------------------------------------------------------
|
|
296
|
+
|
|
297
|
+
def time_period_days(self, days: int) -> SLOBuilder:
|
|
298
|
+
"""Set SLO time period in days (1-90).
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
days: Time period in days
|
|
302
|
+
|
|
303
|
+
Raises:
|
|
304
|
+
ValueError: If days not in range 1-90
|
|
305
|
+
"""
|
|
306
|
+
if not 1 <= days <= 90:
|
|
307
|
+
raise ValueError("Time period must be between 1 and 90 days")
|
|
308
|
+
self._time_period_days = days
|
|
309
|
+
return self
|
|
310
|
+
|
|
311
|
+
def time_period_weeks(self, weeks: int) -> SLOBuilder:
|
|
312
|
+
"""Set SLO time period in weeks.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
weeks: Time period in weeks
|
|
316
|
+
"""
|
|
317
|
+
return self.time_period_days(weeks * 7)
|
|
318
|
+
|
|
319
|
+
# -------------------------------------------------------------------------
|
|
320
|
+
# SLI definition
|
|
321
|
+
# -------------------------------------------------------------------------
|
|
322
|
+
|
|
323
|
+
def sli(
|
|
324
|
+
self,
|
|
325
|
+
alias: str,
|
|
326
|
+
expression: str | None = None,
|
|
327
|
+
description: str | None = None,
|
|
328
|
+
) -> SLOBuilder:
|
|
329
|
+
"""Define the SLI (Service Level Indicator).
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
alias: Name of the derived column (existing or new)
|
|
333
|
+
expression: If provided, creates a new derived column.
|
|
334
|
+
If None, uses an existing derived column.
|
|
335
|
+
description: Description for new derived column (ignored if using existing)
|
|
336
|
+
|
|
337
|
+
Examples:
|
|
338
|
+
# Use existing derived column
|
|
339
|
+
.sli(alias="api_success_rate")
|
|
340
|
+
|
|
341
|
+
# Create new derived column
|
|
342
|
+
.sli(
|
|
343
|
+
alias="request_success",
|
|
344
|
+
expression="IF(LT($status_code, 400), 1, 0)",
|
|
345
|
+
description="1 if request succeeded, 0 otherwise"
|
|
346
|
+
)
|
|
347
|
+
"""
|
|
348
|
+
self._sli = SLIDefinition(
|
|
349
|
+
alias=alias,
|
|
350
|
+
expression=expression,
|
|
351
|
+
description=description,
|
|
352
|
+
)
|
|
353
|
+
return self
|
|
354
|
+
|
|
355
|
+
# -------------------------------------------------------------------------
|
|
356
|
+
# Burn alerts
|
|
357
|
+
# -------------------------------------------------------------------------
|
|
358
|
+
|
|
359
|
+
def exhaustion_alert(self, builder: BurnAlertBuilder) -> SLOBuilder:
|
|
360
|
+
"""Add an exhaustion time burn alert.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
builder: BurnAlertBuilder configured with EXHAUSTION_TIME type
|
|
364
|
+
|
|
365
|
+
Example:
|
|
366
|
+
.exhaustion_alert(
|
|
367
|
+
BurnAlertBuilder(BurnAlertType.EXHAUSTION_TIME)
|
|
368
|
+
.exhaustion_minutes(60)
|
|
369
|
+
.description("Alert when budget exhausts in 1 hour")
|
|
370
|
+
.email("oncall@example.com")
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
Raises:
|
|
374
|
+
ValueError: If builder is not EXHAUSTION_TIME type
|
|
375
|
+
"""
|
|
376
|
+
if builder._alert_type != BurnAlertType.EXHAUSTION_TIME:
|
|
377
|
+
raise ValueError("exhaustion_alert() requires EXHAUSTION_TIME alert type")
|
|
378
|
+
self._burn_alerts.append(builder.build())
|
|
379
|
+
return self
|
|
380
|
+
|
|
381
|
+
def budget_rate_alert(self, builder: BurnAlertBuilder) -> SLOBuilder:
|
|
382
|
+
"""Add a budget rate burn alert.
|
|
383
|
+
|
|
384
|
+
Args:
|
|
385
|
+
builder: BurnAlertBuilder configured with BUDGET_RATE type
|
|
386
|
+
|
|
387
|
+
Example:
|
|
388
|
+
.budget_rate_alert(
|
|
389
|
+
BurnAlertBuilder(BurnAlertType.BUDGET_RATE)
|
|
390
|
+
.window_minutes(60)
|
|
391
|
+
.threshold_percent(1.0)
|
|
392
|
+
.pagerduty("routing-key")
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
Raises:
|
|
396
|
+
ValueError: If builder is not BUDGET_RATE type
|
|
397
|
+
"""
|
|
398
|
+
if builder._alert_type != BurnAlertType.BUDGET_RATE:
|
|
399
|
+
raise ValueError("budget_rate_alert() requires BUDGET_RATE alert type")
|
|
400
|
+
self._burn_alerts.append(builder.build())
|
|
401
|
+
return self
|
|
402
|
+
|
|
403
|
+
# -------------------------------------------------------------------------
|
|
404
|
+
# Build
|
|
405
|
+
# -------------------------------------------------------------------------
|
|
406
|
+
|
|
407
|
+
def build(self) -> SLOBundle:
|
|
408
|
+
"""Build SLO bundle with validation.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
SLOBundle containing:
|
|
412
|
+
- slo: The SLOCreate object
|
|
413
|
+
- datasets: List of dataset slugs
|
|
414
|
+
- derived_column: DerivedColumnCreate if SLI needs new DC
|
|
415
|
+
- derived_column_environment_wide: True if multi-dataset
|
|
416
|
+
- burn_alerts: List of burn alert definitions
|
|
417
|
+
|
|
418
|
+
Raises:
|
|
419
|
+
ValueError: If required fields are missing
|
|
420
|
+
"""
|
|
421
|
+
if not self._datasets:
|
|
422
|
+
raise ValueError("At least one dataset is required. Use dataset() or datasets().")
|
|
423
|
+
|
|
424
|
+
if self._target_per_million is None:
|
|
425
|
+
raise ValueError(
|
|
426
|
+
"Target is required. Use target_percentage(), "
|
|
427
|
+
"target_nines(), or target_per_million()."
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
if self._sli is None:
|
|
431
|
+
raise ValueError("SLI is required. Use sli(alias=...) to define it.")
|
|
432
|
+
|
|
433
|
+
# Determine if derived column should be environment-wide
|
|
434
|
+
is_multi_dataset = len(self._datasets) > 1
|
|
435
|
+
|
|
436
|
+
# Build derived column if needed
|
|
437
|
+
derived_column = None
|
|
438
|
+
if self._sli.is_new_derived_column():
|
|
439
|
+
# Import here to avoid circular dependency
|
|
440
|
+
from honeycomb.models.derived_columns import DerivedColumnCreate
|
|
441
|
+
|
|
442
|
+
derived_column = DerivedColumnCreate(
|
|
443
|
+
alias=self._sli.alias,
|
|
444
|
+
expression=self._sli.expression,
|
|
445
|
+
description=self._sli.description,
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
# Build SLO
|
|
449
|
+
slo = SLOCreate(
|
|
450
|
+
name=self._name,
|
|
451
|
+
description=self._description,
|
|
452
|
+
sli=SLI(alias=self._sli.alias),
|
|
453
|
+
time_period_days=self._time_period_days,
|
|
454
|
+
target_per_million=self._target_per_million,
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
return SLOBundle(
|
|
458
|
+
slo=slo,
|
|
459
|
+
datasets=self._datasets,
|
|
460
|
+
derived_column=derived_column,
|
|
461
|
+
derived_column_environment_wide=is_multi_dataset,
|
|
462
|
+
burn_alerts=self._burn_alerts,
|
|
463
|
+
)
|
honeycomb/models/slos.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Pydantic models for Honeycomb SLOs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SLI(BaseModel):
|
|
12
|
+
"""Service Level Indicator configuration."""
|
|
13
|
+
|
|
14
|
+
alias: str | None = Field(default=None, description="Alias for the SLI")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SLOCreate(BaseModel):
|
|
18
|
+
"""Model for creating a new SLO."""
|
|
19
|
+
|
|
20
|
+
name: str = Field(description="Human-readable name for the SLO")
|
|
21
|
+
description: str | None = Field(default=None, description="Longer description")
|
|
22
|
+
sli: SLI = Field(description="SLI configuration")
|
|
23
|
+
time_period_days: int = Field(
|
|
24
|
+
default=30,
|
|
25
|
+
ge=1,
|
|
26
|
+
le=90,
|
|
27
|
+
description="Time period for the SLO in days (1-90)",
|
|
28
|
+
)
|
|
29
|
+
target_per_million: int = Field(
|
|
30
|
+
ge=0,
|
|
31
|
+
le=1000000,
|
|
32
|
+
description="Target success rate per million (e.g., 999000 = 99.9%)",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def model_dump_for_api(self) -> dict[str, Any]:
|
|
36
|
+
"""Serialize for API request."""
|
|
37
|
+
data: dict[str, Any] = {
|
|
38
|
+
"name": self.name,
|
|
39
|
+
"sli": {},
|
|
40
|
+
"time_period_days": self.time_period_days,
|
|
41
|
+
"target_per_million": self.target_per_million,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if self.description:
|
|
45
|
+
data["description"] = self.description
|
|
46
|
+
|
|
47
|
+
if self.sli.alias:
|
|
48
|
+
data["sli"]["alias"] = self.sli.alias
|
|
49
|
+
|
|
50
|
+
return data
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SLO(BaseModel):
|
|
54
|
+
"""A Honeycomb SLO (response model)."""
|
|
55
|
+
|
|
56
|
+
id: str = Field(description="Unique identifier")
|
|
57
|
+
name: str = Field(description="Human-readable name")
|
|
58
|
+
description: str | None = Field(default=None, description="Longer description")
|
|
59
|
+
sli: dict = Field(description="SLI configuration")
|
|
60
|
+
time_period_days: int = Field(description="Time period in days")
|
|
61
|
+
target_per_million: int = Field(description="Target per million")
|
|
62
|
+
dataset_slugs: list[str] | None = Field(default=None, description="Datasets this SLO spans")
|
|
63
|
+
created_at: datetime | None = Field(default=None, description="Creation timestamp")
|
|
64
|
+
updated_at: datetime | None = Field(default=None, description="Last update timestamp")
|
|
65
|
+
|
|
66
|
+
model_config = {"extra": "allow"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Mixin for adding tags to Honeycomb resources."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing_extensions import Self
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TagsMixin:
|
|
9
|
+
"""Mixin providing tag management methods.
|
|
10
|
+
|
|
11
|
+
Tags are key-value pairs used to identify and organize resources.
|
|
12
|
+
Supported by: Triggers, Boards, SLOs.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(self) -> None:
|
|
16
|
+
"""Initialize tag storage."""
|
|
17
|
+
self._tags: list[dict[str, str]] = []
|
|
18
|
+
|
|
19
|
+
def tag(self, key: str, value: str) -> Self:
|
|
20
|
+
"""Add a tag to the resource.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
key: Tag key (lowercase letters and underscores only, max 32 chars).
|
|
24
|
+
value: Tag value (must start with lowercase letter,
|
|
25
|
+
alphanumeric + / and -, max 128 chars).
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Self for method chaining.
|
|
29
|
+
|
|
30
|
+
Raises:
|
|
31
|
+
ValueError: If key or value format is invalid.
|
|
32
|
+
"""
|
|
33
|
+
# Validate key
|
|
34
|
+
if not key or len(key) > 32:
|
|
35
|
+
raise ValueError("Tag key must be 1-32 characters")
|
|
36
|
+
if not all(c.islower() or c == "_" for c in key):
|
|
37
|
+
raise ValueError("Tag key must contain only lowercase letters and underscores")
|
|
38
|
+
|
|
39
|
+
# Validate value
|
|
40
|
+
if not value or len(value) > 128:
|
|
41
|
+
raise ValueError("Tag value must be 1-128 characters")
|
|
42
|
+
if not value[0].islower():
|
|
43
|
+
raise ValueError("Tag value must start with a lowercase letter")
|
|
44
|
+
|
|
45
|
+
# Allow lowercase letters, numbers, /, and -
|
|
46
|
+
allowed_chars = set("abcdefghijklmnopqrstuvwxyz0123456789/-")
|
|
47
|
+
if not all(c in allowed_chars for c in value):
|
|
48
|
+
raise ValueError("Tag value can only contain lowercase letters, numbers, / and -")
|
|
49
|
+
|
|
50
|
+
# Check max tags limit (10)
|
|
51
|
+
if len(self._tags) >= 10:
|
|
52
|
+
raise ValueError("Maximum of 10 tags allowed")
|
|
53
|
+
|
|
54
|
+
self._tags.append({"key": key, "value": value})
|
|
55
|
+
return self
|
|
56
|
+
|
|
57
|
+
def tags(self, tags: dict[str, str]) -> Self:
|
|
58
|
+
"""Add multiple tags from a dictionary.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
tags: Dictionary of key-value pairs.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Self for method chaining.
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
ValueError: If any key or value format is invalid.
|
|
68
|
+
"""
|
|
69
|
+
for key, value in tags.items():
|
|
70
|
+
self.tag(key, value)
|
|
71
|
+
return self
|
|
72
|
+
|
|
73
|
+
def _get_all_tags(self) -> list[dict[str, str]] | None:
|
|
74
|
+
"""Get tags for API (None if empty).
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
List of tag dictionaries or None if no tags.
|
|
78
|
+
"""
|
|
79
|
+
return self._tags if self._tags else None
|