localstack-core 4.5.1.dev21__py3-none-any.whl → 4.5.1.dev23__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.
Files changed (31) hide show
  1. localstack/services/apigateway/analytics.py +2 -2
  2. localstack/services/apigateway/next_gen/execute_api/handlers/analytics.py +3 -3
  3. localstack/services/cloudformation/{usage.py → analytics.py} +2 -2
  4. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +25 -18
  5. localstack/services/cloudformation/resource_provider.py +3 -3
  6. localstack/services/cloudformation/v2/entities.py +3 -0
  7. localstack/services/cloudformation/v2/provider.py +44 -8
  8. localstack/services/events/analytics.py +4 -2
  9. localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +1 -1
  10. localstack/services/lambda_/analytics.py +4 -4
  11. localstack/services/sns/analytics.py +4 -2
  12. localstack/services/stepfunctions/{usage.py → analytics.py} +2 -2
  13. localstack/services/stepfunctions/asl/static_analyser/usage_metrics_static_analyser.py +2 -2
  14. localstack/utils/analytics/metrics/__init__.py +6 -0
  15. localstack/utils/analytics/metrics/api.py +42 -0
  16. localstack/utils/analytics/metrics/counter.py +209 -0
  17. localstack/utils/analytics/metrics/publisher.py +36 -0
  18. localstack/utils/analytics/metrics/registry.py +97 -0
  19. localstack/version.py +2 -2
  20. {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/METADATA +1 -1
  21. {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/RECORD +29 -25
  22. {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/entry_points.txt +1 -1
  23. localstack_core-4.5.1.dev23.dist-info/plux.json +1 -0
  24. localstack/utils/analytics/metrics.py +0 -373
  25. localstack_core-4.5.1.dev21.dist-info/plux.json +0 -1
  26. {localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack +0 -0
  27. {localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack-supervisor +0 -0
  28. {localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack.bat +0 -0
  29. {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/WHEEL +0 -0
  30. {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/licenses/LICENSE.txt +0 -0
  31. {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/top_level.txt +0 -0
@@ -1,373 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import datetime
4
- import logging
5
- import threading
6
- from abc import ABC, abstractmethod
7
- from collections import defaultdict
8
- from dataclasses import dataclass
9
- from typing import Any, Optional, Union, overload
10
-
11
- from localstack import config
12
- from localstack.runtime import hooks
13
- from localstack.utils.analytics import get_session_id
14
- from localstack.utils.analytics.events import Event, EventMetadata
15
- from localstack.utils.analytics.publisher import AnalyticsClientPublisher
16
-
17
- LOG = logging.getLogger(__name__)
18
-
19
-
20
- @dataclass(frozen=True)
21
- class MetricRegistryKey:
22
- namespace: str
23
- name: str
24
-
25
-
26
- @dataclass(frozen=True)
27
- class CounterPayload:
28
- """An immutable snapshot of a counter metric at the time of collection."""
29
-
30
- namespace: str
31
- name: str
32
- value: int
33
- type: str
34
- labels: Optional[dict[str, Union[str, float]]] = None
35
-
36
- def as_dict(self) -> dict[str, Any]:
37
- result = {
38
- "namespace": self.namespace,
39
- "name": self.name,
40
- "value": self.value,
41
- "type": self.type,
42
- }
43
-
44
- if self.labels:
45
- # Convert labels to the expected format (label_1, label_1_value, etc.)
46
- for i, (label_name, label_value) in enumerate(self.labels.items(), 1):
47
- result[f"label_{i}"] = label_name
48
- result[f"label_{i}_value"] = label_value
49
-
50
- return result
51
-
52
-
53
- @dataclass
54
- class MetricPayload:
55
- """
56
- Stores all metric payloads collected during the execution of the LocalStack emulator.
57
- Currently, supports only counter-type metrics, but designed to accommodate other types in the future.
58
- """
59
-
60
- _payload: list[CounterPayload] # support for other metric types may be added in the future.
61
-
62
- @property
63
- def payload(self) -> list[CounterPayload]:
64
- return self._payload
65
-
66
- def __init__(self, payload: list[CounterPayload]):
67
- self._payload = payload
68
-
69
- def as_dict(self) -> dict[str, list[dict[str, Any]]]:
70
- return {"metrics": [payload.as_dict() for payload in self._payload]}
71
-
72
-
73
- class MetricRegistry:
74
- """
75
- A Singleton class responsible for managing all registered metrics.
76
- Provides methods for retrieving and collecting metrics.
77
- """
78
-
79
- _instance: "MetricRegistry" = None
80
- _mutex: threading.Lock = threading.Lock()
81
-
82
- def __new__(cls):
83
- # avoid locking if the instance already exist
84
- if cls._instance is None:
85
- with cls._mutex:
86
- # Prevents race conditions when multiple threads enter the first check simultaneously
87
- if cls._instance is None:
88
- cls._instance = super().__new__(cls)
89
- return cls._instance
90
-
91
- def __init__(self):
92
- if not hasattr(self, "_registry"):
93
- self._registry = dict()
94
-
95
- @property
96
- def registry(self) -> dict[MetricRegistryKey, "Metric"]:
97
- return self._registry
98
-
99
- def register(self, metric: Metric) -> None:
100
- """
101
- Registers a new metric.
102
-
103
- :param metric: The metric instance to register.
104
- :type metric: Metric
105
- :raises TypeError: If the provided metric is not an instance of `Metric`.
106
- :raises ValueError: If a metric with the same name already exists.
107
- """
108
- if not isinstance(metric, Metric):
109
- raise TypeError("Only subclasses of `Metric` can be registered.")
110
-
111
- if not metric.namespace:
112
- raise ValueError("Metric 'namespace' must be defined and non-empty.")
113
-
114
- registry_unique_key = MetricRegistryKey(namespace=metric.namespace, name=metric.name)
115
- if registry_unique_key in self._registry:
116
- raise ValueError(
117
- f"A metric named '{metric.name}' already exists in the '{metric.namespace}' namespace"
118
- )
119
-
120
- self._registry[registry_unique_key] = metric
121
-
122
- def collect(self) -> MetricPayload:
123
- """
124
- Collects all registered metrics.
125
- """
126
- payload = [
127
- metric
128
- for metric_instance in self._registry.values()
129
- for metric in metric_instance.collect()
130
- ]
131
-
132
- return MetricPayload(payload=payload)
133
-
134
-
135
- class Metric(ABC):
136
- """
137
- Base class for all metrics (e.g., Counter, Gauge).
138
-
139
- Each subclass must implement the `collect()` method.
140
- """
141
-
142
- _namespace: str
143
- _name: str
144
-
145
- def __init__(self, namespace: str, name: str):
146
- if not namespace or namespace.strip() == "":
147
- raise ValueError("Namespace must be non-empty string.")
148
- self._namespace = namespace
149
-
150
- if not name or name.strip() == "":
151
- raise ValueError("Metric name must be non-empty string.")
152
- self._name = name
153
-
154
- @property
155
- def namespace(self) -> str:
156
- return self._namespace
157
-
158
- @property
159
- def name(self) -> str:
160
- return self._name
161
-
162
- @abstractmethod
163
- def collect(
164
- self,
165
- ) -> list[CounterPayload]: # support for other metric types may be added in the future.
166
- """
167
- Collects and returns metric data. Subclasses must implement this to return collected metric data.
168
- """
169
- pass
170
-
171
-
172
- class BaseCounter:
173
- """
174
- A thread-safe counter for any kind of tracking.
175
- This class should not be instantiated directly, use the Counter class instead.
176
- """
177
-
178
- _mutex: threading.Lock
179
- _count: int
180
-
181
- def __init__(self):
182
- super(BaseCounter, self).__init__()
183
- self._mutex = threading.Lock()
184
- self._count = 0
185
-
186
- @property
187
- def count(self) -> int:
188
- return self._count
189
-
190
- def increment(self, value: int = 1) -> None:
191
- """Increments the counter unless events are disabled."""
192
- if config.DISABLE_EVENTS:
193
- return
194
-
195
- if value <= 0:
196
- raise ValueError("Increment value must be positive.")
197
-
198
- with self._mutex:
199
- self._count += value
200
-
201
- def reset(self) -> None:
202
- """Resets the counter to zero unless events are disabled."""
203
- if config.DISABLE_EVENTS:
204
- return
205
-
206
- with self._mutex:
207
- self._count = 0
208
-
209
-
210
- class CounterMetric(Metric, BaseCounter):
211
- """
212
- A thread-safe counter for tracking occurrences of an event without labels.
213
- This class should not be instantiated directly, use the Counter class instead.
214
- """
215
-
216
- _type: str
217
-
218
- def __init__(self, namespace: str, name: str):
219
- Metric.__init__(self, namespace=namespace, name=name)
220
- BaseCounter.__init__(self)
221
-
222
- self._type = "counter"
223
- MetricRegistry().register(self)
224
-
225
- def collect(self) -> list[CounterPayload]:
226
- """Collects the metric unless events are disabled."""
227
- if config.DISABLE_EVENTS:
228
- return list()
229
-
230
- if self._count == 0:
231
- # Return an empty list if the count is 0, as there are no metrics to send to the analytics backend.
232
- return list()
233
-
234
- return [
235
- CounterPayload(
236
- namespace=self._namespace, name=self.name, value=self._count, type=self._type
237
- )
238
- ]
239
-
240
-
241
- class LabeledCounterMetric(Metric):
242
- """
243
- A labeled counter that tracks occurrences of an event across different label combinations.
244
- This class should not be instantiated directly, use the Counter class instead.
245
- """
246
-
247
- _type: str
248
- _unit: str
249
- _labels: list[str]
250
- _label_values: tuple[Optional[Union[str, float]], ...]
251
- _counters_by_label_values: defaultdict[tuple[Optional[Union[str, float]], ...], BaseCounter]
252
-
253
- def __init__(self, namespace: str, name: str, labels: list[str]):
254
- super(LabeledCounterMetric, self).__init__(namespace=namespace, name=name)
255
-
256
- if not labels:
257
- raise ValueError("At least one label is required; the labels list cannot be empty.")
258
-
259
- if any(not label for label in labels):
260
- raise ValueError("Labels must be non-empty strings.")
261
-
262
- if len(labels) > 6:
263
- raise ValueError("Too many labels: counters allow a maximum of 6.")
264
-
265
- self._type = "counter"
266
- self._labels = labels
267
- self._counters_by_label_values = defaultdict(BaseCounter)
268
- MetricRegistry().register(self)
269
-
270
- def labels(self, **kwargs: Union[str, float, None]) -> BaseCounter:
271
- """
272
- Create a scoped counter instance with specific label values.
273
-
274
- This method assigns values to the predefined labels of a labeled counter and returns
275
- a BaseCounter object that allows tracking metrics for that specific
276
- combination of label values.
277
-
278
- :raises ValueError:
279
- - If the set of keys provided labels does not match the expected set of labels.
280
- """
281
- if set(self._labels) != set(kwargs.keys()):
282
- raise ValueError(f"Expected labels {self._labels}, got {list(kwargs.keys())}")
283
-
284
- _label_values = tuple(kwargs[label] for label in self._labels)
285
-
286
- return self._counters_by_label_values[_label_values]
287
-
288
- def collect(self) -> list[CounterPayload]:
289
- if config.DISABLE_EVENTS:
290
- return list()
291
-
292
- payload = []
293
- num_labels = len(self._labels)
294
-
295
- for label_values, counter in self._counters_by_label_values.items():
296
- if counter.count == 0:
297
- continue # Skip items with a count of 0, as they should not be sent to the analytics backend.
298
-
299
- if len(label_values) != num_labels:
300
- raise ValueError(
301
- f"Label count mismatch: expected {num_labels} labels {self._labels}, "
302
- f"but got {len(label_values)} values {label_values}."
303
- )
304
-
305
- # Create labels dictionary
306
- labels_dict = {
307
- label_name: label_value
308
- for label_name, label_value in zip(self._labels, label_values)
309
- }
310
-
311
- payload.append(
312
- CounterPayload(
313
- namespace=self._namespace,
314
- name=self.name,
315
- value=counter.count,
316
- type=self._type,
317
- labels=labels_dict,
318
- )
319
- )
320
-
321
- return payload
322
-
323
-
324
- class Counter:
325
- """
326
- A factory class for creating counter instances.
327
-
328
- This class provides a flexible way to create either a simple counter
329
- (`CounterMetric`) or a labeled counter (`LabeledCounterMetric`) based on
330
- whether labels are provided.
331
- """
332
-
333
- @overload
334
- def __new__(cls, namespace: str, name: str) -> CounterMetric:
335
- return CounterMetric(namespace=namespace, name=name)
336
-
337
- @overload
338
- def __new__(cls, namespace: str, name: str, labels: list[str]) -> LabeledCounterMetric:
339
- return LabeledCounterMetric(namespace=namespace, name=name, labels=labels)
340
-
341
- def __new__(
342
- cls, namespace: str, name: str, labels: Optional[list[str]] = None
343
- ) -> Union[CounterMetric, LabeledCounterMetric]:
344
- if labels is not None:
345
- return LabeledCounterMetric(namespace=namespace, name=name, labels=labels)
346
- return CounterMetric(namespace=namespace, name=name)
347
-
348
-
349
- @hooks.on_infra_shutdown()
350
- def publish_metrics() -> None:
351
- """
352
- Collects all the registered metrics and immediately sends them to the analytics service.
353
- Skips execution if event tracking is disabled (`config.DISABLE_EVENTS`).
354
-
355
- This function is automatically triggered on infrastructure shutdown.
356
- """
357
- if config.DISABLE_EVENTS:
358
- return
359
-
360
- collected_metrics = MetricRegistry().collect()
361
- if not collected_metrics.payload: # Skip publishing if no metrics remain after filtering
362
- return
363
-
364
- metadata = EventMetadata(
365
- session_id=get_session_id(),
366
- client_time=str(datetime.datetime.now()),
367
- )
368
-
369
- if collected_metrics:
370
- publisher = AnalyticsClientPublisher()
371
- publisher.publish(
372
- [Event(name="ls_metrics", metadata=metadata, payload=collected_metrics.as_dict())]
373
- )
@@ -1 +0,0 @@
1
- {"localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.on_infra_shutdown": ["_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services"], "localstack.hooks.on_infra_start": ["_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "eager_load_services=localstack.services.plugins:eager_load_services", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "localstack.cloudformation.resource_providers": ["AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"]}