Skip to content

Commit 592d393

Browse files
[Core] update reconciliation metrics and logs (#2931)
1 parent 44c6484 commit 592d393

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
77

88
<!-- towncrier release notes start -->
99

10+
## 0.38.13 (2026-03-15)
11+
12+
### Improvements
13+
14+
- Added progress logs in the reconciliation phase: logs are now emitted before fetching current entity state from Port and before the delete diff, showing counts of entities at Port, synced, and to be deleted.
15+
- Added `success` metric initialization for the reconciliation `syncing` state, ensuring `syncKindsMetrics` won't be stuck on pending state until completion.
16+
- Changed reconciliation completed/failed metric reporting to use PUT (update existing document) instead of POST (create new document), so the syncing document is updated in-place rather than creating a duplicate.
17+
18+
1019
## 0.38.12 (2026-03-10)
1120

1221
### Improvements

port_ocean/core/integrations/mixins/sync_raw.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,7 @@ async def sort_and_upsert_failed_entities(
738738

739739
except OceanAbortException as ocean_abort:
740740
logger.info(
741-
f"Failed topological sort of failed to upsert entites - trying to upsert unordered {event.entity_topological_sorter.get_entities_count()} entities.",
741+
f"Failed topological sort of failed to upsert entities - trying to upsert unordered {event.entity_topological_sorter.get_entities_count()} entities.",
742742
failed_topological_sort_entities_count=event.entity_topological_sorter.get_entities_count(),
743743
)
744744
if isinstance(ocean_abort.__cause__, CycleError):
@@ -963,10 +963,20 @@ async def _resync_reconciliation(
963963
},
964964
],
965965
}
966+
logger.info(
967+
"Fetching current entity state from Port",
968+
entities_synced=len(generated_entities),
969+
)
966970
entities_at_port = await ocean.port_client.search_entities(
967971
user_agent_type, query
968972
)
969-
entities_to_delete = len(entities_at_port) - len(generated_entities)
973+
entities_to_delete = max(0, len(entities_at_port) - len(generated_entities))
974+
logger.info(
975+
"Calculating diff and deleting stale entities",
976+
entities_at_port=len(entities_at_port),
977+
entities_synced=len(generated_entities),
978+
entities_to_delete=entities_to_delete,
979+
)
970980

971981
await self.entities_state_applier.delete_diff(
972982
{"before": entities_at_port, "after": generated_entities},
@@ -978,7 +988,7 @@ async def _resync_reconciliation(
978988
"Reconciliation phase complete",
979989
entities_at_port=len(entities_at_port),
980990
entities_synced=len(generated_entities),
981-
entities_to_delete=max(0, entities_to_delete),
991+
entities_to_delete=entities_to_delete,
982992
)
983993

984994
logger.info("Resync finished successfully")
@@ -1180,6 +1190,11 @@ async def sync_raw_all(
11801190
else:
11811191
async with metric_resource_context(MetricResourceKind.RECONCILIATION):
11821192
ocean.metrics.sync_state = SyncState.SYNCING
1193+
ocean.metrics.set_metric(
1194+
name=MetricType.SUCCESS_NAME,
1195+
labels=[MetricResourceKind.RECONCILIATION, MetricPhase.RESYNC],
1196+
value=0,
1197+
)
11831198
await ocean.metrics.send_metrics_to_webhook(
11841199
kind=MetricResourceKind.RECONCILIATION
11851200
)
@@ -1199,11 +1214,16 @@ async def sync_raw_all(
11991214
ocean.metrics.sync_state = (
12001215
SyncState.COMPLETED if success else SyncState.FAILED
12011216
)
1217+
ocean.metrics.set_metric(
1218+
name=MetricType.SUCCESS_NAME,
1219+
labels=[MetricResourceKind.RECONCILIATION, MetricPhase.RESYNC],
1220+
value=1 if success else 0,
1221+
)
12021222
await ocean.metrics.send_metrics_to_webhook(
12031223
kind=MetricResourceKind.RECONCILIATION
12041224
)
1205-
await ocean.metrics.report_sync_metrics(
1206-
kinds=[MetricResourceKind.RECONCILIATION]
1225+
await ocean.metrics.report_kind_sync_metrics(
1226+
kind=MetricResourceKind.RECONCILIATION
12071227
)
12081228

12091229
return success

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "port-ocean"
3-
version = "0.38.12"
3+
version = "0.38.13"
44
description = "Port Ocean is a CLI tool for managing your Port projects."
55
readme = "README.md"
66
homepage = "https://app.getport.io"

0 commit comments

Comments
 (0)