honeycomb-api 0.1.0__py3-none-any.whl → 0.5.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- honeycomb/__init__.py +9 -0
- honeycomb/_generated/api/auth/get_auth.py +2 -5
- honeycomb/_generated/api/auth/get_v2_auth.py +2 -5
- honeycomb/_generated/api/boards/create_board.py +6 -5
- honeycomb/_generated/api/boards/create_board_view.py +14 -9
- honeycomb/_generated/api/boards/delete_board.py +2 -5
- honeycomb/_generated/api/boards/delete_board_view.py +2 -5
- honeycomb/_generated/api/boards/get_board.py +2 -5
- honeycomb/_generated/api/boards/get_board_view.py +2 -5
- honeycomb/_generated/api/boards/list_board_views.py +10 -9
- honeycomb/_generated/api/boards/list_boards.py +2 -5
- honeycomb/_generated/api/boards/update_board.py +10 -5
- honeycomb/_generated/api/boards/update_board_view.py +2 -5
- honeycomb/_generated/api/burn_alerts/create_burn_alert.py +6 -8
- honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +2 -5
- honeycomb/_generated/api/burn_alerts/get_burn_alert.py +2 -5
- honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +2 -5
- honeycomb/_generated/api/calculated_fields/create_calculated_field.py +2 -5
- honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +2 -5
- honeycomb/_generated/api/calculated_fields/get_calculated_field.py +2 -5
- honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +2 -8
- honeycomb/_generated/api/calculated_fields/update_calculated_field.py +2 -5
- honeycomb/_generated/api/columns/create_column.py +2 -5
- honeycomb/_generated/api/columns/delete_column.py +2 -5
- honeycomb/_generated/api/columns/get_column.py +2 -5
- honeycomb/_generated/api/columns/list_columns.py +2 -8
- honeycomb/_generated/api/columns/update_column.py +2 -5
- honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +2 -5
- honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +2 -5
- honeycomb/_generated/api/datasets/create_dataset.py +2 -5
- honeycomb/_generated/api/datasets/delete_dataset.py +2 -5
- honeycomb/_generated/api/datasets/get_dataset.py +2 -5
- honeycomb/_generated/api/datasets/list_datasets.py +2 -5
- honeycomb/_generated/api/datasets/update_dataset.py +2 -5
- honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +4 -6
- honeycomb/_generated/api/environments/create_environment.py +2 -5
- honeycomb/_generated/api/environments/delete_environment.py +2 -5
- honeycomb/_generated/api/environments/get_environment.py +2 -5
- honeycomb/_generated/api/environments/list_environments.py +2 -7
- honeycomb/_generated/api/environments/update_environment.py +2 -5
- honeycomb/_generated/api/events/create_event.py +2 -7
- honeycomb/_generated/api/events/create_events.py +7 -11
- honeycomb/_generated/api/key_management/create_api_key.py +2 -5
- honeycomb/_generated/api/key_management/delete_api_key.py +2 -5
- honeycomb/_generated/api/key_management/get_api_key.py +2 -5
- honeycomb/_generated/api/key_management/list_api_keys.py +2 -7
- honeycomb/_generated/api/key_management/update_api_key.py +2 -5
- honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +2 -5
- honeycomb/_generated/api/marker_settings/create_marker_setting.py +2 -5
- honeycomb/_generated/api/marker_settings/delete_marker_settings.py +2 -5
- honeycomb/_generated/api/marker_settings/list_marker_settings.py +2 -5
- honeycomb/_generated/api/marker_settings/update_marker_settings.py +2 -5
- honeycomb/_generated/api/markers/create_marker.py +2 -5
- honeycomb/_generated/api/markers/create_marker_v2.py +2 -5
- honeycomb/_generated/api/markers/delete_marker.py +2 -5
- honeycomb/_generated/api/markers/get_marker.py +2 -5
- honeycomb/_generated/api/markers/update_marker.py +2 -5
- honeycomb/_generated/api/markers/update_marker_v2.py +2 -5
- honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +4 -8
- honeycomb/_generated/api/pipelines/record_pipeline_usage.py +4 -6
- honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +6 -7
- honeycomb/_generated/api/queries/create_query.py +2 -5
- honeycomb/_generated/api/queries/get_query.py +2 -5
- honeycomb/_generated/api/query_annotations/create_query_annotation.py +2 -5
- honeycomb/_generated/api/query_annotations/delete_query_annotation.py +2 -5
- honeycomb/_generated/api/query_annotations/get_query_annotation.py +2 -5
- honeycomb/_generated/api/query_annotations/list_query_annotations.py +2 -7
- honeycomb/_generated/api/query_annotations/update_query_annotation.py +2 -5
- honeycomb/_generated/api/query_data/create_query_result.py +2 -5
- honeycomb/_generated/api/query_data/get_query_result.py +2 -5
- honeycomb/_generated/api/recipients/create_recipient.py +2 -6
- honeycomb/_generated/api/recipients/delete_recipient.py +2 -5
- honeycomb/_generated/api/recipients/get_recipient.py +2 -6
- honeycomb/_generated/api/recipients/list_recipients.py +2 -6
- honeycomb/_generated/api/recipients/update_recipient.py +2 -6
- honeycomb/_generated/api/reporting/get_slo_history.py +2 -5
- honeycomb/_generated/api/service_maps/create_map_dependency_request.py +6 -9
- honeycomb/_generated/api/service_maps/get_map_dependencies.py +2 -7
- honeycomb/_generated/api/sl_os/create_slo.py +2 -5
- honeycomb/_generated/api/sl_os/delete_slo.py +2 -5
- honeycomb/_generated/api/sl_os/get_slo.py +2 -8
- honeycomb/_generated/api/sl_os/list_slos.py +2 -5
- honeycomb/_generated/api/sl_os/update_slo.py +2 -5
- honeycomb/_generated/api/triggers/create_trigger.py +2 -6
- honeycomb/_generated/api/triggers/delete_trigger.py +2 -5
- honeycomb/_generated/api/triggers/get_trigger.py +2 -5
- honeycomb/_generated/api/triggers/list_triggers.py +2 -5
- honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +2 -5
- honeycomb/_generated/api/triggers/update_trigger.py +2 -5
- honeycomb/_generated/client.py +2 -5
- honeycomb/_generated/models/__init__.py +195 -88
- honeycomb/_generated/models/api_key_create_request.py +6 -5
- honeycomb/_generated/models/api_key_create_request_data.py +15 -11
- honeycomb/_generated/models/api_key_create_request_data_relationships.py +2 -3
- honeycomb/_generated/models/api_key_create_request_data_type.py +1 -0
- honeycomb/_generated/models/api_key_list_response.py +2 -5
- honeycomb/_generated/models/api_key_object.py +14 -14
- honeycomb/_generated/models/api_key_object_links.py +2 -9
- honeycomb/_generated/models/api_key_object_relationships.py +5 -9
- honeycomb/_generated/models/api_key_object_type.py +1 -0
- honeycomb/_generated/models/api_key_response.py +2 -3
- honeycomb/_generated/models/api_key_update_request.py +15 -17
- honeycomb/_generated/models/auth.py +2 -5
- honeycomb/_generated/models/auth_api_key_access.py +2 -9
- honeycomb/_generated/models/auth_environment.py +2 -9
- honeycomb/_generated/models/auth_team.py +2 -9
- honeycomb/_generated/models/auth_type.py +1 -0
- honeycomb/_generated/models/auth_v2_response.py +5 -8
- honeycomb/_generated/models/auth_v2_response_data.py +14 -11
- honeycomb/_generated/models/auth_v2_response_data_attributes.py +10 -9
- honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +1 -0
- honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/auth_v2_response_data_relationships.py +1 -7
- honeycomb/_generated/models/auth_v2_response_data_type.py +1 -0
- honeycomb/_generated/models/base_trigger.py +21 -18
- honeycomb/_generated/models/base_trigger_alert_type.py +1 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +5 -9
- honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +1 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +1 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule.py +8 -6
- honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +1 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +4 -9
- honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +1 -0
- honeycomb/_generated/models/base_trigger_threshold.py +2 -9
- honeycomb/_generated/models/base_trigger_threshold_op.py +1 -0
- honeycomb/_generated/models/batch_event.py +2 -5
- honeycomb/_generated/models/board.py +15 -17
- honeycomb/_generated/models/board_layout_generation.py +1 -0
- honeycomb/_generated/models/board_links.py +2 -9
- honeycomb/_generated/models/board_panel_position.py +2 -9
- honeycomb/_generated/models/board_query_visualization_settings.py +8 -8
- honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +4 -10
- honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +1 -0
- honeycomb/_generated/models/board_type.py +1 -0
- honeycomb/_generated/models/board_view_filter.py +2 -9
- honeycomb/_generated/models/board_view_filter_operation.py +1 -0
- honeycomb/_generated/models/board_view_response.py +2 -5
- honeycomb/_generated/models/budget_rate.py +4 -12
- honeycomb/_generated/models/budget_rate_alert_type.py +1 -0
- honeycomb/_generated/models/burn_alert_shared_params.py +4 -12
- honeycomb/_generated/models/calculated_field.py +2 -9
- honeycomb/_generated/models/configuration_key_attributes.py +16 -12
- honeycomb/_generated/models/configuration_key_attributes_key_type.py +1 -0
- honeycomb/_generated/models/configuration_key_attributes_permissions.py +172 -0
- honeycomb/_generated/models/configuration_key_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/configuration_key_request.py +101 -0
- honeycomb/_generated/models/configuration_key_request_attributes.py +107 -0
- honeycomb/_generated/models/configuration_key_request_attributes_permissions.py +168 -0
- honeycomb/_generated/models/configuration_key_request_type.py +8 -0
- honeycomb/_generated/models/create_board_view_request.py +2 -3
- honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +10 -10
- honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +1 -7
- honeycomb/_generated/models/create_column.py +2 -9
- honeycomb/_generated/models/create_column_type.py +1 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +10 -7
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +8 -8
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
- 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 +1 -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 +8 -6
- 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 +8 -6
- 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 +2 -9
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +1 -0
- honeycomb/_generated/models/create_environment_request.py +8 -6
- honeycomb/_generated/models/create_environment_request_data.py +10 -7
- honeycomb/_generated/models/create_environment_request_data_attributes.py +2 -9
- honeycomb/_generated/models/create_environment_request_data_type.py +1 -0
- honeycomb/_generated/models/create_events_content_encoding.py +1 -0
- honeycomb/_generated/models/create_events_response_200_item.py +2 -9
- honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +10 -10
- honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +1 -7
- honeycomb/_generated/models/create_map_dependencies_request.py +2 -5
- honeycomb/_generated/models/create_map_dependencies_response.py +4 -10
- honeycomb/_generated/models/create_map_dependencies_response_status.py +1 -0
- honeycomb/_generated/models/create_pipeline_health_record_request.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data.py +10 -7
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +8 -8
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -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 +8 -6
- 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 +8 -6
- 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 +2 -9
- honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +1 -0
- honeycomb/_generated/models/create_query_result_request.py +2 -9
- honeycomb/_generated/models/dataset.py +2 -6
- honeycomb/_generated/models/dataset_creation_payload.py +2 -9
- honeycomb/_generated/models/dataset_definition_type_1.py +4 -10
- honeycomb/_generated/models/dataset_definition_type_1_column_type.py +1 -0
- honeycomb/_generated/models/dataset_definitions.py +2 -6
- honeycomb/_generated/models/dataset_relationship.py +2 -3
- honeycomb/_generated/models/dataset_relationship_data.py +2 -8
- honeycomb/_generated/models/dataset_relationship_data_type.py +1 -0
- honeycomb/_generated/models/dataset_settings.py +2 -9
- honeycomb/_generated/models/dataset_update_payload.py +8 -8
- honeycomb/_generated/models/dataset_update_payload_settings.py +2 -9
- honeycomb/_generated/models/detailed_error.py +2 -9
- honeycomb/_generated/models/email_recipient.py +4 -7
- honeycomb/_generated/models/email_recipient_details.py +1 -7
- honeycomb/_generated/models/email_recipient_type.py +1 -0
- honeycomb/_generated/models/environment.py +6 -7
- honeycomb/_generated/models/environment_attributes.py +11 -9
- honeycomb/_generated/models/environment_attributes_color_type_1.py +1 -0
- honeycomb/_generated/models/environment_attributes_settings.py +1 -7
- honeycomb/_generated/models/environment_color.py +1 -0
- honeycomb/_generated/models/environment_links.py +1 -7
- honeycomb/_generated/models/environment_list_response.py +2 -5
- honeycomb/_generated/models/environment_relationship.py +8 -6
- honeycomb/_generated/models/environment_relationship_data.py +3 -8
- honeycomb/_generated/models/environment_relationship_data_type.py +1 -0
- honeycomb/_generated/models/environment_response.py +2 -3
- honeycomb/_generated/models/environment_type.py +1 -0
- honeycomb/_generated/models/error.py +2 -9
- honeycomb/_generated/models/event.py +2 -8
- honeycomb/_generated/models/exhaustion_time.py +4 -12
- honeycomb/_generated/models/exhaustion_time_alert_type.py +1 -0
- honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +10 -10
- honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +2 -9
- honeycomb/_generated/models/filter_op.py +1 -0
- honeycomb/_generated/models/get_map_dependencies_response.py +7 -10
- honeycomb/_generated/models/get_map_dependencies_response_status.py +1 -0
- honeycomb/_generated/models/having_calculate_op.py +1 -0
- honeycomb/_generated/models/having_op.py +1 -0
- honeycomb/_generated/models/included_resource.py +6 -7
- honeycomb/_generated/models/included_resource_attributes.py +1 -7
- honeycomb/_generated/models/ingest_key_attributes.py +14 -11
- honeycomb/_generated/models/ingest_key_attributes_key_type.py +1 -0
- honeycomb/_generated/models/ingest_key_attributes_permissions.py +2 -9
- honeycomb/_generated/models/ingest_key_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/ingest_key_request.py +100 -0
- honeycomb/_generated/models/ingest_key_request_attributes.py +75 -0
- honeycomb/_generated/models/ingest_key_request_type.py +8 -0
- honeycomb/_generated/models/ingest_key_type.py +2 -9
- honeycomb/_generated/models/ingest_key_type_key_type.py +1 -0
- honeycomb/_generated/models/jsonapi_error_source.py +2 -9
- honeycomb/_generated/models/kinesis_event.py +2 -5
- honeycomb/_generated/models/kinesis_event_record.py +2 -9
- honeycomb/_generated/models/kinesis_response.py +2 -9
- honeycomb/_generated/models/list_api_keys_filtertype.py +1 -0
- honeycomb/_generated/models/map_dependency.py +2 -5
- honeycomb/_generated/models/map_node.py +2 -9
- honeycomb/_generated/models/map_node_type.py +1 -0
- honeycomb/_generated/models/marker.py +2 -9
- honeycomb/_generated/models/marker_create_request.py +2 -3
- honeycomb/_generated/models/marker_create_request_data.py +16 -10
- honeycomb/_generated/models/marker_create_request_data_attributes.py +2 -9
- honeycomb/_generated/models/marker_create_request_data_relationships.py +2 -3
- honeycomb/_generated/models/marker_create_request_data_type.py +1 -0
- honeycomb/_generated/models/marker_object.py +7 -8
- honeycomb/_generated/models/marker_object_attributes.py +8 -8
- honeycomb/_generated/models/marker_object_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/marker_object_links.py +2 -9
- honeycomb/_generated/models/marker_object_relationships.py +8 -8
- honeycomb/_generated/models/marker_object_relationships_dataset.py +8 -9
- honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +4 -10
- honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +1 -0
- honeycomb/_generated/models/marker_object_type.py +1 -0
- honeycomb/_generated/models/marker_response.py +2 -3
- honeycomb/_generated/models/marker_setting.py +2 -10
- honeycomb/_generated/models/marker_update_request.py +2 -3
- honeycomb/_generated/models/marker_update_request_data.py +16 -10
- honeycomb/_generated/models/marker_update_request_data_attributes.py +2 -9
- honeycomb/_generated/models/marker_update_request_data_relationships.py +2 -3
- honeycomb/_generated/models/marker_update_request_data_type.py +1 -0
- honeycomb/_generated/models/ms_teams_recipient.py +4 -7
- honeycomb/_generated/models/ms_teams_recipient_details.py +1 -7
- honeycomb/_generated/models/ms_teams_recipient_type.py +1 -0
- honeycomb/_generated/models/ms_teams_workflow_recipient.py +12 -11
- honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +1 -7
- honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +1 -0
- honeycomb/_generated/models/notification_recipient.py +8 -8
- honeycomb/_generated/models/notification_recipient_details.py +10 -9
- honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +1 -0
- honeycomb/_generated/models/notification_recipient_details_variables_item.py +2 -9
- honeycomb/_generated/models/pager_duty_recipient.py +8 -9
- honeycomb/_generated/models/pager_duty_recipient_details.py +1 -7
- honeycomb/_generated/models/pager_duty_recipient_type.py +1 -0
- honeycomb/_generated/models/pagination_links.py +2 -8
- honeycomb/_generated/models/payload_template.py +2 -9
- honeycomb/_generated/models/pipeline_configuration_response.py +16 -10
- honeycomb/_generated/models/pipeline_configuration_response_attributes.py +8 -8
- honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +1 -7
- honeycomb/_generated/models/pipeline_configuration_response_links.py +2 -9
- honeycomb/_generated/models/pipeline_configuration_response_type.py +1 -0
- honeycomb/_generated/models/pipeline_configuration_rollout.py +16 -10
- honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +3 -8
- honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +1 -0
- honeycomb/_generated/models/pipeline_configuration_rollout_links.py +2 -9
- honeycomb/_generated/models/pipeline_configuration_rollout_type.py +1 -0
- honeycomb/_generated/models/preset_filter.py +1 -7
- honeycomb/_generated/models/query.py +11 -11
- honeycomb/_generated/models/query_annotation.py +4 -12
- honeycomb/_generated/models/query_annotation_source.py +1 -0
- honeycomb/_generated/models/query_calculated_fields_item.py +1 -7
- honeycomb/_generated/models/query_calculations_item.py +2 -10
- honeycomb/_generated/models/query_compare_time_offset_seconds.py +1 -0
- honeycomb/_generated/models/query_filter_combination.py +1 -0
- honeycomb/_generated/models/query_filters_item.py +2 -11
- honeycomb/_generated/models/query_havings_item.py +2 -10
- honeycomb/_generated/models/query_op.py +1 -0
- honeycomb/_generated/models/query_orders_item.py +2 -9
- honeycomb/_generated/models/query_orders_item_order.py +1 -0
- honeycomb/_generated/models/query_panel.py +2 -6
- honeycomb/_generated/models/query_panel_query_panel.py +10 -9
- honeycomb/_generated/models/query_panel_query_panel_query_style.py +1 -0
- honeycomb/_generated/models/query_result.py +2 -5
- honeycomb/_generated/models/query_result_details.py +5 -8
- honeycomb/_generated/models/query_result_details_data.py +5 -8
- honeycomb/_generated/models/query_result_details_links.py +2 -9
- honeycomb/_generated/models/query_result_links.py +2 -9
- honeycomb/_generated/models/query_results_data.py +2 -5
- honeycomb/_generated/models/query_results_data_data.py +2 -8
- honeycomb/_generated/models/query_results_series.py +2 -5
- honeycomb/_generated/models/recipient_properties.py +4 -12
- honeycomb/_generated/models/recipient_type.py +1 -0
- honeycomb/_generated/models/slack_recipient.py +4 -7
- honeycomb/_generated/models/slack_recipient_details.py +1 -7
- honeycomb/_generated/models/slack_recipient_type.py +1 -0
- honeycomb/_generated/models/slo.py +4 -8
- honeycomb/_generated/models/slo_create.py +4 -8
- honeycomb/_generated/models/slo_create_sli.py +1 -7
- honeycomb/_generated/models/slo_detailed_response.py +4 -8
- honeycomb/_generated/models/slo_detailed_response_status.py +1 -0
- honeycomb/_generated/models/slo_history.py +2 -9
- honeycomb/_generated/models/slo_history_request.py +2 -8
- honeycomb/_generated/models/slo_history_response.py +2 -3
- honeycomb/_generated/models/slo_panel.py +2 -6
- honeycomb/_generated/models/slo_panel_slo_panel.py +2 -9
- honeycomb/_generated/models/slo_sli.py +1 -7
- honeycomb/_generated/models/tag.py +1 -7
- honeycomb/_generated/models/team_relationship.py +2 -3
- honeycomb/_generated/models/team_relationship_team.py +6 -5
- honeycomb/_generated/models/team_relationship_team_data.py +3 -8
- honeycomb/_generated/models/team_relationship_team_data_type.py +1 -0
- honeycomb/_generated/models/template_variable_definition.py +2 -9
- honeycomb/_generated/models/text_panel.py +2 -6
- honeycomb/_generated/models/text_panel_text_panel.py +1 -7
- honeycomb/_generated/models/trigger_response.py +27 -21
- honeycomb/_generated/models/trigger_with_inline_query.py +27 -21
- honeycomb/_generated/models/trigger_with_inline_query_query.py +1 -7
- honeycomb/_generated/models/trigger_with_query_reference.py +21 -18
- honeycomb/_generated/models/update_board_view_request.py +2 -5
- honeycomb/_generated/models/update_environment_request.py +8 -6
- honeycomb/_generated/models/update_environment_request_data.py +10 -7
- honeycomb/_generated/models/update_environment_request_data_attributes.py +8 -8
- honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +2 -9
- honeycomb/_generated/models/update_environment_request_data_type.py +1 -0
- honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +4 -7
- honeycomb/_generated/models/update_pipeline_configuration_rollout.py +10 -7
- honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +3 -8
- honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +1 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +8 -6
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +10 -7
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +3 -8
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +1 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +1 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +8 -6
- honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +1 -0
- honeycomb/_generated/models/user_relationship.py +2 -3
- honeycomb/_generated/models/user_relationship_data.py +2 -8
- honeycomb/_generated/models/user_relationship_data_type.py +1 -0
- honeycomb/_generated/models/validation_error.py +8 -8
- honeycomb/_generated/models/validation_error_type_detail_item.py +4 -10
- honeycomb/_generated/models/validation_error_type_detail_item_code.py +1 -0
- honeycomb/_generated/models/webhook_header.py +2 -9
- honeycomb/_generated/models/webhook_recipient.py +4 -7
- honeycomb/_generated/models/webhook_recipient_details.py +8 -8
- honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +12 -10
- honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +2 -5
- honeycomb/_generated/models/webhook_recipient_type.py +1 -0
- honeycomb/_generated/types.py +1 -1
- honeycomb/cli/__init__.py +85 -0
- honeycomb/cli/api_keys.py +205 -0
- honeycomb/cli/auth.py +70 -0
- honeycomb/cli/boards.py +203 -0
- honeycomb/cli/columns.py +256 -0
- honeycomb/cli/config.py +259 -0
- honeycomb/cli/datasets.py +186 -0
- honeycomb/cli/derived_columns.py +222 -0
- honeycomb/cli/environments.py +240 -0
- honeycomb/cli/formatters.py +242 -0
- honeycomb/cli/markers.py +151 -0
- honeycomb/cli/queries.py +380 -0
- honeycomb/cli/recipients.py +211 -0
- honeycomb/cli/slos.py +338 -0
- honeycomb/cli/triggers.py +271 -0
- honeycomb/client.py +13 -7
- honeycomb/models/__init__.py +18 -3
- honeycomb/models/api_keys.py +49 -5
- honeycomb/models/auth.py +71 -0
- honeycomb/models/board_builder.py +97 -25
- honeycomb/models/boards.py +95 -1
- honeycomb/models/datasets.py +42 -0
- honeycomb/models/queries.py +21 -0
- honeycomb/models/query_builder.py +119 -59
- honeycomb/models/recipient_builder.py +51 -4
- honeycomb/models/slo_builder.py +24 -19
- honeycomb/models/slos.py +50 -3
- honeycomb/models/tool_inputs.py +630 -0
- honeycomb/models/triggers.py +39 -9
- honeycomb/resources/__init__.py +2 -0
- honeycomb/resources/api_keys.py +66 -29
- honeycomb/resources/auth.py +97 -0
- honeycomb/resources/boards.py +272 -18
- honeycomb/resources/datasets.py +49 -11
- honeycomb/resources/environments.py +54 -31
- honeycomb/resources/slos.py +87 -61
- honeycomb/tools/__main__.py +40 -4
- honeycomb/tools/builders.py +235 -150
- honeycomb/tools/descriptions.py +175 -7
- honeycomb/tools/executor.py +212 -25
- honeycomb/tools/generator.py +61 -2264
- honeycomb/tools/resources/__init__.py +42 -0
- honeycomb/tools/resources/api_keys.py +249 -0
- honeycomb/tools/resources/auth.py +98 -0
- honeycomb/tools/resources/boards.py +313 -0
- honeycomb/tools/resources/burn_alerts.py +278 -0
- honeycomb/tools/resources/columns.py +257 -0
- honeycomb/tools/resources/datasets.py +215 -0
- honeycomb/tools/resources/derived_columns.py +311 -0
- honeycomb/tools/resources/environments.py +211 -0
- honeycomb/tools/resources/events.py +158 -0
- honeycomb/tools/resources/marker_settings.py +216 -0
- honeycomb/tools/resources/markers.py +197 -0
- honeycomb/tools/resources/queries.py +220 -0
- honeycomb/tools/resources/recipients.py +297 -0
- honeycomb/tools/resources/service_map.py +110 -0
- honeycomb/tools/resources/slos.py +276 -0
- honeycomb/tools/resources/triggers.py +328 -0
- honeycomb/tools/schemas.py +81 -0
- {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/METADATA +33 -8
- honeycomb_api-0.5.3.dist-info/RECORD +497 -0
- honeycomb_api-0.5.3.dist-info/entry_points.txt +5 -0
- honeycomb_api-0.1.0.dist-info/RECORD +0 -453
- {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/WHEEL +0 -0
- {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/licenses/LICENSE +0 -0
honeycomb/cli/queries.py
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Query management and execution commands.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
|
|
11
|
+
from honeycomb.cli.config import get_client
|
|
12
|
+
from honeycomb.cli.formatters import DEFAULT_OUTPUT_FORMAT, OutputFormat, output_result
|
|
13
|
+
from honeycomb.models.queries import QuerySpec
|
|
14
|
+
from honeycomb.models.query_builder import QueryBuilder
|
|
15
|
+
|
|
16
|
+
app = typer.Typer(help="Manage and run queries")
|
|
17
|
+
console = Console()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@app.command("list")
|
|
21
|
+
def list_queries(
|
|
22
|
+
dataset: str = typer.Option(
|
|
23
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__ for environment-wide)"
|
|
24
|
+
),
|
|
25
|
+
include_board_annotations: bool = typer.Option(
|
|
26
|
+
False, "--include-boards", help="Include board queries"
|
|
27
|
+
),
|
|
28
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
29
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
30
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
31
|
+
quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output query IDs"),
|
|
32
|
+
) -> None:
|
|
33
|
+
"""List all query annotations (saved queries) in a dataset."""
|
|
34
|
+
try:
|
|
35
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
36
|
+
annotations = client.query_annotations.list(
|
|
37
|
+
dataset=dataset, include_board_annotations=include_board_annotations
|
|
38
|
+
)
|
|
39
|
+
output_result(
|
|
40
|
+
annotations,
|
|
41
|
+
output,
|
|
42
|
+
columns=["id", "name", "description"],
|
|
43
|
+
quiet=quiet,
|
|
44
|
+
)
|
|
45
|
+
except Exception as e:
|
|
46
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
47
|
+
raise typer.Exit(1)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@app.command("get")
|
|
51
|
+
def get_query(
|
|
52
|
+
query_id: str = typer.Argument(..., help="Query ID"),
|
|
53
|
+
dataset: str = typer.Option(
|
|
54
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
|
|
55
|
+
),
|
|
56
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
57
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
58
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Get a specific query."""
|
|
61
|
+
try:
|
|
62
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
63
|
+
query = client.queries.get(dataset=dataset, query_id=query_id)
|
|
64
|
+
output_result(query, output)
|
|
65
|
+
except Exception as e:
|
|
66
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
67
|
+
raise typer.Exit(1)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@app.command("create")
|
|
71
|
+
def create_query(
|
|
72
|
+
dataset: str = typer.Option(
|
|
73
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
|
|
74
|
+
),
|
|
75
|
+
from_file: Path = typer.Option(..., "--from-file", "-f", help="JSON file with query spec"),
|
|
76
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
77
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
78
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
79
|
+
) -> None:
|
|
80
|
+
"""Create (save) a query from a JSON file."""
|
|
81
|
+
try:
|
|
82
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
83
|
+
|
|
84
|
+
# Load and parse JSON file
|
|
85
|
+
data = json.loads(from_file.read_text())
|
|
86
|
+
|
|
87
|
+
query_spec = QuerySpec.model_validate(data)
|
|
88
|
+
query = client.queries.create(dataset=dataset, spec=query_spec)
|
|
89
|
+
|
|
90
|
+
console.print(f"[green]Created query with ID: {query.id}[/green]")
|
|
91
|
+
output_result(query, output)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
94
|
+
raise typer.Exit(1)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@app.command("run")
|
|
98
|
+
def run_query(
|
|
99
|
+
# Dataset
|
|
100
|
+
dataset: str = typer.Option(
|
|
101
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
|
|
102
|
+
),
|
|
103
|
+
# Input methods (mutually exclusive with builder flags)
|
|
104
|
+
from_file: Path | None = typer.Option(
|
|
105
|
+
None, "--from-file", "-f", help="JSON file with query spec"
|
|
106
|
+
),
|
|
107
|
+
spec: str | None = typer.Option(None, "--spec", "-s", help="Inline JSON query spec"),
|
|
108
|
+
query_id: str | None = typer.Option(None, "--query-id", help="Run an existing saved query"),
|
|
109
|
+
# QueryBuilder flags - Calculations
|
|
110
|
+
count: bool = typer.Option(False, "--count", help="Add COUNT calculation"),
|
|
111
|
+
avg: list[str] = typer.Option([], "--avg", help="Add AVG calculation for column (repeatable)"),
|
|
112
|
+
sum_cols: list[str] = typer.Option(
|
|
113
|
+
[], "--sum", help="Add SUM calculation for column (repeatable)"
|
|
114
|
+
),
|
|
115
|
+
min_calc: list[str] = typer.Option(
|
|
116
|
+
[], "--min", help="Add MIN calculation for column (repeatable)"
|
|
117
|
+
),
|
|
118
|
+
max_calc: list[str] = typer.Option(
|
|
119
|
+
[], "--max", help="Add MAX calculation for column (repeatable)"
|
|
120
|
+
),
|
|
121
|
+
p50: list[str] = typer.Option([], "--p50", help="Add P50 calculation for column (repeatable)"),
|
|
122
|
+
p90: list[str] = typer.Option([], "--p90", help="Add P90 calculation for column (repeatable)"),
|
|
123
|
+
p95: list[str] = typer.Option([], "--p95", help="Add P95 calculation for column (repeatable)"),
|
|
124
|
+
p99: list[str] = typer.Option([], "--p99", help="Add P99 calculation for column (repeatable)"),
|
|
125
|
+
# Time ranges
|
|
126
|
+
time_range: int | None = typer.Option(None, "--time-range", help="Time range in seconds"),
|
|
127
|
+
last_10_minutes: bool = typer.Option(False, "--last-10-minutes", help="Last 10 minutes"),
|
|
128
|
+
last_30_minutes: bool = typer.Option(False, "--last-30-minutes", help="Last 30 minutes"),
|
|
129
|
+
last_1_hour: bool = typer.Option(False, "--last-1-hour", help="Last 1 hour"),
|
|
130
|
+
last_2_hours: bool = typer.Option(False, "--last-2-hours", help="Last 2 hours"),
|
|
131
|
+
last_8_hours: bool = typer.Option(False, "--last-8-hours", help="Last 8 hours"),
|
|
132
|
+
last_24_hours: bool = typer.Option(False, "--last-24-hours", help="Last 24 hours"),
|
|
133
|
+
last_7_days: bool = typer.Option(False, "--last-7-days", help="Last 7 days"),
|
|
134
|
+
# Filters (comma-separated: column,value)
|
|
135
|
+
where_equals: list[str] = typer.Option(
|
|
136
|
+
[], "--where-equals", help="Filter: column=value (format: col,val)"
|
|
137
|
+
),
|
|
138
|
+
where_ne: list[str] = typer.Option(
|
|
139
|
+
[], "--where-ne", help="Filter: column!=value (format: col,val)"
|
|
140
|
+
),
|
|
141
|
+
where_gt: list[str] = typer.Option(
|
|
142
|
+
[], "--where-gt", help="Filter: column>value (format: col,val)"
|
|
143
|
+
),
|
|
144
|
+
where_gte: list[str] = typer.Option(
|
|
145
|
+
[], "--where-gte", help="Filter: column>=value (format: col,val)"
|
|
146
|
+
),
|
|
147
|
+
where_lt: list[str] = typer.Option(
|
|
148
|
+
[], "--where-lt", help="Filter: column<value (format: col,val)"
|
|
149
|
+
),
|
|
150
|
+
where_lte: list[str] = typer.Option(
|
|
151
|
+
[], "--where-lte", help="Filter: column<=value (format: col,val)"
|
|
152
|
+
),
|
|
153
|
+
where_contains: list[str] = typer.Option(
|
|
154
|
+
[], "--where-contains", help="Filter: column contains value (format: col,val)"
|
|
155
|
+
),
|
|
156
|
+
where_exists: list[str] = typer.Option(
|
|
157
|
+
[], "--where-exists", help="Filter: column exists (just column name)"
|
|
158
|
+
),
|
|
159
|
+
# Grouping and ordering
|
|
160
|
+
group_by: list[str] = typer.Option([], "--group-by", help="Group by column (repeatable)"),
|
|
161
|
+
order_by: str | None = typer.Option(None, "--order-by", help="Order by field"),
|
|
162
|
+
limit_rows: int | None = typer.Option(None, "--limit", help="Limit results"),
|
|
163
|
+
# Query execution
|
|
164
|
+
poll_interval: float = typer.Option(1.0, "--poll-interval", help="Polling interval in seconds"),
|
|
165
|
+
timeout: float = typer.Option(60.0, "--timeout", help="Timeout in seconds"),
|
|
166
|
+
# Auth and output
|
|
167
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
168
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
169
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
170
|
+
) -> None:
|
|
171
|
+
"""
|
|
172
|
+
Run a query and wait for results.
|
|
173
|
+
|
|
174
|
+
Three modes:
|
|
175
|
+
1. Builder mode: Use flags like --count, --avg, --where-equals, etc.
|
|
176
|
+
2. File mode: --from-file query.json
|
|
177
|
+
3. Spec mode: --spec '{"calculations": [...]}'
|
|
178
|
+
4. Saved query mode: --query-id query-123
|
|
179
|
+
"""
|
|
180
|
+
try:
|
|
181
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
182
|
+
|
|
183
|
+
# Determine which mode we're in
|
|
184
|
+
using_builder = any(
|
|
185
|
+
[
|
|
186
|
+
count,
|
|
187
|
+
avg,
|
|
188
|
+
sum_cols,
|
|
189
|
+
min_calc,
|
|
190
|
+
max_calc,
|
|
191
|
+
p50,
|
|
192
|
+
p90,
|
|
193
|
+
p95,
|
|
194
|
+
p99,
|
|
195
|
+
time_range,
|
|
196
|
+
last_10_minutes,
|
|
197
|
+
last_30_minutes,
|
|
198
|
+
last_1_hour,
|
|
199
|
+
last_2_hours,
|
|
200
|
+
last_8_hours,
|
|
201
|
+
last_24_hours,
|
|
202
|
+
last_7_days,
|
|
203
|
+
where_equals,
|
|
204
|
+
where_ne,
|
|
205
|
+
where_gt,
|
|
206
|
+
where_gte,
|
|
207
|
+
where_lt,
|
|
208
|
+
where_lte,
|
|
209
|
+
where_contains,
|
|
210
|
+
where_exists,
|
|
211
|
+
group_by,
|
|
212
|
+
order_by,
|
|
213
|
+
limit_rows,
|
|
214
|
+
]
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
mode_count = sum([bool(from_file), bool(spec), bool(query_id), using_builder])
|
|
218
|
+
if mode_count != 1:
|
|
219
|
+
console.print(
|
|
220
|
+
"[red]Error:[/red] Use exactly one mode: builder flags, --from-file, --spec, or --query-id",
|
|
221
|
+
style="bold",
|
|
222
|
+
)
|
|
223
|
+
raise typer.Exit(1)
|
|
224
|
+
|
|
225
|
+
if query_id:
|
|
226
|
+
# Run existing saved query
|
|
227
|
+
result = client.query_results.run(
|
|
228
|
+
dataset=dataset,
|
|
229
|
+
query_id=query_id,
|
|
230
|
+
poll_interval=poll_interval,
|
|
231
|
+
timeout=timeout,
|
|
232
|
+
)
|
|
233
|
+
elif using_builder:
|
|
234
|
+
# Build query using flags
|
|
235
|
+
builder = QueryBuilder().dataset(dataset)
|
|
236
|
+
|
|
237
|
+
# Add calculations
|
|
238
|
+
if count:
|
|
239
|
+
builder.count()
|
|
240
|
+
for col in avg:
|
|
241
|
+
builder.avg(col)
|
|
242
|
+
for col in sum_cols:
|
|
243
|
+
builder.sum(col)
|
|
244
|
+
for col in min_calc:
|
|
245
|
+
builder.min(col)
|
|
246
|
+
for col in max_calc:
|
|
247
|
+
builder.max(col)
|
|
248
|
+
for col in p50:
|
|
249
|
+
builder.p50(col)
|
|
250
|
+
for col in p90:
|
|
251
|
+
builder.p90(col)
|
|
252
|
+
for col in p95:
|
|
253
|
+
builder.p95(col)
|
|
254
|
+
for col in p99:
|
|
255
|
+
builder.p99(col)
|
|
256
|
+
|
|
257
|
+
# Add time range
|
|
258
|
+
if time_range:
|
|
259
|
+
builder.time_range(time_range)
|
|
260
|
+
elif last_10_minutes:
|
|
261
|
+
builder.last_10_minutes()
|
|
262
|
+
elif last_30_minutes:
|
|
263
|
+
builder.last_30_minutes()
|
|
264
|
+
elif last_1_hour:
|
|
265
|
+
builder.last_1_hour()
|
|
266
|
+
elif last_2_hours:
|
|
267
|
+
builder.last_2_hours()
|
|
268
|
+
elif last_8_hours:
|
|
269
|
+
builder.last_8_hours()
|
|
270
|
+
elif last_24_hours:
|
|
271
|
+
builder.last_24_hours()
|
|
272
|
+
elif last_7_days:
|
|
273
|
+
builder.last_7_days()
|
|
274
|
+
|
|
275
|
+
# Add filters
|
|
276
|
+
for filter_spec in where_equals:
|
|
277
|
+
col, val = _parse_filter(filter_spec)
|
|
278
|
+
builder.eq(col, val)
|
|
279
|
+
for filter_spec in where_ne:
|
|
280
|
+
col, val = _parse_filter(filter_spec)
|
|
281
|
+
builder.ne(col, val)
|
|
282
|
+
for filter_spec in where_gt:
|
|
283
|
+
col, val = _parse_filter(filter_spec)
|
|
284
|
+
builder.gt(col, _parse_number(val))
|
|
285
|
+
for filter_spec in where_gte:
|
|
286
|
+
col, val = _parse_filter(filter_spec)
|
|
287
|
+
builder.gte(col, _parse_number(val))
|
|
288
|
+
for filter_spec in where_lt:
|
|
289
|
+
col, val = _parse_filter(filter_spec)
|
|
290
|
+
builder.lt(col, _parse_number(val))
|
|
291
|
+
for filter_spec in where_lte:
|
|
292
|
+
col, val = _parse_filter(filter_spec)
|
|
293
|
+
builder.lte(col, _parse_number(val))
|
|
294
|
+
for filter_spec in where_contains:
|
|
295
|
+
col, val = _parse_filter(filter_spec)
|
|
296
|
+
builder.contains(col, val)
|
|
297
|
+
for col in where_exists:
|
|
298
|
+
builder.exists(col)
|
|
299
|
+
|
|
300
|
+
# Add grouping
|
|
301
|
+
if group_by:
|
|
302
|
+
builder.group_by(*group_by)
|
|
303
|
+
|
|
304
|
+
# Add ordering
|
|
305
|
+
if order_by:
|
|
306
|
+
builder.order_by(order_by)
|
|
307
|
+
|
|
308
|
+
# Add limit
|
|
309
|
+
if limit_rows:
|
|
310
|
+
builder.limit(limit_rows)
|
|
311
|
+
|
|
312
|
+
# Run the query
|
|
313
|
+
_, result = client.query_results.create_and_run(
|
|
314
|
+
spec=builder,
|
|
315
|
+
poll_interval=poll_interval,
|
|
316
|
+
timeout=timeout,
|
|
317
|
+
)
|
|
318
|
+
else:
|
|
319
|
+
# Run ephemeral query from spec
|
|
320
|
+
query_data = (
|
|
321
|
+
json.loads(from_file.read_text()) if from_file else json.loads(spec) # type: ignore
|
|
322
|
+
)
|
|
323
|
+
query_spec = QuerySpec.model_validate(query_data)
|
|
324
|
+
# Use create_and_run for spec-based queries
|
|
325
|
+
_, result = client.query_results.create_and_run(
|
|
326
|
+
spec=query_spec,
|
|
327
|
+
dataset=dataset,
|
|
328
|
+
poll_interval=poll_interval,
|
|
329
|
+
timeout=timeout,
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
console.print("[green]Query completed[/green]")
|
|
333
|
+
output_result(result, output)
|
|
334
|
+
except typer.Exit:
|
|
335
|
+
raise
|
|
336
|
+
except Exception as e:
|
|
337
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
338
|
+
raise typer.Exit(1)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
@app.command("get-result")
|
|
342
|
+
def get_query_result(
|
|
343
|
+
query_result_id: str = typer.Argument(..., help="Query result ID"),
|
|
344
|
+
dataset: str = typer.Option(
|
|
345
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
|
|
346
|
+
),
|
|
347
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
348
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
349
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
350
|
+
) -> None:
|
|
351
|
+
"""Get results for a specific query execution."""
|
|
352
|
+
try:
|
|
353
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
354
|
+
result = client.query_results.get(dataset=dataset, query_result_id=query_result_id)
|
|
355
|
+
output_result(result, output)
|
|
356
|
+
except Exception as e:
|
|
357
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
358
|
+
raise typer.Exit(1)
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def _parse_filter(filter_spec: str) -> tuple[str, str]:
|
|
362
|
+
"""Parse a filter specification like 'column,value' into (column, value)."""
|
|
363
|
+
parts = filter_spec.split(",", 1)
|
|
364
|
+
if len(parts) != 2:
|
|
365
|
+
console.print(
|
|
366
|
+
f"[red]Error:[/red] Invalid filter format: '{filter_spec}'. Expected: column,value",
|
|
367
|
+
style="bold",
|
|
368
|
+
)
|
|
369
|
+
raise typer.Exit(1)
|
|
370
|
+
return parts[0].strip(), parts[1].strip()
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _parse_number(value: str) -> int | float:
|
|
374
|
+
"""Parse a string as int or float."""
|
|
375
|
+
try:
|
|
376
|
+
if "." in value:
|
|
377
|
+
return float(value)
|
|
378
|
+
return int(value)
|
|
379
|
+
except ValueError:
|
|
380
|
+
return value # type: ignore # Return as string if not a number
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Recipient management commands.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
|
|
11
|
+
from honeycomb.cli.config import get_client
|
|
12
|
+
from honeycomb.cli.formatters import DEFAULT_OUTPUT_FORMAT, OutputFormat, output_result
|
|
13
|
+
from honeycomb.models.recipients import RecipientCreate
|
|
14
|
+
|
|
15
|
+
app = typer.Typer(help="Manage recipients (notification targets)")
|
|
16
|
+
console = Console()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@app.command("list")
|
|
20
|
+
def list_recipients(
|
|
21
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
22
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
23
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
24
|
+
quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output recipient IDs"),
|
|
25
|
+
) -> None:
|
|
26
|
+
"""List all recipients in the environment."""
|
|
27
|
+
try:
|
|
28
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
29
|
+
recipients = client.recipients.list()
|
|
30
|
+
output_result(
|
|
31
|
+
recipients,
|
|
32
|
+
output,
|
|
33
|
+
columns=["id", "type", "created_at"],
|
|
34
|
+
quiet=quiet,
|
|
35
|
+
)
|
|
36
|
+
except Exception as e:
|
|
37
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
38
|
+
raise typer.Exit(1)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@app.command("get")
|
|
42
|
+
def get_recipient(
|
|
43
|
+
recipient_id: str = typer.Argument(..., help="Recipient ID"),
|
|
44
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
45
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
46
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Get a specific recipient."""
|
|
49
|
+
try:
|
|
50
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
51
|
+
recipient = client.recipients.get(recipient_id=recipient_id)
|
|
52
|
+
output_result(recipient, output)
|
|
53
|
+
except Exception as e:
|
|
54
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
55
|
+
raise typer.Exit(1)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@app.command("create")
|
|
59
|
+
def create_recipient(
|
|
60
|
+
from_file: Path = typer.Option(
|
|
61
|
+
..., "--from-file", "-f", help="JSON file with recipient config"
|
|
62
|
+
),
|
|
63
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
64
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
65
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
66
|
+
) -> None:
|
|
67
|
+
"""Create a recipient from a JSON file."""
|
|
68
|
+
try:
|
|
69
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
70
|
+
|
|
71
|
+
# Load and parse JSON file
|
|
72
|
+
data = json.loads(from_file.read_text())
|
|
73
|
+
|
|
74
|
+
# Strip fields that shouldn't be in create request
|
|
75
|
+
data.pop("id", None)
|
|
76
|
+
data.pop("created_at", None)
|
|
77
|
+
data.pop("updated_at", None)
|
|
78
|
+
|
|
79
|
+
recipient_create = RecipientCreate.model_validate(data)
|
|
80
|
+
recipient = client.recipients.create(recipient=recipient_create)
|
|
81
|
+
|
|
82
|
+
console.print(
|
|
83
|
+
f"[green]Created recipient ({recipient.type}) with ID: {recipient.id}[/green]"
|
|
84
|
+
)
|
|
85
|
+
output_result(recipient, output)
|
|
86
|
+
except Exception as e:
|
|
87
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
88
|
+
raise typer.Exit(1)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@app.command("update")
|
|
92
|
+
def update_recipient(
|
|
93
|
+
recipient_id: str = typer.Argument(..., help="Recipient ID"),
|
|
94
|
+
from_file: Path = typer.Option(
|
|
95
|
+
..., "--from-file", "-f", help="JSON file with recipient config"
|
|
96
|
+
),
|
|
97
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
98
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
99
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
100
|
+
) -> None:
|
|
101
|
+
"""Update an existing recipient."""
|
|
102
|
+
try:
|
|
103
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
104
|
+
|
|
105
|
+
# Load and parse JSON file
|
|
106
|
+
data = json.loads(from_file.read_text())
|
|
107
|
+
|
|
108
|
+
# Strip fields that shouldn't be in update request
|
|
109
|
+
data.pop("id", None)
|
|
110
|
+
data.pop("created_at", None)
|
|
111
|
+
data.pop("updated_at", None)
|
|
112
|
+
|
|
113
|
+
recipient_update = RecipientCreate.model_validate(data)
|
|
114
|
+
recipient = client.recipients.update(recipient_id=recipient_id, recipient=recipient_update)
|
|
115
|
+
|
|
116
|
+
console.print(f"[green]Updated recipient {recipient.id}[/green]")
|
|
117
|
+
output_result(recipient, output)
|
|
118
|
+
except Exception as e:
|
|
119
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
120
|
+
raise typer.Exit(1)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@app.command("delete")
|
|
124
|
+
def delete_recipient(
|
|
125
|
+
recipient_id: str = typer.Argument(..., help="Recipient ID"),
|
|
126
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
127
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
128
|
+
yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
|
|
129
|
+
) -> None:
|
|
130
|
+
"""Delete a recipient."""
|
|
131
|
+
try:
|
|
132
|
+
if not yes:
|
|
133
|
+
confirm = typer.confirm(f"Delete recipient {recipient_id}?")
|
|
134
|
+
if not confirm:
|
|
135
|
+
console.print("[yellow]Cancelled[/yellow]")
|
|
136
|
+
raise typer.Exit(0)
|
|
137
|
+
|
|
138
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
139
|
+
client.recipients.delete(recipient_id=recipient_id)
|
|
140
|
+
console.print(f"[green]Deleted recipient {recipient_id}[/green]")
|
|
141
|
+
except Exception as e:
|
|
142
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
143
|
+
raise typer.Exit(1)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@app.command("export")
|
|
147
|
+
def export_recipient(
|
|
148
|
+
recipient_id: str = typer.Argument(..., help="Recipient ID"),
|
|
149
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
150
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
151
|
+
output_file: Path | None = typer.Option(
|
|
152
|
+
None, "--output-file", "-o", help="Output file (default: stdout)"
|
|
153
|
+
),
|
|
154
|
+
) -> None:
|
|
155
|
+
"""
|
|
156
|
+
Export a recipient as JSON.
|
|
157
|
+
|
|
158
|
+
Output is suitable for importing to another environment via the 'create' command.
|
|
159
|
+
"""
|
|
160
|
+
try:
|
|
161
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
162
|
+
recipient = client.recipients.get(recipient_id=recipient_id)
|
|
163
|
+
|
|
164
|
+
# Export without IDs/timestamps for portability
|
|
165
|
+
data = recipient.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
|
|
166
|
+
json_str = json.dumps(data, indent=2, default=str)
|
|
167
|
+
|
|
168
|
+
if output_file:
|
|
169
|
+
output_file.write_text(json_str)
|
|
170
|
+
console.print(f"[green]Exported recipient to {output_file}[/green]")
|
|
171
|
+
else:
|
|
172
|
+
console.print(json_str)
|
|
173
|
+
except Exception as e:
|
|
174
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
175
|
+
raise typer.Exit(1)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
@app.command("export-all")
|
|
179
|
+
def export_all_recipients(
|
|
180
|
+
output_dir: Path = typer.Option(..., "--output-dir", help="Output directory"),
|
|
181
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
182
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
183
|
+
) -> None:
|
|
184
|
+
"""Export all recipients to individual JSON files."""
|
|
185
|
+
try:
|
|
186
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
187
|
+
|
|
188
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
189
|
+
recipients = client.recipients.list()
|
|
190
|
+
|
|
191
|
+
for recipient in recipients:
|
|
192
|
+
# Export without IDs/timestamps
|
|
193
|
+
data = recipient.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
|
|
194
|
+
|
|
195
|
+
# Use recipient ID and type for filename
|
|
196
|
+
filename = f"{recipient.type.value}_{recipient.id}.json"
|
|
197
|
+
file_path = output_dir / filename
|
|
198
|
+
|
|
199
|
+
with open(file_path, "w") as f:
|
|
200
|
+
json.dump(data, f, indent=2, default=str)
|
|
201
|
+
|
|
202
|
+
console.print(
|
|
203
|
+
f"[green]Exported {recipient.type.value} recipient to {file_path}[/green]"
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
console.print(
|
|
207
|
+
f"\n[bold green]Exported {len(recipients)} recipients to {output_dir}[/bold green]"
|
|
208
|
+
)
|
|
209
|
+
except Exception as e:
|
|
210
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
211
|
+
raise typer.Exit(1)
|