Skip to content

build(deps-dev): bump the dev-dependencies group across 1 directory w…

52670c1
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Open

build(deps-dev): bump the dev-dependencies group across 1 directory with 3 updates #65

build(deps-dev): bump the dev-dependencies group across 1 directory w…
52670c1
Select commit
Loading
Failed to load commit list.
GitHub Actions / JUnit Test Report failed Dec 29, 2025 in 0s

15 tests run, 8 passed, 0 skipped, 7 failed.

Annotations

Check failure on line 69 in tests/test_emit_metrics.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_emit_metrics.test_s3_discovery_scrape_and_emit

KeyError: 'smithy-rpc-v2-cbor'
Raw output
test_bucket = s3.Bucket(name='temp-a20a40bee1c447c7830b41ff7ec196d7')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-1873af733b3f45c2b33488464a0219ee')

    async def test_s3_discovery_scrape_and_emit(test_bucket, temp_queue):
    
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "s3",
                        "regions": ["eu-west-2"],
                        "metrics": [
                            {
                                "name": "NumberOfObjects",
                                "stats": ["Average"],
                                "period": 60,
                                "length": 86400,  # moto incorrectly excludes 00:00:00 metrics for s3
                            },
                            {
                                "name": "BucketSizeBytes",
                                "stats": ["Average"],
                                "period": 60,
                                "length": 86400,  # moto incorrectly excludes 00:00:00 metrics for s3
                            },
                        ],
                    }
                ]
            }
        }
        new_object = test_bucket.Object(f"test-{uuid4().hex}")
        new_object.put(Body=b"test")
    
        # cloudwatch = boto3.client("cloudwatch", region_name="eu-west-2")
        sqs_client = _get_sqs_client(temp_queue.url)
        with temp_config(conf):
            config = ScrapeConfig()
            client_factory = ClientFactory(config.sts_region)
    
            executor = Executor(config, client_factory, sqs_client)
>           results = await executor.scrape_and_emit()
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_emit_metrics.py:69: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:90: in scrape_and_emit
    results = await asyncio.gather(*tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:85: in _scrape
    metrics = await ex.scrape_and_emit()
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:236: in scrape_and_emit
    raise e
src/executor.py:206: in scrape_and_emit
    discovered_metrics = await self.get_batched_discovery_metrics()
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:350: in get_batched_discovery_metrics
    discovery_batches = await self.discover_metrics(init_clients=init_clients)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65edd9a990>
action_result = <moto.core.responses.ActionResult object at 0x7f65e9cd64b0>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError

Check failure on line 126 in tests/test_emit_metrics.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_emit_metrics.test_alb_discovery_scrape_and_emit

KeyError: 'smithy-rpc-v2-cbor'
Raw output
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-174ef01fa0634a30b595c1fb8a31d1b7')
temp_alb = ('app/test-alb-6e97066914b24adda7cd562897cb5a0b/96876e29b25fd891', 'test-alb-6e97066914b24adda7cd562897cb5a0b')

    async def test_alb_discovery_scrape_and_emit(temp_queue, temp_alb):
        alb_id, _alb_name = temp_alb
    
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "alb",
                        "regions": ["eu-west-2"],
                        "metrics": [
                            {
                                "name": "RequestCount",
                                "stats": ["Sum", "SampleCount", "Maximum"],
                            }
                        ],
                    }
                ]
            }
        }
    
        sqs_client = _get_sqs_client(temp_queue.url)
        with temp_config(conf):
            config = ScrapeConfig(
                rtf_overrides={"AWS/ApplicationELB": ["elasticloadbalancing:loadbalancer"]}
            )
            client_factory = ClientFactory(config.sts_region)
    
            executor = Executor(config, client_factory, sqs_client)
            with temp_metrics(
                [
                    MetricDatum(
                        namespace="AWS/ApplicationELB",
                        name="RequestCount",
                        value=10,
                        dimensions=[
                            {"Name": "LoadBalancer", "Value": alb_id},
                        ],
                        timestamp=datetime.now(tz=UTC).replace(second=0, microsecond=0)
                        - relativedelta(minutes=1),
                        unit="Count",
                    )
                ]
            ):
    
>               results = await executor.scrape_and_emit()
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_emit_metrics.py:126: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:90: in scrape_and_emit
    results = await asyncio.gather(*tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:85: in _scrape
    metrics = await ex.scrape_and_emit()
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:236: in scrape_and_emit
    raise e
src/executor.py:206: in scrape_and_emit
    discovered_metrics = await self.get_batched_discovery_metrics()
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:350: in get_batched_discovery_metrics
    discovery_batches = await self.discover_metrics(init_clients=init_clients)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65db043140>
action_result = <moto.core.responses.ActionResult object at 0x7f65da997c50>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError

Check failure on line 56 in tests/test_metric_discovery.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_metric_discovery.test_s3_discovery_search_dimensions[dim_requirements0-2]

KeyError: 'smithy-rpc-v2-cbor'
Raw output
test_bucket = s3.Bucket(name='temp-8d5aa0ca7777423383109f2389d2dd20')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-cf95a43bd9a44d5a8bef794fa68fc77c')
dim_requirements = {}, expected = 2

    @pytest.mark.parametrize(
        ("dim_requirements", "expected"),
        [
            ({}, 2),
            ({"BucketName": "^temp-.*"}, 2),
            ({"BucketName": "bad"}, 0),
        ],
    )
    async def test_s3_discovery_search_dimensions(
        test_bucket, temp_queue, dim_requirements: dict, expected: int
    ):
    
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "s3",
                        "regions": ["eu-west-2"],
                        "search_dimensions": dim_requirements,
                        "metrics": [
                            {
                                "name": "NumberOfObjects",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                            {
                                "name": "BucketSizeBytes",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                        ],
                    }
                ]
            }
        }
    
        sqs_client = SQSClient(
            config=Config(region_name="eu-west-2"), queue_url=temp_queue.url
        )
        with temp_config(conf):
            config = ScrapeConfig()
            client_factory = ClientFactory(config.sts_region)
    
            executor = Executor(config, client_factory, sqs_client)
>           results = await executor.discover_metrics(init_clients=True)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_metric_discovery.py:56: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:118: in discover_metrics
    results = await asyncio.gather(*exec_tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:105: in _executor_result
    shards = await ex.discover_metrics(init_clients=init_clients)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65ec04e4e0>
action_result = <moto.core.responses.ActionResult object at 0x7f65dbe53560>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError

Check failure on line 56 in tests/test_metric_discovery.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_metric_discovery.test_s3_discovery_search_dimensions[dim_requirements1-2]

KeyError: 'smithy-rpc-v2-cbor'
Raw output
test_bucket = s3.Bucket(name='temp-0e9fe816753942ac8891a575980aa636')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-6d3c0d42ba3644d1a21cca10270a58d8')
dim_requirements = {'BucketName': '^temp-.*'}, expected = 2

    @pytest.mark.parametrize(
        ("dim_requirements", "expected"),
        [
            ({}, 2),
            ({"BucketName": "^temp-.*"}, 2),
            ({"BucketName": "bad"}, 0),
        ],
    )
    async def test_s3_discovery_search_dimensions(
        test_bucket, temp_queue, dim_requirements: dict, expected: int
    ):
    
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "s3",
                        "regions": ["eu-west-2"],
                        "search_dimensions": dim_requirements,
                        "metrics": [
                            {
                                "name": "NumberOfObjects",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                            {
                                "name": "BucketSizeBytes",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                        ],
                    }
                ]
            }
        }
    
        sqs_client = SQSClient(
            config=Config(region_name="eu-west-2"), queue_url=temp_queue.url
        )
        with temp_config(conf):
            config = ScrapeConfig()
            client_factory = ClientFactory(config.sts_region)
    
            executor = Executor(config, client_factory, sqs_client)
>           results = await executor.discover_metrics(init_clients=True)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_metric_discovery.py:56: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:118: in discover_metrics
    results = await asyncio.gather(*exec_tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:105: in _executor_result
    shards = await ex.discover_metrics(init_clients=init_clients)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65ea1b5be0>
action_result = <moto.core.responses.ActionResult object at 0x7f65db6fa9f0>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError

Check failure on line 56 in tests/test_metric_discovery.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_metric_discovery.test_s3_discovery_search_dimensions[dim_requirements2-0]

KeyError: 'smithy-rpc-v2-cbor'
Raw output
test_bucket = s3.Bucket(name='temp-0881e6c9e8364ab5a70b06bfa843cd90')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-157e2629b28c4b81ac4a8eba3ac6b870')
dim_requirements = {'BucketName': 'bad'}, expected = 0

    @pytest.mark.parametrize(
        ("dim_requirements", "expected"),
        [
            ({}, 2),
            ({"BucketName": "^temp-.*"}, 2),
            ({"BucketName": "bad"}, 0),
        ],
    )
    async def test_s3_discovery_search_dimensions(
        test_bucket, temp_queue, dim_requirements: dict, expected: int
    ):
    
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "s3",
                        "regions": ["eu-west-2"],
                        "search_dimensions": dim_requirements,
                        "metrics": [
                            {
                                "name": "NumberOfObjects",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                            {
                                "name": "BucketSizeBytes",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                        ],
                    }
                ]
            }
        }
    
        sqs_client = SQSClient(
            config=Config(region_name="eu-west-2"), queue_url=temp_queue.url
        )
        with temp_config(conf):
            config = ScrapeConfig()
            client_factory = ClientFactory(config.sts_region)
    
            executor = Executor(config, client_factory, sqs_client)
>           results = await executor.discover_metrics(init_clients=True)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_metric_discovery.py:56: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:118: in discover_metrics
    results = await asyncio.gather(*exec_tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:105: in _executor_result
    shards = await ex.discover_metrics(init_clients=init_clients)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65d60fa7e0>
action_result = <moto.core.responses.ActionResult object at 0x7f65daa6d010>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError

Check failure on line 95 in tests/test_metric_discovery.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_metric_discovery.test_s3_metric_discovery

KeyError: 'smithy-rpc-v2-cbor'
Raw output
test_bucket = s3.Bucket(name='temp-2456631a0533437eb4686e66b1a58485')

    async def test_s3_metric_discovery(test_bucket):
    
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "s3",
                        "regions": ["eu-west-2"],
                        "metrics": [
                            {
                                "name": "NumberOfObjects",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                            {
                                "name": "BucketSizeBytes",
                                "stats": ["Average"],
                                "period": 86400,
                            },
                        ],
                    }
                ]
            }
        }
    
        with temp_config(conf):
            config = ScrapeConfig()
            client_factory = ClientFactory(config.sts_region)
            executor = Executor(config, client_factory, None)  # type: ignore[arg-type]
>           discovered = await executor.discover_metrics(init_clients=True)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_metric_discovery.py:95: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:118: in discover_metrics
    results = await asyncio.gather(*exec_tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:105: in _executor_result
    shards = await ex.discover_metrics(init_clients=init_clients)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65d540baa0>
action_result = <moto.core.responses.ActionResult object at 0x7f65daa6ec30>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError

Check failure on line 142 in tests/test_metric_discovery.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Test Report

test_metric_discovery.test_alb_metric_discovery

KeyError: 'smithy-rpc-v2-cbor'
Raw output
test_bucket = s3.Bucket(name='temp-177b10be9a9d4ba5b2eb664f41b1456e')
temp_alb = ('app/test-alb-5a4ac6222c21434aa166e88d25ed27bd/890efddce6d7fa76', 'test-alb-5a4ac6222c21434aa166e88d25ed27bd')

    async def test_alb_metric_discovery(test_bucket, temp_alb):
    
        alb_id, _alb_name = temp_alb
        conf = {
            "discovery": {
                "jobs": [
                    {
                        "type": "alb",
                        "regions": ["eu-west-2"],
                        "metrics": [{"name": "RequestCount", "stats": ["Sum"]}],
                    }
                ]
            }
        }
    
        with temp_config(conf):
            config = ScrapeConfig(
                rtf_overrides={"AWS/ApplicationELB": ["elasticloadbalancing:loadbalancer"]}
            )
            client_factory = ClientFactory(config.sts_region)
            executor = Executor(config, client_factory, None)  # type: ignore[arg-type]
    
            with temp_metrics(
                [
                    MetricDatum(
                        namespace="AWS/ApplicationELB",
                        name="RequestCount",
                        value=10,
                        dimensions=[
                            {"Name": "LoadBalancer", "Value": alb_id},
                        ],
                        timestamp=datetime.now(tz=UTC).replace(second=0, microsecond=0),
                        unit="Count",
                    )
                ]
            ):
>               discovered = await executor.discover_metrics(init_clients=True)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/test_metric_discovery.py:142: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/executor.py:118: in discover_metrics
    results = await asyncio.gather(*exec_tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:105: in _executor_result
    shards = await ex.discover_metrics(init_clients=init_clients)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:383: in discover_metrics
    discovery_results = await asyncio.gather(*discovery_tasks)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/executor.py:415: in run_discovery_job
    async for page in self.cloudwatch.list_metrics(metric_req.name, job):
src/clients.py:111: in list_metrics
    async for page in self._paginate("list_metrics", "NextToken", **kwargs):
src/clients.py:79: in _paginate
    page = await run_in_executor(_get_next_page)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:42: in run_in_executor
    result = cast(T, await loop.run_in_executor(None, to_execute))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.12/x64/lib/python3.12/concurrent/futures/thread.py:59: in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/clients.py:74: in _get_next_page
    return page_iterator.__next__()
           ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:272: in __iter__
    response = self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/paginate.py:360: in _make_request
    return self._method(**current_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:602: in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/context.py:123: in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/client.py:1060: in _make_api_call
    http, parsed_response = self._make_request(
.venv/lib/python3.12/site-packages/botocore/client.py:1084: in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:119: in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/endpoint.py:200: in _send_request
    while self._needs_retry(
.venv/lib/python3.12/site-packages/botocore/endpoint.py:360: in _needs_retry
    responses = self._event_emitter.emit(
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:207: in __call__
    if self._checker(**checker_kwargs):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:284: in __call__
    should_retry = self._should_retry(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:307: in _should_retry
    return self._checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:363: in __call__
    checker_response = checker(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:247: in __call__
    return self._check_caught_exception(
.venv/lib/python3.12/site-packages/botocore/retryhandler.py:416: in _check_caught_exception
    raise caught_exception
.venv/lib/python3.12/site-packages/botocore/endpoint.py:276: in _do_get_response
    responses = self._event_emitter.emit(event_name, request=request)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:412: in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:256: in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/botocore/hooks.py:239: in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:38: in __call__
    response = self.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/botocore_stubber.py:88: in process_request
    status, headers, body = method_to_execute(
.venv/lib/python3.12/site-packages/moto/core/responses.py:363: in dispatch
    return cls()._dispatch(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:578: in _dispatch
    return self.call_action()
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/moto/core/responses.py:706: in call_action
    status, headers, body = self.serialized(response)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <moto.cloudwatch.responses.CloudWatchResponse object at 0x7f65d60fb560>
action_result = <moto.core.responses.ActionResult object at 0x7f65ea1e2a20>

    def serialized(self, action_result: ActionResult) -> TYPE_RESPONSE:
        service_model = get_service_model(self.service_name)
        operation_model = service_model.operation_model(self._get_action())
        protocol = service_model.protocol
        protocol += "-json" if protocol == "query" and self.request_json else ""
>       serializer_cls = SERIALIZERS[protocol]
                         ^^^^^^^^^^^^^^^^^^^^^
E       KeyError: 'smithy-rpc-v2-cbor'

.venv/lib/python3.12/site-packages/moto/core/responses.py:665: KeyError