|
36 | 36 |
|
37 | 37 | import temporalio.activity |
38 | 38 | import temporalio.api.sdk.v1 |
| 39 | +import temporalio.api.workflowservice.v1 |
39 | 40 | import temporalio.client |
40 | 41 | import temporalio.converter |
41 | 42 | import temporalio.converter._extstore |
@@ -5489,6 +5490,54 @@ async def test_workflow_buffered_metrics(client: Client, env: WorkflowEnvironmen |
5489 | 5490 | ) |
5490 | 5491 |
|
5491 | 5492 |
|
| 5493 | +@pytest.mark.requires_local_server |
| 5494 | +async def test_workflow_buffered_metrics_worker_heartbeat(env: WorkflowEnvironment): |
| 5495 | + if env.supports_time_skipping: |
| 5496 | + pytest.skip("Time-skipping server does not implement ListWorkers") |
| 5497 | + |
| 5498 | + runtime = Runtime( |
| 5499 | + telemetry=TelemetryConfig(metrics=MetricBuffer(10000)), |
| 5500 | + worker_heartbeat_interval=timedelta(seconds=1), |
| 5501 | + ) |
| 5502 | + client = await env.connect_client(runtime=runtime) |
| 5503 | + async with new_worker( |
| 5504 | + client, CustomMetricsWorkflow, activities=[custom_metrics_activity] |
| 5505 | + ) as worker: |
| 5506 | + await client.execute_workflow( |
| 5507 | + CustomMetricsWorkflow.run, |
| 5508 | + id=f"wf-{uuid.uuid4()}", |
| 5509 | + task_queue=worker.task_queue, |
| 5510 | + ) |
| 5511 | + |
| 5512 | + async def assert_worker_heartbeat() -> None: |
| 5513 | + response = await client.workflow_service.list_workers( |
| 5514 | + temporalio.api.workflowservice.v1.ListWorkersRequest( |
| 5515 | + namespace=client.namespace, |
| 5516 | + query=f'TaskQueue = "{worker.task_queue}"', |
| 5517 | + page_size=100, |
| 5518 | + ) |
| 5519 | + ) |
| 5520 | + heartbeat = next( |
| 5521 | + ( |
| 5522 | + info.worker_heartbeat |
| 5523 | + for info in response.workers_info |
| 5524 | + if info.worker_heartbeat.task_queue == worker.task_queue |
| 5525 | + ), |
| 5526 | + None, |
| 5527 | + ) |
| 5528 | + assert heartbeat is not None |
| 5529 | + assert heartbeat.workflow_task_slots_info.total_processed_tasks > 0 |
| 5530 | + assert heartbeat.activity_task_slots_info.total_processed_tasks > 0 |
| 5531 | + assert heartbeat.workflow_task_slots_info.current_available_slots > 0 |
| 5532 | + assert heartbeat.activity_task_slots_info.current_available_slots > 0 |
| 5533 | + assert heartbeat.local_activity_slots_info.current_available_slots > 0 |
| 5534 | + assert heartbeat.workflow_poller_info.current_pollers > 0 |
| 5535 | + assert heartbeat.activity_poller_info.current_pollers > 0 |
| 5536 | + |
| 5537 | + # Do not drain the buffer: heartbeats must not depend on initializing Python attributes. |
| 5538 | + await assert_eventually(assert_worker_heartbeat) |
| 5539 | + |
| 5540 | + |
5492 | 5541 | async def test_workflow_metrics_other_types(env: WorkflowEnvironment): |
5493 | 5542 | async def do_stuff(buffer: MetricBuffer) -> float: |
5494 | 5543 | runtime = Runtime(telemetry=TelemetryConfig(metrics=buffer)) |
|
0 commit comments