Add basic Prometheus/Grafana setup for local development observability
and as a starting point for building custom production monitoring.
Usage: ./pgconfig -f monitoring.yml up -d
- Grafana at http://localhost:3000 (admin/admin)
- Prometheus at http://localhost:9091 with Eureka service discovery
Includes basic dashboard showing JVM metrics, HTTP rates, service health,
and resource usage. Intentionally kept simple - users should customize for
production with alerting, persistence, security, and integration with
existing observability platforms.
Features:
- Auto-discovery of scaled replicas via Eureka
- Comprehensive monitoring guide
- Example queries and dashboard customization tips
This is a development tool and foundation, not production-ready monitoring.
Use separate bind mount directory for acceptance tests
Configure catalog-datadir bind mount path via environment variable to
isolate acceptance test data from development data.
- catalog-datadir.yml: Use ${CATALOG_DATADIR_PATH:-$PWD/catalog-datadir}
- acceptance_datadir: Use catalog-datadir_acceptance directory
- compose/.gitignore: Ignore catalog-datadir_acceptance/
This prevents acceptance tests from failing when the development datadir
contains non-empty data, while preserving development data across runs.
This commit addresses two critical bugs in the EventualConsistencyEnforcer
and improves REST API query performance by 95ms when the catalog is converged.
The first bug caused operations to be registered multiple times in pending
queues when retried. This is now prevented by checking for duplicates before
adding operations to the list.
The second bug occurred when objects were removed while other operations still
referenced them. The RemoveOp.clearDependants() method only found operations
currently waiting for the removed object, missing operations that had moved to
waiting for other dependencies. These orphaned operations would later complete
with dangling references. The fix tracks original missing references for each
operation and scans all pending operations when removing an object, discarding
any that originally depended on it regardless of which queue they're in.
Simplified EventuallyConsistentCatalogFacade by removing the isRestRequest()
special case. Previously REST queries always retried even when the catalog was
converged, wasting ~100ms per query. Now all web requests use the same smart
retry logic based on actual catalog convergence state. This eliminates wasteful
retries while still retrying when pending operations exist that might resolve.
Also renamed getMissingRefs() to computeMissingRefs() to reflect its side
effects, cached unresolved refs to avoid recomputation during debug logging,
added comprehensive javadocs, and expanded test coverage to 24 tests including
layers with missing styles and layer groups with missing layers.
The ImageMosaic acceptance tests were failing with 500 errors because they
referenced the old volume mount path /mnt/geoserver_data, which was changed
to /opt/geoserver_data in commit b33a27b9f6.
Changes:
- Update test_imagemosaic.py: Change all file paths from /mnt/ to /opt/
(6 occurrences across all test functions)
- Update acceptance_tests/README.md: Update sample data path documentation
to reflect the /opt/ mount location
The tests use external.imagemosaic REST endpoints to reference files that
must exist at the paths specified. With the old /mnt/ paths, GeoServer
could not find the sample data files, resulting in 500 Internal Server
Error responses.
Fixes critical bug where saving new resources failed with "Attempting to save
a resource of undefined type" error. This prevented GeoServer security
initialization when using pgconfig backend (e.g., saving master password file).
Root cause: save() called resource.isUndefined() which triggered getType(),
which called updateState() that reset the type to UNDEFINED before INSERT.
Solution:
- Access resource.type field directly instead of calling getType()
- Refactor save() to unified UPSERT (INSERT ... ON CONFLICT ... DO UPDATE)
- Add optional contents parameter for atomic content+metadata updates
- Use COALESCE to preserve existing content when contents is null
Related improvements:
- Simplify out() implementation to single save() call
- Fix move() to use direct UPDATE, preserving content and ID
- Rename copy() to reset() for clarity
- Add testWriteNewResource() covering the master password scenario
Besides the upstream fix for GEOS-11979, fix for the Stream not being
closed when calling RepositoryGeoServerFacadeImpl.getGlobalServices(),
and add caching support for getServices() and
getServices(WorkspaceInfo) in CachingCatalogFacade, as it's called
multiple times by the OGCAPI Features code when building the
collections document.
Split build workflow into separate jobs: base images build first, then
infrastructure and GeoServer images build in parallel. Each job packages
only its required modules. Signing moved to dedicated job that runs once
after all builds complete. Sign all builds including SNAPSHOTs to catch
issues early.
CatalogPropertyResolver sets the StyleInfo's Catalog property, but
StyleInfoImpl expects the catalog to be null for remote WMS styles,
otherwise StyleInfoImpl.getSLD() fails without short-circuiting
to return null.