diff --git a/drdroid_debug_toolkit/core/integrations/source_managers/newrelic_source_manager.py b/drdroid_debug_toolkit/core/integrations/source_managers/newrelic_source_manager.py index 14d5e81..ffcdc10 100644 --- a/drdroid_debug_toolkit/core/integrations/source_managers/newrelic_source_manager.py +++ b/drdroid_debug_toolkit/core/integrations/source_managers/newrelic_source_manager.py @@ -270,6 +270,38 @@ def __init__(self): is_optional=True), ] }, + NewRelic.TaskType.EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES: { + 'executor': self.execute_dashboard_widgets_with_variables, + 'model_types': [SourceModelType.NEW_RELIC_ENTITY_DASHBOARD_V2], + 'result_type': PlaybookTaskResultType.TIMESERIES, + 'display_name': 'Execute New Relic dashboard widgets with variables', + 'category': 'Metrics', + 'form_fields': [ + FormField(key_name=StringValue(value="dashboard_name"), + display_name=StringValue(value="Dashboard Name"), + description=StringValue(value="Enter Dashboard Name"), + data_type=LiteralType.STRING, + form_field_type=FormFieldType.TEXT_FT), + FormField(key_name=StringValue(value="page_name"), + display_name=StringValue(value="Page Name (Optional)"), + description=StringValue(value="Enter Page Name to filter widgets"), + data_type=LiteralType.STRING, + form_field_type=FormFieldType.TEXT_FT, + is_optional=True), + FormField(key_name=StringValue(value="widget_names"), + display_name=StringValue(value="Widget Names (Optional)"), + description=StringValue(value="Enter widget names to filter (comma-separated)"), + data_type=LiteralType.STRING, + form_field_type=FormFieldType.TEXT_FT, + is_optional=True), + FormField(key_name=StringValue(value="template_variables"), + display_name=StringValue(value="Template Variables (Optional)"), + description=StringValue(value='JSON object with variable values, e.g., {"appName": "my-app", "env": "prod"}'), + data_type=LiteralType.STRING, + form_field_type=FormFieldType.MULTILINE_FT, + is_optional=True), + ] + }, } self.connector_form_configs = [ @@ -2806,3 +2838,294 @@ def execute_get_dashboard_variable_values(self, time_range: TimeRange, nr_task: source=self.source ) + def _substitute_nrql_variables(self, nrql_expression: str, variables: dict) -> str: + """ + Substitute New Relic template variables in NRQL queries. + New Relic uses {{variableName}} syntax for template variables. + + Args: + nrql_expression: The NRQL query string that may contain {{variableName}} placeholders + variables: Dictionary mapping variable names to their values + + Returns: + NRQL query string with variables substituted + """ + if not nrql_expression or not variables: + return nrql_expression + + result = nrql_expression + # New Relic uses {{variableName}} syntax + import re + # Pattern to match {{variableName}} or {{variableName:format}} + pattern = r'\{\{([^}:]+)(?::[^}]+)?\}\}' + + def replace_var(match): + var_name = match.group(1).strip() + if var_name in variables: + var_value = variables[var_name] + # Handle list values (for multi-selection variables) + if isinstance(var_value, list): + # For IN clauses, join with commas and wrap each in quotes if needed + if len(var_value) == 1: + return str(var_value[0]) + else: + # Format as: 'value1','value2','value3' + return "','".join([str(v) for v in var_value]) + else: + return str(var_value) + else: + # Variable not found, keep the original placeholder + logger.warning(f"Variable '{var_name}' not found in provided variables, keeping placeholder") + return match.group(0) + + result = re.sub(pattern, replace_var, result) + return result + + def execute_dashboard_widgets_with_variables(self, time_range: TimeRange, nr_task: NewRelic, + nr_connector: ConnectorProto): + """ + Execute dashboard widgets with template variable substitution. + Similar to Grafana's EXECUTE_ALL_DASHBOARD_PANELS task. + + Args: + time_range: The time range for the queries + nr_task: The New Relic task containing dashboard and variable information + nr_connector: The New Relic connector to use + + Returns: + A PlaybookTaskResult containing timeseries data from all widgets + """ + try: + if not nr_connector: + raise Exception("Task execution Failed:: No New Relic source found") + + task = nr_task.execute_dashboard_widgets_with_variables + dashboard_name = task.dashboard_name.value + page_name = task.page_name.value if task.HasField('page_name') and task.page_name.value else None + widget_names_str = task.widget_names.value if task.HasField('widget_names') and task.widget_names.value else '' + widget_names = [name.strip() for name in widget_names_str.split(',') if name.strip()] if widget_names_str else None + + nr_gql_processor = self.get_connector_processor(nr_connector) + + # 1. Find the dashboard and get its GUID + client = PrototypeClient() + assets = client.get_connector_assets( + connector_type=Source.Name(nr_connector.type), + connector_id=str(nr_connector.id.value), + asset_type=SourceModelType.NEW_RELIC_ENTITY_DASHBOARD_V2, + ) + + if not assets or not assets.new_relic or not assets.new_relic.assets: + raise Exception(f"No dashboard assets found for the account {nr_connector.account_id.value}") + + newrelic_assets = assets.new_relic.assets + all_dashboard_entities_v2 = [ + asset.new_relic_entity_dashboard_v2 + for asset in newrelic_assets + if asset.HasField('new_relic_entity_dashboard_v2') + ] + + dashboard_guid = None + for entity in all_dashboard_entities_v2: + current_dashboard_name = entity.dashboard_name.value + if page_name: + target_name = f"{dashboard_name} / {page_name}" + if current_dashboard_name.lower() == target_name.lower(): + dashboard_guid = entity.dashboard_guid.value + break + else: + if current_dashboard_name.lower().startswith(dashboard_name.lower() + " / ") or \ + current_dashboard_name.lower() == dashboard_name.lower(): + dashboard_guid = entity.dashboard_guid.value + break + + if not dashboard_guid: + raise Exception(f"Dashboard with name '{dashboard_name}' not found") + + # 2. Fetch dashboard variables to get default values + variables_data = nr_gql_processor.get_dashboard_variable_values(dashboard_guid) + default_variables = {} + if variables_data and variables_data.get('variables'): + for var_name, var_info in variables_data['variables'].items(): + # Use default value if available + if 'default_value' in var_info: + default_variables[var_name] = var_info['default_value'] + # Or use first item if it's a list variable + elif 'items' in var_info and var_info['items']: + default_variables[var_name] = var_info['items'][0].get('value', '') + + # 3. Parse user-provided template variables + user_variables = {} + if task.HasField("template_variables") and task.template_variables.value: + try: + import json + import ast + template_vars_str = task.template_variables.value + + # Try to parse as JSON first + if isinstance(template_vars_str, dict): + user_variables = template_vars_str + elif isinstance(template_vars_str, str): + if template_vars_str.startswith('{') and template_vars_str.endswith('}'): + try: + user_variables = json.loads(template_vars_str) + except json.JSONDecodeError: + # Fallback to ast.literal_eval for Python dict format + user_variables = ast.literal_eval(template_vars_str) + else: + user_variables = json.loads(template_vars_str) + + # Process comma-separated values + processed_vars = {} + for key, value in user_variables.items(): + if isinstance(value, str) and ',' in value: + processed_vars[key] = [v.strip() for v in value.split(',') if v.strip()] + else: + processed_vars[key] = value + user_variables = processed_vars + except (json.JSONDecodeError, ValueError, SyntaxError) as e: + logger.warning(f"Failed to parse template_variables: {e}") + user_variables = {} + + # 4. Merge default and user variables (user variables take precedence) + template_vars_dict = default_variables.copy() + template_vars_dict.update(user_variables) + + print( + f"Playbook Task Downstream Request: Type -> New Relic EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES, " + f"Dashboard -> {dashboard_name}, Variables -> {template_vars_dict}", + flush=True, + ) + + # 5. Find matching widgets (reuse existing logic) + try: + matching_widgets = self._find_matching_dashboard_widgets_v2( + nr_connector, dashboard_name, page_name, widget_names + ) + + # Deduplicate widgets + unique_widgets_by_content = {} + for widget in matching_widgets: + sorted_expressions = sorted(widget.get('nrql_expressions', [])) + content_key = (widget.get('title', ''), tuple(sorted_expressions)) + if content_key not in unique_widgets_by_content: + unique_widgets_by_content[content_key] = widget + + matching_widgets = list(unique_widgets_by_content.values()) + + except Exception as e: + logger.error(f"Error finding dashboard/widgets: {e}") + return PlaybookTaskResult( + type=PlaybookTaskResultType.TEXT, + text=TextResult(output=StringValue(value=f'Error finding dashboard/widgets: {e}')), + source=self.source + ) + + if not matching_widgets: + return PlaybookTaskResult( + type=PlaybookTaskResultType.TEXT, + text=TextResult(output=StringValue(value=f'No widgets found in dashboard "{dashboard_name}"')), + source=self.source + ) + + # 6. Process each widget with variable substitution + all_widget_timeseries = [] + for widget in matching_widgets: + widget_title = widget.get('title', 'Untitled Widget') + nrql_expressions = widget.get('nrql_expressions', []) + + try: + if not nrql_expressions: + logger.warning(f"Skipping widget '{widget_title}' as it has no NRQL queries.") + continue + + # Deduplicate NRQL expressions + unique_nrql_expressions = [] + seen_nrql = set() + for nrql in nrql_expressions: + if nrql and nrql not in seen_nrql: + unique_nrql_expressions.append(nrql) + seen_nrql.add(nrql) + + if not unique_nrql_expressions: + logger.warning(f"Skipping widget '{widget_title}' as it has no unique, non-empty NRQL queries.") + continue + + # Process each NRQL query + for idx, nrql in enumerate(unique_nrql_expressions): + try: + # Substitute variables in NRQL query + substituted_nrql = self._substitute_nrql_variables(nrql, template_vars_dict) + + # Prepare NRQL with time range + prepared_nrql = self._prepare_widget_nrql(substituted_nrql, time_range) + + print( + f"Playbook Task Downstream Request: Type -> NewRelicDashboardWithVariables, " + f"Account -> {nr_connector.account_id.value}, Dashboard -> {dashboard_name}, " + f"Widget -> {widget_title}, Query Index -> {idx}, " + f"Original NRQL -> {nrql[:100]}..., " + f"Substituted NRQL -> {prepared_nrql[:100]}...", + flush=True + ) + + # Execute NRQL + response = nr_gql_processor.execute_nrql_query(prepared_nrql) + + # Parse response + labeled_metric_timeseries_list = self._parse_nrql_response(response, widget_title) + + # Add query index label + for series in labeled_metric_timeseries_list: + updated_labels = list(series.metric_label_values) + existing_qi = next((lbl for lbl in updated_labels if lbl.name.value == 'query_index'), None) + if existing_qi: + existing_qi.value.value = str(idx) + else: + updated_labels.append( + LabelValuePair(name=StringValue(value='query_index'), value=StringValue(value=str(idx))) + ) + + new_series = TimeseriesResult.LabeledMetricTimeseries( + metric_label_values=updated_labels, + unit=series.unit, + datapoints=series.datapoints + ) + all_widget_timeseries.append(new_series) + + except Exception as e: + logger.error(f"Error executing NRQL query {idx} for widget '{widget_title}': {e}") + continue + + except Exception as e: + logger.error(f"Error processing widget '{widget_title}': {e}") + continue + + if not all_widget_timeseries: + return PlaybookTaskResult( + type=PlaybookTaskResultType.TEXT, + text=TextResult(output=StringValue(value='No timeseries data returned from widgets')), + source=self.source + ) + + # 7. Combine all timeseries into a single result + timeseries_result = TimeseriesResult( + metric_expression=StringValue(value=f"Dashboard: {dashboard_name}"), + metric_name=StringValue(value="dashboard_widgets"), + labeled_metric_timeseries=all_widget_timeseries + ) + + return PlaybookTaskResult( + type=PlaybookTaskResultType.TIMESERIES, + timeseries=timeseries_result, + source=self.source + ) + + except Exception as e: + logger.error(f"Error while executing dashboard widgets with variables task: {e}") + return PlaybookTaskResult( + type=PlaybookTaskResultType.TEXT, + text=TextResult(output=StringValue(value=f"Error executing dashboard widgets with variables task: {str(e)}")), + source=self.source + ) + diff --git a/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task.proto b/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task.proto index 4fff03d..190f0ce 100644 --- a/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task.proto +++ b/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task.proto @@ -78,6 +78,13 @@ message NewRelic { google.protobuf.StringValue variable_name = 2; } + message ExecuteDashboardWidgetsWithVariablesTask { + google.protobuf.StringValue dashboard_name = 1; + google.protobuf.StringValue page_name = 2; + google.protobuf.StringValue widget_names = 3; + google.protobuf.StringValue template_variables = 4; + } + enum TaskType { UNKNOWN = 0; ENTITY_APPLICATION_GOLDEN_METRIC_EXECUTION = 1; @@ -89,6 +96,7 @@ message NewRelic { ENTITY_APPLICATION_APM_DATABASE_SUMMARY = 7; ENTITY_APPLICATION_APM_TRANSACTION_SUMMARY = 8; GET_DASHBOARD_VARIABLE_VALUES = 9; + EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES = 10; } TaskType type = 1; @@ -102,6 +110,7 @@ message NewRelic { EntityApplicationAPMDatabaseSummaryTask entity_application_apm_database_summary = 8; EntityApplicationAPMTransactionSummaryTask entity_application_apm_transaction_summary = 9; GetDashboardVariableValuesTask get_dashboard_variable_values = 10; + ExecuteDashboardWidgetsWithVariablesTask execute_dashboard_widgets_with_variables = 11; } } diff --git a/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.py b/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.py index 784269b..326845b 100644 --- a/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.py +++ b/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.py @@ -25,7 +25,7 @@ from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\nBcore/protos/playbooks/source_task_definitions/new_relic_task.proto\x12\x15\x63ore.protos.playbooks\x1a\x1egoogle/protobuf/wrappers.proto\"\xb4 \n\x08NewRelic\x12\x36\n\x04type\x18\x01 \x01(\x0e\x32(.core.protos.playbooks.NewRelic.TaskType\x12\x80\x01\n*entity_application_golden_metric_execution\x18\x02 \x01(\x0b\x32J.core.protos.playbooks.NewRelic.EntityApplicationGoldenMetricExecutionTaskH\x00\x12\x85\x01\n-entity_dashboard_widget_nrql_metric_execution\x18\x03 \x01(\x0b\x32L.core.protos.playbooks.NewRelic.EntityDashboardWidgetNRQLMetricExecutionTaskH\x00\x12X\n\x15nrql_metric_execution\x18\x04 \x01(\x0b\x32\x37.core.protos.playbooks.NewRelic.NRQLMetricExecutionTaskH\x00\x12]\n\x1a\x64\x61shboard_multiple_widgets\x18\x05 \x01(\x0b\x32\x37.core.protos.playbooks.NewRelic.DashboardWidgetByIdTaskH\x00\x12z\n\'entity_application_apm_metric_execution\x18\x06 \x01(\x0b\x32G.core.protos.playbooks.NewRelic.EntityApplicationAPMMetricExecutionTaskH\x00\x12\\\n\x17\x66\x65tch_dashboard_widgets\x18\x07 \x01(\x0b\x32\x39.core.protos.playbooks.NewRelic.FetchDashboardWidgetsTaskH\x00\x12z\n\'entity_application_apm_database_summary\x18\x08 \x01(\x0b\x32G.core.protos.playbooks.NewRelic.EntityApplicationAPMDatabaseSummaryTaskH\x00\x12\x80\x01\n*entity_application_apm_transaction_summary\x18\t \x01(\x0b\x32J.core.protos.playbooks.NewRelic.EntityApplicationAPMTransactionSummaryTaskH\x00\x12g\n\x1dget_dashboard_variable_values\x18\n \x01(\x0b\x32>.core.protos.playbooks.NewRelic.GetDashboardVariableValuesTaskH\x00\x1a\xff\x02\n*EntityApplicationGoldenMetricExecutionTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12golden_metric_name\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12golden_metric_unit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x43\n\x1dgolden_metric_nrql_expression\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x06 \x03(\r\x1a\xab\x03\n\'EntityApplicationAPMMetricExecutionTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0f\x61pm_metric_name\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0f\x61pm_metric_unit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12@\n\x1a\x61pm_metric_nrql_expression\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x06 \x03(\r\x12\x36\n\x10\x61pm_metric_names\x18\x07 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x1a\xf2\x01\n\'EntityApplicationAPMDatabaseSummaryTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07sort_by\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\xf5\x01\n*EntityApplicationAPMTransactionSummaryTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07sort_by\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\x9a\x04\n,EntityDashboardWidgetNRQLMetricExecutionTask\x12\x34\n\x0e\x64\x61shboard_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0e\x64\x61shboard_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_guid\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_name\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\twidget_id\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cwidget_title\x18\x06 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0bwidget_type\x18\x07 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12<\n\x16widget_nrql_expression\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\t \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\n \x03(\r\x1a\xc8\x01\n\x17\x44\x61shboardWidgetByIdTask\x12\x34\n\x0e\x64\x61shboard_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\twidget_id\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\xcb\x01\n\x17NRQLMetricExecutionTask\x12\x31\n\x0bmetric_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0fnrql_expression\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\xfe\x01\n\x19\x46\x65tchDashboardWidgetsTask\x12\x34\n\x0e\x64\x61shboard_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cwidget_names\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x05 \x03(\r\x1a\x8b\x01\n\x1eGetDashboardVariableValuesTask\x12\x34\n\x0e\x64\x61shboard_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rvariable_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\"\xff\x02\n\x08TaskType\x12\x0b\n\x07UNKNOWN\x10\x00\x12.\n*ENTITY_APPLICATION_GOLDEN_METRIC_EXECUTION\x10\x01\x12\x31\n-ENTITY_DASHBOARD_WIDGET_NRQL_METRIC_EXECUTION\x10\x02\x12\x19\n\x15NRQL_METRIC_EXECUTION\x10\x03\x12\x1e\n\x1a\x44\x41SHBOARD_MULTIPLE_WIDGETS\x10\x04\x12+\n\'ENTITY_APPLICATION_APM_METRIC_EXECUTION\x10\x05\x12\x1b\n\x17\x46\x45TCH_DASHBOARD_WIDGETS\x10\x06\x12+\n\'ENTITY_APPLICATION_APM_DATABASE_SUMMARY\x10\x07\x12.\n*ENTITY_APPLICATION_APM_TRANSACTION_SUMMARY\x10\x08\x12!\n\x1dGET_DASHBOARD_VARIABLE_VALUES\x10\tB\x06\n\x04taskb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\nBcore/protos/playbooks/source_task_definitions/new_relic_task.proto\x12\x15\x63ore.protos.playbooks\x1a\x1egoogle/protobuf/wrappers.proto\"\xe2#\n\x08NewRelic\x12\x36\n\x04type\x18\x01 \x01(\x0e\x32(.core.protos.playbooks.NewRelic.TaskType\x12\x80\x01\n*entity_application_golden_metric_execution\x18\x02 \x01(\x0b\x32J.core.protos.playbooks.NewRelic.EntityApplicationGoldenMetricExecutionTaskH\x00\x12\x85\x01\n-entity_dashboard_widget_nrql_metric_execution\x18\x03 \x01(\x0b\x32L.core.protos.playbooks.NewRelic.EntityDashboardWidgetNRQLMetricExecutionTaskH\x00\x12X\n\x15nrql_metric_execution\x18\x04 \x01(\x0b\x32\x37.core.protos.playbooks.NewRelic.NRQLMetricExecutionTaskH\x00\x12]\n\x1a\x64\x61shboard_multiple_widgets\x18\x05 \x01(\x0b\x32\x37.core.protos.playbooks.NewRelic.DashboardWidgetByIdTaskH\x00\x12z\n\'entity_application_apm_metric_execution\x18\x06 \x01(\x0b\x32G.core.protos.playbooks.NewRelic.EntityApplicationAPMMetricExecutionTaskH\x00\x12\\\n\x17\x66\x65tch_dashboard_widgets\x18\x07 \x01(\x0b\x32\x39.core.protos.playbooks.NewRelic.FetchDashboardWidgetsTaskH\x00\x12z\n\'entity_application_apm_database_summary\x18\x08 \x01(\x0b\x32G.core.protos.playbooks.NewRelic.EntityApplicationAPMDatabaseSummaryTaskH\x00\x12\x80\x01\n*entity_application_apm_transaction_summary\x18\t \x01(\x0b\x32J.core.protos.playbooks.NewRelic.EntityApplicationAPMTransactionSummaryTaskH\x00\x12g\n\x1dget_dashboard_variable_values\x18\n \x01(\x0b\x32>.core.protos.playbooks.NewRelic.GetDashboardVariableValuesTaskH\x00\x12|\n(execute_dashboard_widgets_with_variables\x18\x0b \x01(\x0b\x32H.core.protos.playbooks.NewRelic.ExecuteDashboardWidgetsWithVariablesTaskH\x00\x1a\xff\x02\n*EntityApplicationGoldenMetricExecutionTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12golden_metric_name\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12golden_metric_unit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x43\n\x1dgolden_metric_nrql_expression\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x06 \x03(\r\x1a\xab\x03\n\'EntityApplicationAPMMetricExecutionTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0f\x61pm_metric_name\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0f\x61pm_metric_unit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12@\n\x1a\x61pm_metric_nrql_expression\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x06 \x03(\r\x12\x36\n\x10\x61pm_metric_names\x18\x07 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x1a\xf2\x01\n\'EntityApplicationAPMDatabaseSummaryTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07sort_by\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\xf5\x01\n*EntityApplicationAPMTransactionSummaryTask\x12=\n\x17\x61pplication_entity_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17\x61pplication_entity_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07sort_by\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\x9a\x04\n,EntityDashboardWidgetNRQLMetricExecutionTask\x12\x34\n\x0e\x64\x61shboard_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0e\x64\x61shboard_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_guid\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_name\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\twidget_id\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cwidget_title\x18\x06 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0bwidget_type\x18\x07 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12<\n\x16widget_nrql_expression\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\t \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\n \x03(\r\x1a\xc8\x01\n\x17\x44\x61shboardWidgetByIdTask\x12\x34\n\x0e\x64\x61shboard_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\twidget_id\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\xcb\x01\n\x17NRQLMetricExecutionTask\x12\x31\n\x0bmetric_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0fnrql_expression\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x04 \x03(\r\x1a\xfe\x01\n\x19\x46\x65tchDashboardWidgetsTask\x12\x34\n\x0e\x64\x61shboard_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cwidget_names\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04unit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x1a\n\x12timeseries_offsets\x18\x05 \x03(\r\x1a\x8b\x01\n\x1eGetDashboardVariableValuesTask\x12\x34\n\x0e\x64\x61shboard_guid\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rvariable_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x1a\xff\x01\n(ExecuteDashboardWidgetsWithVariablesTask\x12\x34\n\x0e\x64\x61shboard_name\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tpage_name\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cwidget_names\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12template_variables\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.StringValue\"\xad\x03\n\x08TaskType\x12\x0b\n\x07UNKNOWN\x10\x00\x12.\n*ENTITY_APPLICATION_GOLDEN_METRIC_EXECUTION\x10\x01\x12\x31\n-ENTITY_DASHBOARD_WIDGET_NRQL_METRIC_EXECUTION\x10\x02\x12\x19\n\x15NRQL_METRIC_EXECUTION\x10\x03\x12\x1e\n\x1a\x44\x41SHBOARD_MULTIPLE_WIDGETS\x10\x04\x12+\n\'ENTITY_APPLICATION_APM_METRIC_EXECUTION\x10\x05\x12\x1b\n\x17\x46\x45TCH_DASHBOARD_WIDGETS\x10\x06\x12+\n\'ENTITY_APPLICATION_APM_DATABASE_SUMMARY\x10\x07\x12.\n*ENTITY_APPLICATION_APM_TRANSACTION_SUMMARY\x10\x08\x12!\n\x1dGET_DASHBOARD_VARIABLE_VALUES\x10\t\x12,\n(EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES\x10\nB\x06\n\x04taskb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -33,25 +33,27 @@ if not _descriptor._USE_C_DESCRIPTORS: DESCRIPTOR._loaded_options = None _globals['_NEWRELIC']._serialized_start=126 - _globals['_NEWRELIC']._serialized_end=4274 - _globals['_NEWRELIC_ENTITYAPPLICATIONGOLDENMETRICEXECUTIONTASK']._serialized_start=1225 - _globals['_NEWRELIC_ENTITYAPPLICATIONGOLDENMETRICEXECUTIONTASK']._serialized_end=1608 - _globals['_NEWRELIC_ENTITYAPPLICATIONAPMMETRICEXECUTIONTASK']._serialized_start=1611 - _globals['_NEWRELIC_ENTITYAPPLICATIONAPMMETRICEXECUTIONTASK']._serialized_end=2038 - _globals['_NEWRELIC_ENTITYAPPLICATIONAPMDATABASESUMMARYTASK']._serialized_start=2041 - _globals['_NEWRELIC_ENTITYAPPLICATIONAPMDATABASESUMMARYTASK']._serialized_end=2283 - _globals['_NEWRELIC_ENTITYAPPLICATIONAPMTRANSACTIONSUMMARYTASK']._serialized_start=2286 - _globals['_NEWRELIC_ENTITYAPPLICATIONAPMTRANSACTIONSUMMARYTASK']._serialized_end=2531 - _globals['_NEWRELIC_ENTITYDASHBOARDWIDGETNRQLMETRICEXECUTIONTASK']._serialized_start=2534 - _globals['_NEWRELIC_ENTITYDASHBOARDWIDGETNRQLMETRICEXECUTIONTASK']._serialized_end=3072 - _globals['_NEWRELIC_DASHBOARDWIDGETBYIDTASK']._serialized_start=3075 - _globals['_NEWRELIC_DASHBOARDWIDGETBYIDTASK']._serialized_end=3275 - _globals['_NEWRELIC_NRQLMETRICEXECUTIONTASK']._serialized_start=3278 - _globals['_NEWRELIC_NRQLMETRICEXECUTIONTASK']._serialized_end=3481 - _globals['_NEWRELIC_FETCHDASHBOARDWIDGETSTASK']._serialized_start=3484 - _globals['_NEWRELIC_FETCHDASHBOARDWIDGETSTASK']._serialized_end=3738 - _globals['_NEWRELIC_GETDASHBOARDVARIABLEVALUESTASK']._serialized_start=3741 - _globals['_NEWRELIC_GETDASHBOARDVARIABLEVALUESTASK']._serialized_end=3880 - _globals['_NEWRELIC_TASKTYPE']._serialized_start=3883 - _globals['_NEWRELIC_TASKTYPE']._serialized_end=4266 + _globals['_NEWRELIC']._serialized_end=4704 + _globals['_NEWRELIC_ENTITYAPPLICATIONGOLDENMETRICEXECUTIONTASK']._serialized_start=1351 + _globals['_NEWRELIC_ENTITYAPPLICATIONGOLDENMETRICEXECUTIONTASK']._serialized_end=1734 + _globals['_NEWRELIC_ENTITYAPPLICATIONAPMMETRICEXECUTIONTASK']._serialized_start=1737 + _globals['_NEWRELIC_ENTITYAPPLICATIONAPMMETRICEXECUTIONTASK']._serialized_end=2164 + _globals['_NEWRELIC_ENTITYAPPLICATIONAPMDATABASESUMMARYTASK']._serialized_start=2167 + _globals['_NEWRELIC_ENTITYAPPLICATIONAPMDATABASESUMMARYTASK']._serialized_end=2409 + _globals['_NEWRELIC_ENTITYAPPLICATIONAPMTRANSACTIONSUMMARYTASK']._serialized_start=2412 + _globals['_NEWRELIC_ENTITYAPPLICATIONAPMTRANSACTIONSUMMARYTASK']._serialized_end=2657 + _globals['_NEWRELIC_ENTITYDASHBOARDWIDGETNRQLMETRICEXECUTIONTASK']._serialized_start=2660 + _globals['_NEWRELIC_ENTITYDASHBOARDWIDGETNRQLMETRICEXECUTIONTASK']._serialized_end=3198 + _globals['_NEWRELIC_DASHBOARDWIDGETBYIDTASK']._serialized_start=3201 + _globals['_NEWRELIC_DASHBOARDWIDGETBYIDTASK']._serialized_end=3401 + _globals['_NEWRELIC_NRQLMETRICEXECUTIONTASK']._serialized_start=3404 + _globals['_NEWRELIC_NRQLMETRICEXECUTIONTASK']._serialized_end=3607 + _globals['_NEWRELIC_FETCHDASHBOARDWIDGETSTASK']._serialized_start=3610 + _globals['_NEWRELIC_FETCHDASHBOARDWIDGETSTASK']._serialized_end=3864 + _globals['_NEWRELIC_GETDASHBOARDVARIABLEVALUESTASK']._serialized_start=3867 + _globals['_NEWRELIC_GETDASHBOARDVARIABLEVALUESTASK']._serialized_end=4006 + _globals['_NEWRELIC_EXECUTEDASHBOARDWIDGETSWITHVARIABLESTASK']._serialized_start=4009 + _globals['_NEWRELIC_EXECUTEDASHBOARDWIDGETSWITHVARIABLESTASK']._serialized_end=4264 + _globals['_NEWRELIC_TASKTYPE']._serialized_start=4267 + _globals['_NEWRELIC_TASKTYPE']._serialized_end=4696 # @@protoc_insertion_point(module_scope) diff --git a/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.pyi b/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.pyi index d74376e..955a325 100644 --- a/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.pyi +++ b/drdroid_debug_toolkit/core/protos/playbooks/source_task_definitions/new_relic_task_pb2.pyi @@ -39,6 +39,7 @@ class NewRelic(google.protobuf.message.Message): ENTITY_APPLICATION_APM_DATABASE_SUMMARY: NewRelic._TaskType.ValueType # 7 ENTITY_APPLICATION_APM_TRANSACTION_SUMMARY: NewRelic._TaskType.ValueType # 8 GET_DASHBOARD_VARIABLE_VALUES: NewRelic._TaskType.ValueType # 9 + EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES: NewRelic._TaskType.ValueType # 10 class TaskType(_TaskType, metaclass=_TaskTypeEnumTypeWrapper): ... UNKNOWN: NewRelic.TaskType.ValueType # 0 @@ -51,6 +52,7 @@ class NewRelic(google.protobuf.message.Message): ENTITY_APPLICATION_APM_DATABASE_SUMMARY: NewRelic.TaskType.ValueType # 7 ENTITY_APPLICATION_APM_TRANSACTION_SUMMARY: NewRelic.TaskType.ValueType # 8 GET_DASHBOARD_VARIABLE_VALUES: NewRelic.TaskType.ValueType # 9 + EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES: NewRelic.TaskType.ValueType # 10 @typing_extensions.final class EntityApplicationGoldenMetricExecutionTask(google.protobuf.message.Message): @@ -335,6 +337,33 @@ class NewRelic(google.protobuf.message.Message): def HasField(self, field_name: typing_extensions.Literal["dashboard_guid", b"dashboard_guid", "variable_name", b"variable_name"]) -> builtins.bool: ... def ClearField(self, field_name: typing_extensions.Literal["dashboard_guid", b"dashboard_guid", "variable_name", b"variable_name"]) -> None: ... + @typing_extensions.final + class ExecuteDashboardWidgetsWithVariablesTask(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + DASHBOARD_NAME_FIELD_NUMBER: builtins.int + PAGE_NAME_FIELD_NUMBER: builtins.int + WIDGET_NAMES_FIELD_NUMBER: builtins.int + TEMPLATE_VARIABLES_FIELD_NUMBER: builtins.int + @property + def dashboard_name(self) -> google.protobuf.wrappers_pb2.StringValue: ... + @property + def page_name(self) -> google.protobuf.wrappers_pb2.StringValue: ... + @property + def widget_names(self) -> google.protobuf.wrappers_pb2.StringValue: ... + @property + def template_variables(self) -> google.protobuf.wrappers_pb2.StringValue: ... + def __init__( + self, + *, + dashboard_name: google.protobuf.wrappers_pb2.StringValue | None = ..., + page_name: google.protobuf.wrappers_pb2.StringValue | None = ..., + widget_names: google.protobuf.wrappers_pb2.StringValue | None = ..., + template_variables: google.protobuf.wrappers_pb2.StringValue | None = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["dashboard_name", b"dashboard_name", "page_name", b"page_name", "template_variables", b"template_variables", "widget_names", b"widget_names"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["dashboard_name", b"dashboard_name", "page_name", b"page_name", "template_variables", b"template_variables", "widget_names", b"widget_names"]) -> None: ... + TYPE_FIELD_NUMBER: builtins.int ENTITY_APPLICATION_GOLDEN_METRIC_EXECUTION_FIELD_NUMBER: builtins.int ENTITY_DASHBOARD_WIDGET_NRQL_METRIC_EXECUTION_FIELD_NUMBER: builtins.int @@ -345,6 +374,7 @@ class NewRelic(google.protobuf.message.Message): ENTITY_APPLICATION_APM_DATABASE_SUMMARY_FIELD_NUMBER: builtins.int ENTITY_APPLICATION_APM_TRANSACTION_SUMMARY_FIELD_NUMBER: builtins.int GET_DASHBOARD_VARIABLE_VALUES_FIELD_NUMBER: builtins.int + EXECUTE_DASHBOARD_WIDGETS_WITH_VARIABLES_FIELD_NUMBER: builtins.int type: global___NewRelic.TaskType.ValueType @property def entity_application_golden_metric_execution(self) -> global___NewRelic.EntityApplicationGoldenMetricExecutionTask: ... @@ -364,6 +394,8 @@ class NewRelic(google.protobuf.message.Message): def entity_application_apm_transaction_summary(self) -> global___NewRelic.EntityApplicationAPMTransactionSummaryTask: ... @property def get_dashboard_variable_values(self) -> global___NewRelic.GetDashboardVariableValuesTask: ... + @property + def execute_dashboard_widgets_with_variables(self) -> global___NewRelic.ExecuteDashboardWidgetsWithVariablesTask: ... def __init__( self, *, @@ -377,9 +409,10 @@ class NewRelic(google.protobuf.message.Message): entity_application_apm_database_summary: global___NewRelic.EntityApplicationAPMDatabaseSummaryTask | None = ..., entity_application_apm_transaction_summary: global___NewRelic.EntityApplicationAPMTransactionSummaryTask | None = ..., get_dashboard_variable_values: global___NewRelic.GetDashboardVariableValuesTask | None = ..., + execute_dashboard_widgets_with_variables: global___NewRelic.ExecuteDashboardWidgetsWithVariablesTask | None = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["dashboard_multiple_widgets", b"dashboard_multiple_widgets", "entity_application_apm_database_summary", b"entity_application_apm_database_summary", "entity_application_apm_metric_execution", b"entity_application_apm_metric_execution", "entity_application_apm_transaction_summary", b"entity_application_apm_transaction_summary", "entity_application_golden_metric_execution", b"entity_application_golden_metric_execution", "entity_dashboard_widget_nrql_metric_execution", b"entity_dashboard_widget_nrql_metric_execution", "fetch_dashboard_widgets", b"fetch_dashboard_widgets", "get_dashboard_variable_values", b"get_dashboard_variable_values", "nrql_metric_execution", b"nrql_metric_execution", "task", b"task"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["dashboard_multiple_widgets", b"dashboard_multiple_widgets", "entity_application_apm_database_summary", b"entity_application_apm_database_summary", "entity_application_apm_metric_execution", b"entity_application_apm_metric_execution", "entity_application_apm_transaction_summary", b"entity_application_apm_transaction_summary", "entity_application_golden_metric_execution", b"entity_application_golden_metric_execution", "entity_dashboard_widget_nrql_metric_execution", b"entity_dashboard_widget_nrql_metric_execution", "fetch_dashboard_widgets", b"fetch_dashboard_widgets", "get_dashboard_variable_values", b"get_dashboard_variable_values", "nrql_metric_execution", b"nrql_metric_execution", "task", b"task", "type", b"type"]) -> None: ... - def WhichOneof(self, oneof_group: typing_extensions.Literal["task", b"task"]) -> typing_extensions.Literal["entity_application_golden_metric_execution", "entity_dashboard_widget_nrql_metric_execution", "nrql_metric_execution", "dashboard_multiple_widgets", "entity_application_apm_metric_execution", "fetch_dashboard_widgets", "entity_application_apm_database_summary", "entity_application_apm_transaction_summary", "get_dashboard_variable_values"] | None: ... + def HasField(self, field_name: typing_extensions.Literal["dashboard_multiple_widgets", b"dashboard_multiple_widgets", "entity_application_apm_database_summary", b"entity_application_apm_database_summary", "entity_application_apm_metric_execution", b"entity_application_apm_metric_execution", "entity_application_apm_transaction_summary", b"entity_application_apm_transaction_summary", "entity_application_golden_metric_execution", b"entity_application_golden_metric_execution", "entity_dashboard_widget_nrql_metric_execution", b"entity_dashboard_widget_nrql_metric_execution", "execute_dashboard_widgets_with_variables", b"execute_dashboard_widgets_with_variables", "fetch_dashboard_widgets", b"fetch_dashboard_widgets", "get_dashboard_variable_values", b"get_dashboard_variable_values", "nrql_metric_execution", b"nrql_metric_execution", "task", b"task"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["dashboard_multiple_widgets", b"dashboard_multiple_widgets", "entity_application_apm_database_summary", b"entity_application_apm_database_summary", "entity_application_apm_metric_execution", b"entity_application_apm_metric_execution", "entity_application_apm_transaction_summary", b"entity_application_apm_transaction_summary", "entity_application_golden_metric_execution", b"entity_application_golden_metric_execution", "entity_dashboard_widget_nrql_metric_execution", b"entity_dashboard_widget_nrql_metric_execution", "execute_dashboard_widgets_with_variables", b"execute_dashboard_widgets_with_variables", "fetch_dashboard_widgets", b"fetch_dashboard_widgets", "get_dashboard_variable_values", b"get_dashboard_variable_values", "nrql_metric_execution", b"nrql_metric_execution", "task", b"task", "type", b"type"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["task", b"task"]) -> typing_extensions.Literal["entity_application_golden_metric_execution", "entity_dashboard_widget_nrql_metric_execution", "nrql_metric_execution", "dashboard_multiple_widgets", "entity_application_apm_metric_execution", "fetch_dashboard_widgets", "entity_application_apm_database_summary", "entity_application_apm_transaction_summary", "get_dashboard_variable_values", "execute_dashboard_widgets_with_variables"] | None: ... global___NewRelic = NewRelic