Skip to content

build(deps-dev): bump the dev-dependencies group with 2 updates

9d750fa
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Closed

build(deps-dev): bump the dev-dependencies group with 2 updates #64

build(deps-dev): bump the dev-dependencies group with 2 updates
9d750fa
Select commit
Loading
Failed to load commit list.
GitHub Actions / JUnit Test Report failed Dec 15, 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-796db0c2651249a485e1099c41f6ce32')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-45192dedd8fe47b39a9acb30db19cb8b')

    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 0x7fe30e49a5a0>
action_result = <moto.core.responses.ActionResult object at 0x7fe30a3da720>

    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-ffc88077cc6f405d8e9038bb3e176cd0')
temp_alb = ('app/test-alb-3b9aa623a43c4bdca26eb337c8f26653/f32330060194f86a', 'test-alb-3b9aa623a43c4bdca26eb337c8f26653')

    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 0x7fe2fafba6c0>
action_result = <moto.core.responses.ActionResult object at 0x7fe30042c9e0>

    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-8ee5016c75a849ee8b688fd30be49bae')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-4019a2458d224816ac0d9b74f3a86bae')
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 0x7fe30c4bba70>
action_result = <moto.core.responses.ActionResult object at 0x7fe2f85aa3f0>

    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-b78b37c4c64749d9b5a445d6533da9a0')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-1836b97ba31846599e42a4ec3ab2d6ad')
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 0x7fe2fba647d0>
action_result = <moto.core.responses.ActionResult object at 0x7fe30c1ab830>

    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-006a9369f5cd49fcb546d4255174d0d4')
temp_queue = sqs.Queue(url='https://sqs.eu-west-2.amazonaws.com/123456789012/test-queue-03e8fabe030b4a31bf9aa7e65a4efa85')
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 0x7fe2f63c0da0>
action_result = <moto.core.responses.ActionResult object at 0x7fe30a593890>

    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-7ecb5854fbb84140ba7dc7f891a5aa45')

    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 0x7fe2f5a4a8a0>
action_result = <moto.core.responses.ActionResult object at 0x7fe2f6678b60>

    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-ef4d213bbe42402da1f1f8c41b51bf34')
temp_alb = ('app/test-alb-3f9e412fdeeb4310850e9153b3ce7196/01b702a422dd5718', 'test-alb-3f9e412fdeeb4310850e9153b3ce7196')

    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 0x7fe30a4b0620>
action_result = <moto.core.responses.ActionResult object at 0x7fe2f67004a0>

    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