Version History
v2.6.0 (2025-07-21)
Features
-
LDAP Entry Reconciliation: Automatic reconciliation of entries in the database with the LDAP server.
- The reconciliation is triggered by a maintenance task that runs periodically if either the
intervalorcronis set. See thereference.conffor the configuration options and defaults. - One reconciliation run is triggered after the initial sync is complete and the continuous search is started, regardless of the schedule, to ensure that all deletions during down time are caught.
- Enable scheduled reconciliation if:
- Your LDAP server has unreliable persistent search delete notifications
- You need guaranteed consistency checks for compliance
- You experience frequent network partitions
- New Prometheus metrics for reconciliation:
scribe_reconciliation_entries_verified_total(counter): Number of entries verified as present in LDAP during reconciliation.scribe_reconciliation_entries_deleted_total(counter): Number of entries deleted (synthetic deletes emitted) during reconciliation.scribe_reconciliation_duration_seconds(summary/timer): Total time taken for a full reconciliation run.scribe_reconciliation_last_run_timestamp_seconds(gauge): Unix timestamp of the last completed reconciliation run.
- The reconciliation is triggered by a maintenance task that runs periodically if either the
-
Maintenance Task Scheduling: Added support for scheduling regular maintenance tasks
- Please check the
reference.conffor the configuration options and defaults. - The following services support maintenance tasks:
- Database: for vacuuming and re-indexing the database instead of running these during startup
- New Prometheus metrics for database maintenance:
database_maintenance_duration_seconds(timer): Duration of each maintenance run.database_maintenance_failed_total(counter): Number of failed maintenance runs.database_maintenance_last_run_timestamp_seconds(gauge): Unix timestamp of the last attempted maintenance run.
- New Prometheus metrics for database maintenance:
- Scribe: for automatice reconciliation of entries in the database with the LDAP server.
- New Prometheus metrics for scribe maintenance: are descibed above
- Database: for vacuuming and re-indexing the database instead of running these during startup
- Please check the
-
Intelligent Data Compression: Automatic compression of LDAP entry data to reduce storage footprint and network transfer sizes.
- System automatically selects optimal compression algorithm based on data characteristics
- Completely transparent to applications - no configuration changes required
- Up to 70% reduction in storage usage for typical LDAP entries
- New Prometheus metrics track compression effectiveness and performance
-
LDAP Identity Resolution Reliability: Enhanced the way the system matches and updates LDAP entries, ensuring that even in rare cases—such as after directory restores or renames—entries are always correctly identified and updated.
- Added extra safeguards to prevent rare synchronization issues, further protecting data integrity during both initial and ongoing syncs.
- These improvements make the synchronization process more robust and reliable, especially in complex or high-throughput environments.
-
Monitoring: Metrics are now refreshed and cached at a regular interval to prevent slow responses.
- Added a new
monitoring.prometheus.scrapeIntervalconfiguration property to control the refresh interval. The default is 15 seconds.
monitoring.prometheus.scrapeInterval = 15s - Added a new
Fixes
- License Verification: Improved license verification to prevent the service from crashing in case of failed license verification due to connectivity issues to third party services like LDAP or databases. The service will now retry up to 5 times.
- Attribute Change Descriptions: Fixed an issue where change logs and event descriptions could use lowercased attribute names instead of the configured casing. All change tracking now consistently uses the attribute casing as defined in your configuration, ensuring clarity and compatibility with downstream systems.
- Operational Attribute Handling: Resolved a bug that could falsely report the removal of certain attributes (such as
createTimestamp,modifyTimestamp, orentryUUID) during entry reconciliation. The system now correctly ignores unobserved operational attributes when comparing entries, preventing spurious removal events and ensuring only relevant changes are tracked.
Breaking Changes
-
Metrics Optimization: This release includes significant changes to metrics that may impact existing dashboards and monitoring configurations.
- Performance Impact
- ~50% fewer metrics: Reduced from ~1,600 to ~800 total metrics
- Memory optimization: Rolling windows with 5-minute expiry to reduce memory usage and provide more accurate metrics
- Reduced cardinality: Service transitions, LDAP searches optimized
- Better precision: Summary percentiles vs histogram approximations
- Lower storage: Fewer time series to store and query, reducing storage requirements
- Monitoring Recommendations
- Update dashboards to use new metric formats before upgrading
- Test queries in staging environment first to ensure the new metrics are working as expected
- Review alerts that depend on histogram buckets to ensure they are still working as expected
- Monitor memory usage after upgrade (should decrease)
Detailed Changes
-
Service Transition Metrics
Before:
service_transition_seconds{service="X",from="new",to="starting",...}service_transition_seconds{service="X",from="starting",to="running",...}service_transition_seconds{service="X",from="running",to="failed",...}After:
service_transition_seconds{service="X",type="startup",...}service_transition_seconds{service="X",type="restart",...}service_transition_seconds{service="X",type="failure",...}Changes:
- Removed:
fromandtotags (high cardinality) - Added:
typetag with meaningful categories (startup,restart,failure,shutdown) - Filtered: Startup noise transitions (
new → starting) - Percentiles: Reduced from 5 to 2 percentiles (
0.5, 0.95)
Migration:
- Update dashboards to use
typeinstead offrom/totags - Categories:
startup,restart,failure,shutdown
Terminal window # Old queryservice_transition_seconds{from="starting",to="running"}# New queryservice_transition_seconds{type="startup"} - Removed:
-
LDAP Search Metrics
Before: Histogram with 50+ buckets
channel_ldap_search_time_seconds_bucket{...,le="0.001"} 0channel_ldap_search_time_seconds_bucket{...,le="0.002"} 1[... 50+ buckets ...]After: Summary with optimized percentiles
channel_ldap_search_time_seconds{...,quantile="0.5"} 0.043channel_ldap_search_time_seconds{...,quantile="0.95"} 0.051channel_ldap_search_time_seconds{...,quantile="0.99"} 0.052Changes:
- Format: Histogram → Summary
- Percentiles: Reduced to
0.5, 0.95, 0.99(high cardinality optimization) - Buckets: Removed all histogram buckets (50+ → 0)
Migration:
- Replace
histogram_quantile()with directquantilelabel access - Update SLI/SLO calculations to use summary percentiles
Terminal window # Old queryhistogram_quantile(0.95, rate(channel_ldap_search_time_seconds_bucket[5m]))# New querychannel_ldap_search_time_seconds{quantile="0.95"} -
Processing Time Metrics
Before: Histogram with SLO buckets
scribe_processing_time_seconds_bucket{entryType="user",phase="diffing",le="0.001"} 5scribe_processing_time_seconds_bucket{entryType="user",phase="diffing",le="0.002"} 25[... many buckets ...]After: Summary with full percentiles
scribe_processing_time_seconds{entryType="user",phase="diffing",quantile="0.5"} 0.004scribe_processing_time_seconds{entryType="user",phase="diffing",quantile="0.75"} 0.007scribe_processing_time_seconds{entryType="user",phase="diffing",quantile="0.9"} 0.015scribe_processing_time_seconds{entryType="user",phase="diffing",quantile="0.95"} 0.050scribe_processing_time_seconds{entryType="user",phase="diffing",quantile="0.99"} 0.487Changes:
- Format: Histogram → Summary
- Percentiles: Added
0.5, 0.75, 0.9, 0.95, 0.99(standard set) - Buckets: Removed all histogram buckets
Migration:
- Update queries to use
quantilelabels instead ofhistogram_quantile() - SLIs can now use direct percentile values
Terminal window # Old queryhistogram_quantile(0.90, rate(scribe_processing_time_seconds_bucket[5m]))# New queryscribe_processing_time_seconds{quantile="0.9"} -
New Entry Codec Metrics
Added new compression and entropy metrics:
scribe_entry_encode_bytes{codec="lz4|zstd|none",kind="raw|compressed",quantile="0.5"} 1440scribe_entry_decode_bytes{codec="lz4|zstd|none",kind="raw|compressed",quantile="0.5"} 1440scribe_entry_encode_compression{codec="lz4|zstd",le="5.0"} 4scribe_entry_encode_entropy{le="25.0"} 137598Features:
- Encode/Decode sizes: Track compression effectiveness by codec
- Compression percentage: Business-critical buckets at 85% and 95% thresholds
- Entropy analysis: Optimized buckets for compression decision making
- Percentiles: Standard set
0.5, 0.75, 0.9, 0.95, 0.99
- Performance Impact
v2.5.0 (2025-06-26)
Features
- LDAP Socket Tuning: Added support for tuning the LDAP socket settings using environment variables and configuration properties, with optimized defaults for production environments.
- Monitoring: Use dynamic balanced thread pool for metrics scraping to improve performance.
Fixes
- Query Syntax Correction: Removed invalid
USE INDEXhint from LDAP presence filters. - Prometheus Tag Standardization: All
scribe_events_countmetrics now use a consistent set of tag keys (event,op,target) to comply with Prometheus requirements. For event types whereoportargetare not applicable, the value"none"is used. This applies toevent=add,event=move, andevent=delete. This resolves meter registration errors and ensures reliable metric collection and querying.
v2.4.0 (2025-06-25)
Features
- Faster and More Reliable Lookups: New database indexes have been added to speed up directory entry searches, especially for large datasets.
- Binary LDAP Entry Serialization: Storing LDAP entries in a binary format, for faster processing during sync and retrieval
- Optimized SQL Query Performance: SQL queries are now dynamically constructed for highly selective searches, ensuring PostgreSQL always uses the most efficient query plan.
- Initial Sync Performance: Improved initial synchronization speed by removing unnecessary locking.
- Sync State Query Optimization: Enhanced synchronization speed by optimizing queries that determine the state of entries
Fixes
- Service Info: Improved scribe service info to include the starting state as a healthy state, preventing health check failures during slow startups.
- Health Check: Shows the correct service name in the health check response.
- Monitoring: Suppressed noisy error logs for client disconnects (e.g., “Broken pipe”, “Connection reset”) on metrics and health endpoints. These are now logged at debug level instead of error, reducing log noise from normal client disconnects.
- Scribe Service: Improved error handling and logging in case of disconnects for scribe service.
- Scribe Service: After a restart, the scribe service will now continue with the incremental sync instead of the initial sync.
Breaking
- Attribute Sets Removed: Attribute sets are no longer supported and should be removed from the configuration
When removing attributeSets from your configuration, make sure to add all attributes that were previously only listed in
attributeSetsto the main attributes configuration. This ensures that all attributes are still observed and processed as before.
# Before (deprecated)attributeSets = [ "uid, mail, displayName"]attributes = "cn sn"
# After (supported)attributes = """ cn, sn uid, mail, displayName"""- Removed Prometheus Metrics: This version removes the following Prometheus metrics
scribe.entries.refresh.cache.countscribe.entries.refresh.cache.time
v2.3.0 (2025-05-15)
Fixes
- Improved initial data synchronization speed and prevented Out-Of-Memory errors by implementing a high-watermark memory management strategy.
- Eliminated LDAP message size limits to prevent failures with large LDAP server responses.
- Optimized Database connection pool handling to prevent failed acquisitions.
- Enhanced memory and CPU usage metrics for more accurate monitoring.
- Improved performance of health and healthy check responses.
- Streamlined logging levels and messages for better clarity and reduced noise.
Breaking
- Removed built-in Prometheus metrics for PostgreSQL to mitigate excessive database load. For production environments, using the dedicated Prometheus Exporter is now recommended.
v2.2.0 (2025-03-21)
Features
- implement size categorization for entries_data with optimized indexing and monitoring view
- materialized views for improved performance and type handling
Fixes
- enhance service orchestration and database upgrade coordination
- correct LDAP channel listen
- enhance memory and CPU usage metrics
- improve health and healthy check response
v2.1.2 (2025-02-18)
Fixes
- validate elements in attribute set to ensure they are strings in Settings class
v2.1.1 (2025-02-17)
Fixes
- ensure postgres ssl config works
- loading of referenced files
v2.1.0 (2024-07-05)
Fixes
- relative file/path handling for file/path references in the configuration
- prevent
ssl.enabledfrom being propagated to the database configuration
v2.0.0 (2024-03-30)
Breaking
- new licenses must be generated for the new version of the software
- the
datacolumn on theentriestable has been removed and replaced with aentries_datatable that is partitioned by theuoidcolumn - existing data will be migrated to the new table
- use timestamps without time zone
- new events will use
createdAtandupdatedAtproperties in ISO8601 UTC instead ofcreateTimestampandmodifyTimestampproperties - entries tables
datacolumn has been removed in favor of theentries_datatable - entries tables
metacolumn has been removed in favor of theuuid,dn,etag,createdAt, andupdatedAtcolumns - changed
ldap.idlePeriodForCheckpoint->ldap.idlePeriodwith the default of 5 seconds
What’s new
- the
uuidanddncolumns have been added to theentries - use product based detection to resolve the attribute names of
entryUUID,createTimestamp,modifyTimestamp, andeTagattributes objectClassandstructuralObjectClassare always observed- new
entries_datatables which holds the data of the entries as attribute-value pairs - use more bytes for the hash for the
etagcalculation to reduce the chance of collisions entries.dnlookups are now case-insensitive- use new commits table instead of transactions ids to prevent collisions when the transactions ids roll-over
- the
modifyTimestampandrevisionattributes are no longer used for continuous searches - this prevents change notifications from being sent for every change to an entry
- allow to define sets of attributes to pre-compute their data which can be used to speed up search responses
- allow to define attributes which should be indexed for optimized partial matching (
substringandapproximate) searches - new channels to access the data via LDAP
- only search operations where all attributes (filter, sort, and requested attributes) are observed will be executed
- supported search controls are Simple Paged Results, Server Side Sorting, and Virtual List View
- additionally to the well known scopes (
base,one, andsub) thesubordinate_subtree(3) scope is supported — it indicates that any subordinate entries (to any depth) below the entry specified by the base DN should be considered, but the base entry itself should not be considered, as described in draft-sermersheim-ldap-subordinate-scope - additionally to the well known filters (
and,or,not,equality,substring,greaterOrEqual,lessOrEqual, andpresent) the two following filters are supported:approximate: used to determine whether an entry contains at least one value for a specified attribute that is approximately equal to a given value — for example, a filter of(givenName~=John)will match entries withgivenNamevalues of eitherJohnorJon.extensible dn match: used to determine whether an entry contains at least one value for a specified attribute that matches a given value, where the match is based on the DN of the entry — for example, a filter of(ou:dn:=Engineering)will match entries with anouattribute value ofEngineeringthat are subordinate to the base DN.
- the
etagattribute is based on the values of the observed attributes — if any of the observed attributes change, theetagwill change - all other operations will be forwarded to the source LDAP server
- detailed metrics are available via the prometheus endpoint
- to only use channels (eg load balancing) start the application with one of the following options:
- the
--readonly(-r) flag IDENTITY_SCRIBE_READONLY=1,IDENTITY_SCRIBE_READONLY=true, orIDENTITY_SCRIBE_READONLY=yesenvironment variableIDENTITY_SCRIBE_TRANSCRIBE_ENABLED=0,IDENTITY_SCRIBE_TRANSCRIBE_ENABLED=false, orIDENTITY_SCRIBE_TRANSCRIBE_ENABLED=noenvironment variable
- the
Fixes
- do not emit events with empty operations
- auto-generated table partitions are now created with the correct range (off-by-one error)
- renaming an entry now correctly updates the naming attributes values
- all enviroment variables can now be set either via system environment variables with prefix
IDENTITY_SCRIBE_<...>or using command line properties-D<...>— for exampleIDENTITY_SCRIBE_READONLY=1 identity-scribeoridentity-scribe -DREADONLY=1 - issued licenses are now valid when used with clustered LDAP servers