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/config.py
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration management for the Honeycomb CLI.
|
|
3
|
+
|
|
4
|
+
Handles profiles, credentials, and client initialization.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
import typer
|
|
12
|
+
import yaml
|
|
13
|
+
from rich.console import Console
|
|
14
|
+
from rich.table import Table
|
|
15
|
+
|
|
16
|
+
from honeycomb import HoneycombClient
|
|
17
|
+
|
|
18
|
+
app = typer.Typer(help="Manage CLI configuration and profiles")
|
|
19
|
+
console = Console()
|
|
20
|
+
|
|
21
|
+
CONFIG_DIR = Path.home() / ".honeycomb"
|
|
22
|
+
CONFIG_FILE = CONFIG_DIR / "config.yaml"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _ensure_config_dir() -> None:
|
|
26
|
+
"""Ensure the config directory exists."""
|
|
27
|
+
CONFIG_DIR.mkdir(exist_ok=True)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _load_config() -> dict[str, Any]:
|
|
31
|
+
"""Load the config file, returning empty dict if it doesn't exist."""
|
|
32
|
+
if not CONFIG_FILE.exists():
|
|
33
|
+
return {}
|
|
34
|
+
with open(CONFIG_FILE) as f:
|
|
35
|
+
return yaml.safe_load(f) or {}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _save_config(config: dict[str, Any]) -> None:
|
|
39
|
+
"""Save the config file."""
|
|
40
|
+
_ensure_config_dir()
|
|
41
|
+
with open(CONFIG_FILE, "w") as f:
|
|
42
|
+
yaml.safe_dump(config, f, default_flow_style=False)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_api_key_from_config(profile: str | None = None) -> str | None:
|
|
46
|
+
"""
|
|
47
|
+
Get API key from environment or config.
|
|
48
|
+
|
|
49
|
+
Priority order:
|
|
50
|
+
1. Environment variable (HONEYCOMB_API_KEY)
|
|
51
|
+
2. Profile from config file
|
|
52
|
+
3. Default profile from config file
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
API key string or None if not found
|
|
56
|
+
"""
|
|
57
|
+
# Try environment variable
|
|
58
|
+
env_api_key = os.environ.get("HONEYCOMB_API_KEY")
|
|
59
|
+
if env_api_key:
|
|
60
|
+
return env_api_key
|
|
61
|
+
|
|
62
|
+
# Try profile from config file
|
|
63
|
+
config = _load_config()
|
|
64
|
+
profiles = config.get("profiles", {})
|
|
65
|
+
|
|
66
|
+
# Use specified profile or default
|
|
67
|
+
profile_name = profile or config.get("default_profile")
|
|
68
|
+
if not profile_name or profile_name not in profiles:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
return profiles[profile_name].get("api_key")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_client(
|
|
75
|
+
profile: str | None = None,
|
|
76
|
+
api_key: str | None = None,
|
|
77
|
+
management_key: str | None = None,
|
|
78
|
+
management_secret: str | None = None,
|
|
79
|
+
base_url: str | None = None,
|
|
80
|
+
) -> HoneycombClient:
|
|
81
|
+
"""
|
|
82
|
+
Get a configured Honeycomb client.
|
|
83
|
+
|
|
84
|
+
Priority order:
|
|
85
|
+
1. Explicit parameters (api_key, management_key, etc.)
|
|
86
|
+
2. Environment variables (HONEYCOMB_API_KEY, etc.)
|
|
87
|
+
3. Profile from config file
|
|
88
|
+
4. Default profile from config file
|
|
89
|
+
"""
|
|
90
|
+
# If explicit credentials provided, use them
|
|
91
|
+
if api_key or management_key:
|
|
92
|
+
return HoneycombClient(
|
|
93
|
+
api_key=api_key,
|
|
94
|
+
management_key=management_key,
|
|
95
|
+
management_secret=management_secret,
|
|
96
|
+
base_url=base_url or "https://api.honeycomb.io",
|
|
97
|
+
sync=True,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Try environment variables
|
|
101
|
+
env_api_key = os.environ.get("HONEYCOMB_API_KEY")
|
|
102
|
+
env_mgmt_key = os.environ.get("HONEYCOMB_MANAGEMENT_KEY")
|
|
103
|
+
env_mgmt_secret = os.environ.get("HONEYCOMB_MANAGEMENT_SECRET")
|
|
104
|
+
|
|
105
|
+
if env_api_key or env_mgmt_key:
|
|
106
|
+
return HoneycombClient(
|
|
107
|
+
api_key=env_api_key,
|
|
108
|
+
management_key=env_mgmt_key,
|
|
109
|
+
management_secret=env_mgmt_secret,
|
|
110
|
+
base_url=base_url or "https://api.honeycomb.io",
|
|
111
|
+
sync=True,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Try profile from config file
|
|
115
|
+
config = _load_config()
|
|
116
|
+
profiles = config.get("profiles", {})
|
|
117
|
+
|
|
118
|
+
# Use specified profile or default
|
|
119
|
+
profile_name = profile or config.get("default_profile")
|
|
120
|
+
|
|
121
|
+
if not profile_name:
|
|
122
|
+
console.print(
|
|
123
|
+
"[red]Error:[/red] No credentials found. Provide --api-key or configure a profile.",
|
|
124
|
+
style="bold",
|
|
125
|
+
)
|
|
126
|
+
raise typer.Exit(1)
|
|
127
|
+
|
|
128
|
+
if profile_name not in profiles:
|
|
129
|
+
console.print(
|
|
130
|
+
f"[red]Error:[/red] Profile '{profile_name}' not found in {CONFIG_FILE}",
|
|
131
|
+
style="bold",
|
|
132
|
+
)
|
|
133
|
+
raise typer.Exit(1)
|
|
134
|
+
|
|
135
|
+
profile_config = profiles[profile_name]
|
|
136
|
+
return HoneycombClient(
|
|
137
|
+
api_key=profile_config.get("api_key"),
|
|
138
|
+
management_key=profile_config.get("management_key"),
|
|
139
|
+
management_secret=profile_config.get("management_secret"),
|
|
140
|
+
base_url=profile_config.get("base_url", "https://api.honeycomb.io"),
|
|
141
|
+
sync=True,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@app.command("show")
|
|
146
|
+
def show_config() -> None:
|
|
147
|
+
"""Show current configuration."""
|
|
148
|
+
if not CONFIG_FILE.exists():
|
|
149
|
+
console.print(f"[yellow]No config file found at {CONFIG_FILE}[/yellow]")
|
|
150
|
+
return
|
|
151
|
+
|
|
152
|
+
config = _load_config()
|
|
153
|
+
|
|
154
|
+
# Display default profile
|
|
155
|
+
default_profile = config.get("default_profile")
|
|
156
|
+
if default_profile:
|
|
157
|
+
console.print(f"[bold]Default profile:[/bold] {default_profile}\n")
|
|
158
|
+
else:
|
|
159
|
+
console.print("[yellow]No default profile set[/yellow]\n")
|
|
160
|
+
|
|
161
|
+
# Display profiles table
|
|
162
|
+
profiles = config.get("profiles", {})
|
|
163
|
+
if not profiles:
|
|
164
|
+
console.print("[yellow]No profiles configured[/yellow]")
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
table = Table(title="Profiles")
|
|
168
|
+
table.add_column("Name", style="cyan")
|
|
169
|
+
table.add_column("API Key", style="green")
|
|
170
|
+
table.add_column("Management Key", style="green")
|
|
171
|
+
table.add_column("Base URL", style="blue")
|
|
172
|
+
|
|
173
|
+
for name, profile in profiles.items():
|
|
174
|
+
api_key = profile.get("api_key", "")
|
|
175
|
+
mgmt_key = profile.get("management_key", "")
|
|
176
|
+
base_url = profile.get("base_url", "https://api.honeycomb.io")
|
|
177
|
+
|
|
178
|
+
# Mask keys for security
|
|
179
|
+
api_key_display = f"{api_key[:10]}..." if api_key else "-"
|
|
180
|
+
mgmt_key_display = f"{mgmt_key[:10]}..." if mgmt_key else "-"
|
|
181
|
+
|
|
182
|
+
table.add_row(name, api_key_display, mgmt_key_display, base_url)
|
|
183
|
+
|
|
184
|
+
console.print(table)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
@app.command("add-profile")
|
|
188
|
+
def add_profile(
|
|
189
|
+
name: str = typer.Argument(..., help="Profile name"),
|
|
190
|
+
api_key: str | None = typer.Option(None, "--api-key", help="API key"),
|
|
191
|
+
management_key: str | None = typer.Option(None, "--management-key", help="Management key"),
|
|
192
|
+
management_secret: str | None = typer.Option(
|
|
193
|
+
None, "--management-secret", help="Management secret"
|
|
194
|
+
),
|
|
195
|
+
base_url: str | None = typer.Option(
|
|
196
|
+
None, "--base-url", help="Base URL (default: https://api.honeycomb.io)"
|
|
197
|
+
),
|
|
198
|
+
set_default: bool = typer.Option(False, "--set-default", help="Set as default profile"),
|
|
199
|
+
) -> None:
|
|
200
|
+
"""Add or update a profile."""
|
|
201
|
+
if not api_key and not management_key:
|
|
202
|
+
console.print("[red]Error:[/red] Must provide --api-key or --management-key", style="bold")
|
|
203
|
+
raise typer.Exit(1)
|
|
204
|
+
|
|
205
|
+
if management_key and not management_secret:
|
|
206
|
+
console.print(
|
|
207
|
+
"[red]Error:[/red] --management-secret required when using --management-key",
|
|
208
|
+
style="bold",
|
|
209
|
+
)
|
|
210
|
+
raise typer.Exit(1)
|
|
211
|
+
|
|
212
|
+
config = _load_config()
|
|
213
|
+
if "profiles" not in config:
|
|
214
|
+
config["profiles"] = {}
|
|
215
|
+
|
|
216
|
+
config["profiles"][name] = {}
|
|
217
|
+
if api_key:
|
|
218
|
+
config["profiles"][name]["api_key"] = api_key
|
|
219
|
+
if management_key:
|
|
220
|
+
config["profiles"][name]["management_key"] = management_key
|
|
221
|
+
config["profiles"][name]["management_secret"] = management_secret
|
|
222
|
+
if base_url:
|
|
223
|
+
config["profiles"][name]["base_url"] = base_url
|
|
224
|
+
|
|
225
|
+
if set_default:
|
|
226
|
+
config["default_profile"] = name
|
|
227
|
+
|
|
228
|
+
_save_config(config)
|
|
229
|
+
console.print(f"[green]Profile '{name}' saved to {CONFIG_FILE}[/green]")
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@app.command("remove-profile")
|
|
233
|
+
def remove_profile(name: str = typer.Argument(..., help="Profile name")) -> None:
|
|
234
|
+
"""Remove a profile."""
|
|
235
|
+
config = _load_config()
|
|
236
|
+
profiles = config.get("profiles", {})
|
|
237
|
+
|
|
238
|
+
if name not in profiles:
|
|
239
|
+
console.print(f"[red]Error:[/red] Profile '{name}' not found", style="bold")
|
|
240
|
+
raise typer.Exit(1)
|
|
241
|
+
|
|
242
|
+
del profiles[name]
|
|
243
|
+
_save_config(config)
|
|
244
|
+
console.print(f"[green]Profile '{name}' removed[/green]")
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
@app.command("set-default")
|
|
248
|
+
def set_default(name: str = typer.Argument(..., help="Profile name")) -> None:
|
|
249
|
+
"""Set the default profile."""
|
|
250
|
+
config = _load_config()
|
|
251
|
+
profiles = config.get("profiles", {})
|
|
252
|
+
|
|
253
|
+
if name not in profiles:
|
|
254
|
+
console.print(f"[red]Error:[/red] Profile '{name}' not found", style="bold")
|
|
255
|
+
raise typer.Exit(1)
|
|
256
|
+
|
|
257
|
+
config["default_profile"] = name
|
|
258
|
+
_save_config(config)
|
|
259
|
+
console.print(f"[green]Default profile set to '{name}'[/green]")
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Dataset 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.datasets import DatasetCreate, DatasetUpdate
|
|
14
|
+
|
|
15
|
+
app = typer.Typer(help="Manage datasets")
|
|
16
|
+
console = Console()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@app.command("list")
|
|
20
|
+
def list_datasets(
|
|
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 dataset slugs"),
|
|
25
|
+
) -> None:
|
|
26
|
+
"""List all datasets in the environment."""
|
|
27
|
+
try:
|
|
28
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
29
|
+
datasets = client.datasets.list()
|
|
30
|
+
output_result(
|
|
31
|
+
datasets, output, columns=["slug", "name", "description", "created_at"], quiet=quiet
|
|
32
|
+
)
|
|
33
|
+
except Exception as e:
|
|
34
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
35
|
+
raise typer.Exit(1)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@app.command("get")
|
|
39
|
+
def get_dataset(
|
|
40
|
+
slug: str = typer.Argument(..., help="Dataset slug"),
|
|
41
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
42
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
43
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
44
|
+
) -> None:
|
|
45
|
+
"""Get a specific dataset."""
|
|
46
|
+
try:
|
|
47
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
48
|
+
dataset = client.datasets.get(slug=slug)
|
|
49
|
+
output_result(dataset, output)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
52
|
+
raise typer.Exit(1)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@app.command("create")
|
|
56
|
+
def create_dataset(
|
|
57
|
+
name: str | None = typer.Option(None, "--name", "-n", help="Dataset name"),
|
|
58
|
+
slug: str | None = typer.Option(None, "--slug", "-s", help="Dataset slug"),
|
|
59
|
+
description: str | None = typer.Option(None, "--description", "-d", help="Dataset description"),
|
|
60
|
+
from_file: Path | None = typer.Option(
|
|
61
|
+
None, "--from-file", "-f", help="JSON file with dataset 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 new dataset."""
|
|
68
|
+
try:
|
|
69
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
70
|
+
|
|
71
|
+
if from_file:
|
|
72
|
+
# Load from JSON file
|
|
73
|
+
data = json.loads(from_file.read_text())
|
|
74
|
+
data.pop("created_at", None)
|
|
75
|
+
data.pop("updated_at", None)
|
|
76
|
+
dataset_create = DatasetCreate.model_validate(data)
|
|
77
|
+
elif name and slug:
|
|
78
|
+
# Create from CLI arguments
|
|
79
|
+
dataset_create = DatasetCreate(name=name, slug=slug, description=description)
|
|
80
|
+
else:
|
|
81
|
+
console.print(
|
|
82
|
+
"[red]Error:[/red] Provide --name and --slug, or --from-file", style="bold"
|
|
83
|
+
)
|
|
84
|
+
raise typer.Exit(1)
|
|
85
|
+
|
|
86
|
+
dataset = client.datasets.create(dataset=dataset_create)
|
|
87
|
+
|
|
88
|
+
console.print(f"[green]Created dataset '{dataset.name}' with slug: {dataset.slug}[/green]")
|
|
89
|
+
output_result(dataset, output)
|
|
90
|
+
except Exception as e:
|
|
91
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
92
|
+
raise typer.Exit(1)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@app.command("update")
|
|
96
|
+
def update_dataset(
|
|
97
|
+
slug: str = typer.Argument(..., help="Dataset slug"),
|
|
98
|
+
name: str | None = typer.Option(None, "--name", "-n", help="New dataset name"),
|
|
99
|
+
description: str | None = typer.Option(None, "--description", "-d", help="New description"),
|
|
100
|
+
delete_protected: bool | None = typer.Option(
|
|
101
|
+
None, "--delete-protected/--no-delete-protected", help="Enable/disable delete protection"
|
|
102
|
+
),
|
|
103
|
+
from_file: Path | None = typer.Option(
|
|
104
|
+
None, "--from-file", "-f", help="JSON file with dataset config"
|
|
105
|
+
),
|
|
106
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
107
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
108
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Update an existing dataset.
|
|
111
|
+
|
|
112
|
+
Examples:
|
|
113
|
+
hny datasets update my-dataset --description "Updated description"
|
|
114
|
+
hny datasets update my-dataset --delete-protected
|
|
115
|
+
hny datasets update my-dataset --no-delete-protected
|
|
116
|
+
"""
|
|
117
|
+
try:
|
|
118
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
119
|
+
|
|
120
|
+
update_payload: DatasetCreate | DatasetUpdate
|
|
121
|
+
if from_file:
|
|
122
|
+
# Load from JSON file
|
|
123
|
+
data = json.loads(from_file.read_text())
|
|
124
|
+
data.pop("slug", None) # Can't change slug
|
|
125
|
+
data.pop("created_at", None)
|
|
126
|
+
data.pop("updated_at", None)
|
|
127
|
+
update_payload = DatasetCreate.model_validate(data)
|
|
128
|
+
elif name or description is not None or delete_protected is not None:
|
|
129
|
+
# Use DatasetUpdate for partial updates
|
|
130
|
+
update_payload = DatasetUpdate(
|
|
131
|
+
name=name,
|
|
132
|
+
description=description,
|
|
133
|
+
delete_protected=delete_protected,
|
|
134
|
+
)
|
|
135
|
+
else:
|
|
136
|
+
console.print(
|
|
137
|
+
"[red]Error:[/red] Provide --name, --description, "
|
|
138
|
+
"--delete-protected/--no-delete-protected, or --from-file",
|
|
139
|
+
style="bold",
|
|
140
|
+
)
|
|
141
|
+
raise typer.Exit(1)
|
|
142
|
+
|
|
143
|
+
dataset = client.datasets.update(slug=slug, dataset=update_payload)
|
|
144
|
+
|
|
145
|
+
console.print(f"[green]Updated dataset '{dataset.name}'[/green]")
|
|
146
|
+
output_result(dataset, output)
|
|
147
|
+
except Exception as e:
|
|
148
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
149
|
+
raise typer.Exit(1)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@app.command("delete")
|
|
153
|
+
def delete_dataset(
|
|
154
|
+
slug: str = typer.Argument(..., help="Dataset slug"),
|
|
155
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
156
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
157
|
+
yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
|
|
158
|
+
remove_delete_protection: bool = typer.Option(
|
|
159
|
+
False, "--remove-delete-protection", help="Remove delete protection before deleting"
|
|
160
|
+
),
|
|
161
|
+
) -> None:
|
|
162
|
+
"""Delete a dataset.
|
|
163
|
+
|
|
164
|
+
If the dataset has delete protection enabled, use --remove-delete-protection
|
|
165
|
+
to disable it before deleting.
|
|
166
|
+
"""
|
|
167
|
+
try:
|
|
168
|
+
if not yes:
|
|
169
|
+
confirm = typer.confirm(
|
|
170
|
+
f"Delete dataset '{slug}' and ALL its data (triggers, SLOs, queries, events)?"
|
|
171
|
+
)
|
|
172
|
+
if not confirm:
|
|
173
|
+
console.print("[yellow]Cancelled[/yellow]")
|
|
174
|
+
raise typer.Exit(0)
|
|
175
|
+
|
|
176
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
177
|
+
|
|
178
|
+
if remove_delete_protection:
|
|
179
|
+
console.print(f"Removing delete protection from '{slug}'...")
|
|
180
|
+
client.datasets.set_delete_protected(slug=slug, protected=False)
|
|
181
|
+
|
|
182
|
+
client.datasets.delete(slug=slug)
|
|
183
|
+
console.print(f"[green]Deleted dataset '{slug}'[/green]")
|
|
184
|
+
except Exception as e:
|
|
185
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
186
|
+
raise typer.Exit(1)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Derived column (calculated field) 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.derived_columns import DerivedColumnCreate
|
|
14
|
+
|
|
15
|
+
app = typer.Typer(help="Manage derived columns (calculated fields)")
|
|
16
|
+
console = Console()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@app.command("list")
|
|
20
|
+
def list_derived_columns(
|
|
21
|
+
dataset: str = typer.Option(
|
|
22
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__ for environment-wide)"
|
|
23
|
+
),
|
|
24
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
25
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
26
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
27
|
+
quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output column IDs"),
|
|
28
|
+
) -> None:
|
|
29
|
+
"""List all derived columns (environment-wide by default, or in a specific dataset)."""
|
|
30
|
+
try:
|
|
31
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
32
|
+
columns = client.derived_columns.list(dataset=dataset)
|
|
33
|
+
output_result(
|
|
34
|
+
columns,
|
|
35
|
+
output,
|
|
36
|
+
columns=["id", "alias", "expression", "description", "created_at"],
|
|
37
|
+
quiet=quiet,
|
|
38
|
+
)
|
|
39
|
+
except Exception as e:
|
|
40
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
41
|
+
raise typer.Exit(1)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@app.command("get")
|
|
45
|
+
def get_derived_column(
|
|
46
|
+
column_id: str = typer.Argument(..., help="Derived column ID"),
|
|
47
|
+
dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
|
|
48
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
49
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
50
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
51
|
+
) -> None:
|
|
52
|
+
"""Get a specific derived column."""
|
|
53
|
+
try:
|
|
54
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
55
|
+
column = client.derived_columns.get(dataset=dataset, column_id=column_id)
|
|
56
|
+
output_result(column, output)
|
|
57
|
+
except Exception as e:
|
|
58
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
59
|
+
raise typer.Exit(1)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@app.command("create")
|
|
63
|
+
def create_derived_column(
|
|
64
|
+
dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
|
|
65
|
+
from_file: Path = typer.Option(
|
|
66
|
+
..., "--from-file", "-f", help="JSON file with derived column config"
|
|
67
|
+
),
|
|
68
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
69
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
70
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
71
|
+
) -> None:
|
|
72
|
+
"""Create a derived column from a JSON file."""
|
|
73
|
+
try:
|
|
74
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
75
|
+
|
|
76
|
+
# Load and parse JSON file
|
|
77
|
+
data = json.loads(from_file.read_text())
|
|
78
|
+
|
|
79
|
+
# Strip fields that shouldn't be in create request
|
|
80
|
+
data.pop("id", None)
|
|
81
|
+
data.pop("created_at", None)
|
|
82
|
+
data.pop("updated_at", None)
|
|
83
|
+
|
|
84
|
+
column_create = DerivedColumnCreate.model_validate(data)
|
|
85
|
+
column = client.derived_columns.create(dataset=dataset, derived_column=column_create)
|
|
86
|
+
|
|
87
|
+
console.print(
|
|
88
|
+
f"[green]Created derived column '{column.alias}' with ID: {column.id}[/green]"
|
|
89
|
+
)
|
|
90
|
+
output_result(column, output)
|
|
91
|
+
except Exception as e:
|
|
92
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
93
|
+
raise typer.Exit(1)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@app.command("update")
|
|
97
|
+
def update_derived_column(
|
|
98
|
+
column_id: str = typer.Argument(..., help="Derived column ID"),
|
|
99
|
+
dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
|
|
100
|
+
from_file: Path = typer.Option(
|
|
101
|
+
..., "--from-file", "-f", help="JSON file with derived column config"
|
|
102
|
+
),
|
|
103
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
104
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
105
|
+
output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
|
|
106
|
+
) -> None:
|
|
107
|
+
"""Update an existing derived column."""
|
|
108
|
+
try:
|
|
109
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
110
|
+
|
|
111
|
+
# Load and parse JSON file
|
|
112
|
+
data = json.loads(from_file.read_text())
|
|
113
|
+
|
|
114
|
+
# Strip fields that shouldn't be in update request
|
|
115
|
+
data.pop("id", None)
|
|
116
|
+
data.pop("created_at", None)
|
|
117
|
+
data.pop("updated_at", None)
|
|
118
|
+
|
|
119
|
+
column_update = DerivedColumnCreate.model_validate(data)
|
|
120
|
+
column = client.derived_columns.update(
|
|
121
|
+
dataset=dataset, column_id=column_id, derived_column=column_update
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
console.print(f"[green]Updated derived column '{column.alias}'[/green]")
|
|
125
|
+
output_result(column, output)
|
|
126
|
+
except Exception as e:
|
|
127
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
128
|
+
raise typer.Exit(1)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@app.command("delete")
|
|
132
|
+
def delete_derived_column(
|
|
133
|
+
column_id: str = typer.Argument(..., help="Derived column ID"),
|
|
134
|
+
dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
|
|
135
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
136
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
137
|
+
yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
|
|
138
|
+
) -> None:
|
|
139
|
+
"""Delete a derived column."""
|
|
140
|
+
try:
|
|
141
|
+
if not yes:
|
|
142
|
+
confirm = typer.confirm(f"Delete derived column {column_id} from dataset {dataset}?")
|
|
143
|
+
if not confirm:
|
|
144
|
+
console.print("[yellow]Cancelled[/yellow]")
|
|
145
|
+
raise typer.Exit(0)
|
|
146
|
+
|
|
147
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
148
|
+
client.derived_columns.delete(dataset=dataset, column_id=column_id)
|
|
149
|
+
console.print(f"[green]Deleted derived column {column_id}[/green]")
|
|
150
|
+
except Exception as e:
|
|
151
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
152
|
+
raise typer.Exit(1)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
@app.command("export")
|
|
156
|
+
def export_derived_column(
|
|
157
|
+
column_id: str = typer.Argument(..., help="Derived column ID"),
|
|
158
|
+
dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
|
|
159
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
160
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
161
|
+
output_file: Path | None = typer.Option(
|
|
162
|
+
None, "--output-file", "-o", help="Output file (default: stdout)"
|
|
163
|
+
),
|
|
164
|
+
) -> None:
|
|
165
|
+
"""
|
|
166
|
+
Export a derived column as JSON.
|
|
167
|
+
|
|
168
|
+
Output is suitable for importing to another environment via the 'create' command.
|
|
169
|
+
"""
|
|
170
|
+
try:
|
|
171
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
172
|
+
column = client.derived_columns.get(dataset=dataset, column_id=column_id)
|
|
173
|
+
|
|
174
|
+
# Export without IDs/timestamps for portability
|
|
175
|
+
data = column.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
|
|
176
|
+
json_str = json.dumps(data, indent=2, default=str)
|
|
177
|
+
|
|
178
|
+
if output_file:
|
|
179
|
+
output_file.write_text(json_str)
|
|
180
|
+
console.print(f"[green]Exported derived column to {output_file}[/green]")
|
|
181
|
+
else:
|
|
182
|
+
console.print(json_str)
|
|
183
|
+
except Exception as e:
|
|
184
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
185
|
+
raise typer.Exit(1)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@app.command("export-all")
|
|
189
|
+
def export_all_derived_columns(
|
|
190
|
+
dataset: str = typer.Option(
|
|
191
|
+
"__all__", "--dataset", "-d", help="Dataset slug (default: __all__ for environment-wide)"
|
|
192
|
+
),
|
|
193
|
+
output_dir: Path = typer.Option(..., "--output-dir", help="Output directory"),
|
|
194
|
+
profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
|
|
195
|
+
api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
|
|
196
|
+
) -> None:
|
|
197
|
+
"""Export all derived columns to individual JSON files."""
|
|
198
|
+
try:
|
|
199
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
200
|
+
|
|
201
|
+
client = get_client(profile=profile, api_key=api_key)
|
|
202
|
+
columns = client.derived_columns.list(dataset=dataset)
|
|
203
|
+
|
|
204
|
+
for column in columns:
|
|
205
|
+
# Export without IDs/timestamps
|
|
206
|
+
data = column.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
|
|
207
|
+
|
|
208
|
+
# Sanitize filename (replace special chars with dash)
|
|
209
|
+
filename = f"{column.alias}.json".replace("/", "-").replace(" ", "-").lower()
|
|
210
|
+
file_path = output_dir / filename
|
|
211
|
+
|
|
212
|
+
with open(file_path, "w") as f:
|
|
213
|
+
json.dump(data, f, indent=2, default=str)
|
|
214
|
+
|
|
215
|
+
console.print(f"[green]Exported '{column.alias}' to {file_path}[/green]")
|
|
216
|
+
|
|
217
|
+
console.print(
|
|
218
|
+
f"\n[bold green]Exported {len(columns)} derived columns to {output_dir}[/bold green]"
|
|
219
|
+
)
|
|
220
|
+
except Exception as e:
|
|
221
|
+
console.print(f"[red]Error:[/red] {e}", style="bold")
|
|
222
|
+
raise typer.Exit(1)
|