From 42e88f303a18128d283b211692f865fe584cf5f1 Mon Sep 17 00:00:00 2001 From: Simran Kumari <60690997+simranquirky@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:19:53 +0530 Subject: [PATCH 1/6] fixed title (#174) Co-authored-by: simranquirky --- docs/api/user/add_user.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/user/add_user.md b/docs/api/user/add_user.md index 731da2fd..deddc354 100644 --- a/docs/api/user/add_user.md +++ b/docs/api/user/add_user.md @@ -3,7 +3,7 @@ description: >- Add an existing user to an OpenObserve organization with a specified role using a simple POST request. Supports admin and user roles. --- -# Add exiting user to org +# Add existing user to org Endpoint: `POST /api/{organization}/users/{user_email}` From 9339221bef6cd51a199e0b29a2570fc3ee375c95 Mon Sep 17 00:00:00 2001 From: Debashis Borgohain Date: Thu, 25 Sep 2025 13:14:46 +0530 Subject: [PATCH 2/6] update management and environment variables docs (#166) * update docs under management - Query Management - Streaming Search - Aggregation Cache * update the env variables page * document the deprecation of etcd * update the environment variables page --- docs/environment-variables.md | 752 +++++++++++++++++- .../enable-disable-streaming-search.png | Bin 167135 -> 153658 bytes docs/operator-guide/etcd.md | 8 +- docs/operator-guide/etcd_restore.md | 2 +- .../user-guide/management/query-management.md | 169 ++-- 5 files changed, 813 insertions(+), 118 deletions(-) diff --git a/docs/environment-variables.md b/docs/environment-variables.md index 5fe0f32f..9ba6481b 100644 --- a/docs/environment-variables.md +++ b/docs/environment-variables.md @@ -3,11 +3,680 @@ description: >- Configure OpenObserve with flexible environment variables for roles, storage, performance, and scaling across open source and enterprise deployments. --- -> Applicable to open source & enterprise version +> Applicable to both Open Source and Enterprise editions. -OpenObserve is configured through the use of below environment variables. +OpenObserve is configured using the following environment variables. -## Common +## Basic Configuration +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_ROOT_USER_EMAIL | - | Email ID of the root user. | +| ZO_ROOT_USER_PASSWORD | - | Password for the root user. | +| ZO_LOCAL_MODE | true | If local mode is set to true, OpenObserve becomes single node deployment.If it is set to false, it indicates cluster mode deployment which supports multiple nodes with different roles. For local mode one needs to configure SQLite DB, for cluster mode one needs to configure PostgreSQL (recommended) or MySQL. | +| ZO_LOCAL_MODE_STORAGE | disk | Applicable only for local mode. By default, local disk is used as storage. OpenObserve supports both disk and S3 in local mode. | +| ZO_NODE_ROLE | all | Node role assignment. Possible values are ingester, querier, router, compactor, alertmanager, and all. A single node can have multiple roles by specifying them as a comma-separated list. For example, compactor, alertmanager. | +| ZO_NODE_HEARTBEAT_TTL | 30 | Time-to-live (TTL) for node heartbeats in seconds. | +| ZO_INSTANCE_NAME | - | In the cluster mode, each node has a instance name. Default is instance hostname. | +| ZO_CLUSTER_COORDINATOR | nats | Defines how nodes in the cluster discover each other. | +| ZO_APP_NAME | openobserve | Application name for the OpenObserve instance. | + +## Network and Communication +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_HTTP_PORT | 5080 | Port number on which the OpenObserve server listens for HTTP requests. | +| ZO_HTTP_ADDR | | IP address on which the OpenObserve server listens for HTTP requests. | +| ZO_HTTP_IPV6_ENABLED | false | Set this to true to enable IPv6 support for HTTP. | +| ZO_HTTP_WORKER_NUM | 0 | Number of threads for HTTP services. Default is equal to the number of CPU cores (cpu_num). | +| ZO_HTTP_WORKER_MAX_BLOCKING | 1024 | Maximum number of blocking connections allowed per HTTP thread. | +| ZO_GRPC_PORT | 5081 | Port number on which the OpenObserve server listens for gRPC requests. | +| ZO_GRPC_ADDR | | IP address on which the OpenObserve server listens for gRPC requests. | +| ZO_GRPC_ORG_HEADER_KEY | openobserve-org-id | Header key for sending organization information in traces using OTLP over gRPC. | +| ZO_GRPC_STREAM_HEADER_KEY | stream-name | Header key for sending stream name information in traces using OTLP over gRPC. | +| ZO_GRPC_MAX_MESSAGE_SIZE | 16 | Maximum gRPC message size in MB. Default is 16 MB. | +| ZO_GRPC_CONNECT_TIMEOUT | 5 | Timeout in seconds for connecting to the gRPC server. | +| ZO_ROUTE_TIMEOUT | 600 | Timeout value for the router node in seconds. | +| ZO_ROUTE_MAX_CONNECTIONS | 1024 | Sets the maximum number of simultaneous connections per type of scheme for the Router node role. | + + +## Data Storage and Directories +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_DATA_DIR | ./data/openobserve/ | Defaults to "data" folder in current working directory if not provided. | +| ZO_DATA_DB_DIR | ./data/openobserve/db/ | Directory for storing the metadata database locally. | +| ZO_DATA_WAL_DIR | ./data/openobserve/wal/ | Directory for storing Write-Ahead Log (WAL) data. | +| ZO_DATA_STREAM_DIR | ./data/openobserve/stream/ | Directory for storing stream data locally. Applicable only in local mode. | +| ZO_DATA_IDX_DIR | | Local WAL Idx directory. | + + +## Ingestion and Schema Management +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_COLS_PER_RECORD_LIMIT | 1000 | Maximum number of fields allowed per record during ingestion. Records with more fields than this limit are discarded. | +| ZO_WIDENING_SCHEMA_EVOLUTION | true | If set to false, user can add new columns to the ingested data, but changes to existing column data types are not supported. | +| ZO_SKIP_SCHEMA_VALIDATION | false | By default, every ingested record is validated against the schema. If the schema is fixed, validation can be skipped to double ingestion performance. | +| ZO_ALLOW_USER_DEFINED_SCHEMAS | false | When set to true, allows users to define user-defined schemas for a stream. | +| ZO_SKIP_FORMAT_STREAM_NAME | false | When set to true, it skips formatting stream name while ingestion. | +| ZO_CONCATENATED_SCHEMA_FIELD_NAME | _all | Field name where all fields, after applying user-defined schema rules and flattening, are stored as a single field. The default value is _all. For example, if the processed data is {a:5, b:"abc"}, an additional field _all is added as {a:5, b:"abc", _all:"{a:5,b:"abc"}"}. This field is used for full-text search, allowing match_all queries to run across all data instead of being limited to a single field. | +| ZO_INGEST_ALLOWED_UPTO | 5 | Discards events older than the specified number of hours. By default, OpenObserve accepts data only if it is not older than 5 hours from the current ingestion time. | +| ZO_INGEST_ALLOWED_IN_FUTURE | 24 | Discards events dated beyond the specified number of future hours. By default, OpenObserve accepts data only if it is not timestamped more than 24 hours into the future. | +| ZO_INGEST_BUFFER_QUEUE_NUM | 5 | Number of queues to buffer ingestion requests. ZO_FEATURE_INGEST_BUFFER_ENABLED must be true | +| ZO_INGEST_FLATTEN_LEVEL | 3 | The level of flatten ingestion json data, if you want flatten everything you can simple set it to 0, or you can set it to N to limit the flatten level. | +| ZO_FEATURE_INGEST_BUFFER_ENABLED | false | Enables ingestion requests to be enqueued for background processing, improving responsiveness of ingestion endpoints. | +| ZO_INGEST_BLOCKED_STREAMS | - | Comma-separated list of streams blocked from ingestion. | +| ZO_FORMAT_STREAM_NAME_TO_LOWERCASE | true | Converts stream names to lowercase. | +| ZO_MEM_TABLE_STREAMS | - | Comma-separated list of streams that use dedicated MemTables. | +| ZO_INGEST_DEFAULT_HEC_STREAM | - | Default stream used for HEC ingestion. | + + +## File Management, WAL, and Memtable +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_MAX_FILE_SIZE_ON_DISK | 64 | Maximum WAL log file size in MB before creating a new log file. Default is 64 MB. WAL files are created per organization and stream type. | +| ZO_MAX_FILE_SIZE_IN_MEMORY | 256 | Maximum memtable size in MB before it becomes immutable and is written to disk. Default is 256 MB. | +| ZO_MAX_FILE_RETENTION_TIME | 600 | Maximum retention time in seconds for a WAL log file or memtable. Default is 600 seconds (10 minutes). When this limit is reached, a new WAL file is created and the memtable is written to disk. | +| ZO_FILE_PUSH_INTERVAL | 60 | Interval in seconds at which WAL files are moved to storage. Default is 60 seconds. | +| ZO_FILE_PUSH_LIMIT | 0 | Maximum number of WAL files that can be pushed to storage in a single cycle. | +| ZO_FILE_MOVE_THREAD_NUM | - | Number of threads used by the ingester to move WAL files to storage. Default equals the number of CPU cores. | +| ZO_MEM_DUMP_THREAD_NUM | - | Number of threads used by the ingester to dump memtables to disk. Default equals the number of CPU cores. | +| ZO_FILE_MERGE_THREAD_NUM | - | Number of threads used by the compactor to merge WAL files to storage. Default equals the number of CPU cores. | +| ZO_FILE_MOVE_FIELDS_LIMIT | 2000 | Field count threshold per WAL file. If exceeded, merging is skipped on the ingester. | +| ZO_MEM_TABLE_MAX_SIZE | 0 | Total size limit of all memtables. Multiple memtables exist for different organizations and stream types. Each memtable cannot exceed ZO_MAX_FILE_SIZE_IN_MEMORY, and the combined size cannot exceed this limit. If exceeded, the system returns a MemoryTableOverflowError to prevent out-of-memory conditions. Default is 50 percent of total memory. | +| ZO_MEM_PERSIST_INTERVAL | 5 | Interval in seconds at which immutable memtables are persisted from memory to disk. Default is 5 seconds. | + + +## Indexing +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_FEATURE_FULLTEXT_EXTRA_FIELDS | - | Automatically enables global full-text indexing on the specified fields if they exist in the ingested log data. By default, OpenObserve applies full-text indexing to the following global fields: log, message, msg, content, data, and JSON. Example: field1,field2 | +| ZO_FEATURE_INDEX_EXTRA_FIELDS | - | Automatically enables global secondary indexing on the specified fields if they exist in the ingested log data. Example: field1,field2 | +| ZO_FEATURE_QUERY_PARTITION_STRATEGY | file_num | Query partition strategy. Possible values are file_num, file_size, file_hash. | +| ZO_ENABLE_INVERTED_INDEX | true | Enables inverted index creation. | + +## Compaction and Data Retention +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_COMPACT_ENABLED | true | Enables compact for small files. | +| ZO_COMPACT_INTERVAL | 60 | The interval at which job compacts small files into larger files. default is 60s, unit: second | +| ZO_COMPACT_MAX_FILE_SIZE | 256 | Max file size for a single compacted file, after compaction all files will be below this value. Default is 256MB, unit: MB | +| ZO_COMPACT_DATA_RETENTION_DAYS | 3650 | Data retention days, default is 10 years. Minimal 3. eg: 30, it means will auto delete the data older than 30 days. You also can set data retention for stream in the UI. | +| ZO_COMPACT_SYNC_TO_DB_INTERVAL | 1800 | The interval time in seconds after which compactor sync cache to db is run. | +| ZO_COMPACT_DELETE_FILES_DELAY_HOURS | 2 | The number of hours to delay to delete the pending deleted files by compactor. Value can not be less than 1. | +| ZO_COMPACT_DATA_RETENTION_HISTORY | false | When enabled, this will move the file_list into file_list_history and not delete files from storage. | +| ZO_COMPACT_BLOCKED_ORGS | | Use comma to split multiple orgs. Blocked organizations will not be able to ingest data | +| ZO_COMPACT_FAST_MODE | true |Enables fast compaction mode. Uses more memory but improves performance. Disabling reduces memory usage by about 50 percent. | +| ZO_COMPACT_OLD_DATA_INTERVAL | 3600 | Interval to compact old data in seconds. | +| ZO_COMPACT_STRATEGY | file_time | Compaction strategy. Allowed values are file_size, file_time, time_range. | +| ZO_COMPACT_EXTENDED_DATA_RETENTION_DAYS | 3650 | Extended data retention period in days. | +| ZO_COMPACT_OLD_DATA_STREAMS | - | Comma-separated stream list to treat as old data. | +| ZO_COMPACT_OLD_DATA_MAX_DAYS | 7 | Maximum age of data to qualify as old in days. | +| ZO_COMPACT_OLD_DATA_MIN_HOURS | 2 | Minimum age of data to qualify as old in hours. | +| ZO_COMPACT_OLD_DATA_MIN_RECORDS | 100 | Minimum record count to compact old data. | +| ZO_COMPACT_OLD_DATA_MIN_FILES | 10 | Minimum file count to compact old data. | +| ZO_COMPACT_BATCH_SIZE | 0 | Batch size for fetching pending compaction jobs. | +| ZO_COMPACT_JOB_RUN_TIMEOUT | 600 | Time limit for one compaction job in seconds. Jobs that exceed this time are marked as failed. | +| ZO_COMPACT_JOB_CLEAN_WAIT_TIME | 7200 | Minimum age of finished jobs before cleanup in seconds. | +| ZO_COMPACT_PENDING_JOBS_METRIC_INTERVAL | 300 | Interval to publish pending job metrics in seconds. | +| ZO_COMPACT_MAX_GROUP_FILES | 10000 | Maximum number of files allowed in a compaction group. | + +## UI and Web +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_UI_SQL_BASE64_ENABLED | false | Enable base64 encoding for SQL in UI. | +| ZO_WEB_URL | - | UI access URL. For example, http://localhost:5080 is used as redirect URL and alert URL. | +| ZO_BASE_URI | - | If OpenObserve is hosted under a subpath, set the path prefix. Use this for deployments with a Kubernetes NGINX ingress or any reverse proxy that serves OpenObserve under a subpath such as www.example.com/openobserve. | +| ZO_SWAGGER_ENABLED | true | Generate SWAGGER API documentation by default. | + +## Dashboard +| Environment Variable | Default Value | Description | +| ------------------------------------ | ------------- | ------------------------------------------------- | +| ZO_DASHBOARD_SHOW_SYMBOL_ENABLED | false | Shows the symbol selector in dashboards. | +| ZO_DASHBOARD_PLACEHOLDER | `_o2_all_` | Placeholder stream name used in dashboards. | +| ZO_MIN_AUTO_REFRESH_INTERVAL | 5 | Minimum allowed auto refresh interval in seconds. | + +## Payload Limits +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_JSON_LIMIT | 209715200 | The max payload size of JSON. | +| ZO_PAYLOAD_LIMIT | 209715200 | The max payload size of http request body. | + +## Actix Server +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_ACTIX_REQ_TIMEOUT | 30 | Sets actix server client timeout in seconds for first request. | +| ZO_ACTIX_KEEP_ALIVE | 30 | Sets actix server keep-alive preference in seconds. | +| ZO_ACTIX_SHUTDOWN_TIMEOUT | | Sets timeout for graceful worker shutdown of actix workers. | + +## Cookies +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_COOKIE_SAME_SITE_LAX | true | If true, same site "lax" cookie is set by the server while authentication. | +| ZO_COOKIE_SECURE_ONLY | false | If true, secure flag is enabled for the cookie set by the server while authentication. | + +## Telemetry and Monitoring +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_TELEMETRY | true | Sends anonymous telemetry data to help improve OpenObserve. Set to false to disable telemetry. | +| ZO_TELEMETRY_URL | https://e1.zinclabs.dev | OpenTelemetry report URL. You can report to your own server. | +| ZO_HEARTBEAT_INTERVAL | 30 | OpenTelemetry report frequency. Default is 30 minutes | +| ZO_PROMETHEUS_ENABLED | false | Enables prometheus metrics on /metrics endpoint | +| ZO_CALCULATE_STATS_INTERVAL | 600 | In seconds. How often stream stats (total size) is calculated | + +## File Retention +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_LOGS_FILE_RETENTION | hourly | Default time partition level for log streams. Supported values are hourly and daily. | +| ZO_TRACES_FILE_RETENTION | hourly | Default time partition level for trace streams. Supported values are hourly and daily. | +| ZO_METRICS_FILE_RETENTION | daily | Default time partition level for metric streams. Supported values are hourly and daily. | + +## Metrics +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_METRICS_DEDUP_ENABLED | true | Enable de-duplication for metrics | +| ZO_METRICS_LEADER_PUSH_INTERVAL | 15 | Interval at which current leader information is updated to metadata store , default 15s, unit: second | +| ZO_METRICS_LEADER_ELECTION_INTERVAL | 30 | Interval after which new leader for metrics will be elected, when data is not received from current leader, default: 30, unit: second. | +| ZO_SELF_METRIC_CONSUMPTION_ENABLED | false | Self-consumption metrics generated by OpenObserve. | +| ZO_SELF_METRIC_CONSUMPTION_INTERVAL | 60 | Interval in seconds for self-consumption of metrics. | +| ZO_SELF_METRIC_CONSUMPTION_ACCEPTLIST | - | Comma-separated list of metrics to self-consume. | + + +## Distinct Values +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_DISTINCT_VALUES_INTERVAL | 10s | Controls how often distinct values for a stream are written from memory to disk. Distinct values are automatically collected when data is ingested. Instead of writing every value to disk immediately, the system waits for this interval. This prevents the system from frequently writing very small chunks of data to disk. Example: If the interval is 10 seconds, distinct values ingested within that 10-second window are combined and written once. | +| ZO_DISTINCT_VALUES_HOURLY | false | Enables additional deduplication at an hourly level. When enabled, distinct values that repeat within the same hour are merged again, and the system logs a count instead of storing duplicate entries. The collected distinct values are stored in a special stream named distinct_values. Example: Suppose request IDs 123 appear multiple times in one hour. Instead of separate entries, they are merged into one record like: request_id: 123, count: 3 | + +## Alerts and Reports +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_ALERT_SCHEDULE_INTERVAL | 10s | Defines how often the alert manager checks for scheduled jobs such as alerts, reports, or scheduled pipelines. The default value is 10 seconds. This means the alert manager fetches and processes alerts, reports, and pipelines every 10 seconds. | +| ZO_ALERT_SCHEDULE_TIMEOUT | 90 | The maximum expected time duration in seconds within which the processing of alert by the alert manager should be complete. If the processing of the alert is not complete within the timeframe, the alert will become available again for other alert managers to pick. | +| ZO_SCHEDULER_WATCH_INTERVAL | 30 | The scheduler frequently watches if there are any scheduled jobs which are in processing state for more than the `ZO_ALERT_SCHEDULE_TIMEOUT`/`ZO_REPORT_SCHEDULE_TIMEOUT`, if so it increases their `retries` field by 1 and marks them as available for processing again by alert managers. | +| ZO_ALERT_SCHEDULE_CONCURRENCY | 5 | The number of scheduled jobs the the alert manager will pull at a time from the scheduler for processing | +| ZO_CHROME_ENABLED | false | When true, it looks for chromium executable. Required for dashboard reports. | +| ZO_CHROME_PATH | - | If chrome is enabled, custom chrome executable path can be specified. If not specified, it looks for chrome executable in default locations. If still not found, it automatically downloads a good known version of chromium. | +| ZO_CHROME_CHECK_DEFAULT_PATH | true | If false, it skips default locations (e.g. CHROME env, usual chrome file path etc.) when looking for chrome executable. | +| ZO_CHROME_NO_SANDBOX | false | If true, it launches chromium in no-sandbox environment. | +| ZO_CHROME_SLEEP_SECS | 20 | Specify the number of timeout seconds the headless chrome will wait until all the dashboard data is loaded. | +| ZO_CHROME_WITH_HEAD | false | If true, it launches the chromium browser in non-headless mode. | +| ZO_CHROME_WINDOW_WIDTH | 1370 | Specifies the width of the headless chromium browser. | +| ZO_CHROME_WINDOW_HEIGHT | 730 | Specifies the height of the headless chromium browser. | +| ZO_CHROME_AUTO_DOWNLOAD | false | Only used by the report-server. If true, the report-server automatically downloads a good known version of chromium if chromium is not found in the system. **Note:** If auto download of chromium is desired, make sure that the system has all the required dependency libraries of chromium already installed. | +| ZO_SCHEDULER_MAX_RETRIES | 3 | The maximum number of times the scheduler will retry processing the alert/report. If exceeded, the scheduler will skip to the next trigger time of the alert/report. | +| ZO_SCHEDULER_CLEAN_INTERVAL | 30 | The interval in seconds after which the scheduler will clean up the completed scheduled jobs. | +| ZO_REPORT_USER_NAME | | The username that will be used by the headless chromium to login into openobserve and generate report. | +| ZO_REPORT_USER_PASSWORD | | The password that will be used by the headless chromium to login into openobserve and generate report. | +| ZO_ENABLE_EMBEDDED_REPORT_SERVER | false | If true, the alert manager (for which this ENV is enabled) spawns a new report-server running on PORT `5082` (default, can be changed through `ZO_REPORT_SERVER_HTTP_PORT`). | +| ZO_REPORT_SERVER_HTTP_PORT | `5082` | The port used by the newly spawned report-server. | +| ZO_REPORT_SERVER_HTTP_ADDR | `127.0.0.1` | The ip address used by the newly spawned report-server. | +| ZO_REPORT_SERVER_URL | `localhost:5082` | The report server server URL. E.g. - `https://report-server.example.com/api`. | +| ZO_REPORT_SERVER_SKIP_TLS_VERIFY | false| If true, it will skip tls verification while making request to report-server from alert manager. | + +## Enrichment Tables +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_ENRICHMENT_TABLE_LIMIT | 256 | Controls the maximum size of an enrichment table. If the enrichment table exceeds this limit, you cannot append additional records. OpenObserve returns an error when the size threshold is reached. | +| ZO_ENRICHMENT_TABLE_CACHE_DIR | - | Local cache directory for enrichment tables. | +| ZO_ENRICHMENT_TABLE_MERGE_THRESHOLD_MB | 60 | Size threshold to merge small files before uploading to S3 in megabytes. | +| ZO_ENRICHMENT_TABLE_MERGE_INTERVAL | 600 | Background sync and merge interval in seconds. | + +## File List Dump +| Environment Variable | Default Value | Description | +| ---------------------------------- | ------------- | ------------------------------------------- | +| ZO_FILE_LIST_DUMP_ENABLED | false | Enables file list dump. | +| ZO_FILE_LIST_DUMP_DUAL_WRITE | true | Enables dual write for file list dump. | +| ZO_FILE_LIST_DUMP_MIN_HOUR | 2 | Minimum hour of day to run file list dump. | +| ZO_FILE_LIST_DUMP_DEBUG_CHECK | true | Enables debug checks during file list dump. | + +## Queue +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_QUEUE_STORE | | Set to "nats" to enable internal queuing through NATS for coordinating rate limiting. | + + +## Query Execution and Optimization +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_UTF8_VIEW_ENABLED | true | When set to true , this environment variable activates DataFusion's StringView optimization in OpenObserve, which automatically converts UTF8 string fields to the more efficient UTF8View data type during query processing. | +| ZO_SEARCH_INSPECTOR_ENABLED | false | Controls search inspector feature for detailed search operation tracing. When enabled, tracks search operations with trace_id and generates extensive logs for debugging. | + + +## Logs + Environment Variable | Default Value | Description | +| ---------------------------- | -------------------------------------------- | ------------------------------------------------------------------------- | +| ZO_LOG_JSON_FORMAT | false | Emits logs in JSON format. | +| ZO_LOG_FILE_DIR | - | Directory for log files. | +| ZO_LOG_FILE_NAME_PREFIX | - | Prefix for log file names. | +| ZO_LOG_LOCAL_TIME_FORMAT | - | Local timestamp format for logs. Use a strftime-compatible format string. | +| ZO_EVENTS_ENABLED | false | Enables internal debug events publishing. | +| ZO_EVENTS_AUTH | cm9vdEBleGFtcGxlLmNvbTpUZ0ZzZFpzTUZQdzg2SzRK | Basic authentication value used for events publishing. | +| ZO_EVENTS_BATCH_SIZE | 10 | Number of events per publish batch. | +| ZO_PRINT_KEY_CONFIG | false | Print key config information in logs. | +| ZO_PRINT_KEY_SQL | false | Print key sql in logs. | +| RUST_LOG | info | Log level, also supports: error, warn, info, debug, trace. | +| ZO_FEATURE_QUICK_MODE_FIELDS | - | Comma-separated list of field names to use when quick mode is enabled. Overrides the default quick mode fields. | + +## Caching + +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_DATA_CACHE_DIR | ./data/openobserve/cache/ | local query cache storage directory, applicable only for cluster mode. | +| ZO_MEMORY_CACHE_ENABLED | true | enable in-memory caching for files, default is true, the latest files are cached for accelerated queries. | +| ZO_CACHE_LATEST_FILES_ENABLED | false | Enables or disables latest file caching. | +| ZO_CACHE_LATEST_FILES_PARQUET | true | Enables caching of latest parquet files. | +| ZO_CACHE_LATEST_FILES_INDEX | true | Enables caching of index files. | +| ZO_CACHE_LATEST_FILES_DELETE_MERGE_FILES | false | Controls whether merged files should be deleted from cache. | +| ZO_CACHE_LATEST_FILES_DOWNLOAD_FROM_NODE | false | Downloads latest files from a peer node instead of object storage. | +| ZO_CACHE_LATEST_FILES_DOWNLOAD_NODE_SIZE | 100 | Threshold size in megabytes for node to node download. | +| ZO_MEMORY_CACHE_SKIP_DISK_CHECK | false | Skips free disk space checks during cache operations. | +| ZO_DISK_RESULT_CACHE_MAX_SIZE | 0 | Maximum disk cache size for query results in megabytes. | +| ZO_DISK_AGGREGATION_CACHE_MAX_SIZE | 0 | Maximum disk cache size for aggregation results in megabytes. | +| ZO_DISK_CACHE_MULTI_DIR | - | Comma-separated list of disk cache directories. When set, OpenObserve uses multiple directories for the disk cache. For example, ZO_DISK_CACHE_MULTI_DIR: "ssdpvc1,ssdpvc2" | +| ZO_DISK_CACHE_GC_SIZE | 100 | Amount of data to release during disk cache garbage collection in megabytes. | +| ZO_DISK_CACHE_GC_INTERVAL | 60 | Interval to check whether the disk cache is full and to run garbage collection in seconds. | +| ZO_SCHEMA_CACHE_COMPRESS_ENABLED | - | Removed. No longer supported. | +| ZO_DISK_CACHE_BUCKET_NUM | 0 | Disk data cache bucket num, multiple bucket means multiple locker, default is 0 | +| ZO_DISK_CACHE_ENABLED | true | Enable in-disk caching for files, default is true, the latest files are cached for accelerated queries. when the memory cache is not enough will try to cache in local disk, you can consider the memory cache is first level, disk cache is second level. | +| ZO_DISK_CACHE_MAX_SIZE | - | Default 50% of the total free disk for in-disk cache, one can set it to desired amount unit: MB | +| ZO_DISK_CACHE_SKIP_SIZE | - | Default 80% of the total disk cache size, A query will skip disk cache if it need more than this value. one can set it to desired amount unit: MB | +| ZO_DISK_CACHE_RELEASE_SIZE | - | Default drop 1% entries from in-disk cache as cache is full, one can set it to desired amount unit: MB | +| ZO_DISK_CACHE_STRATEGY | lru | Disk data cache strategy, values are lru, time_lru, fifo | + + +## HTTP TLS +| Environment Variable | Default Value | Description | +| --------------------------------- | ------------- | ------------------------------------------------------------------------------------------------- | +| ZO_HTTP_TLS_ENABLED | false | Enables TLS for HTTP. | +| ZO_HTTP_TLS_CERT_PATH | - | Path to the TLS certificate file for HTTP. | +| ZO_HTTP_TLS_KEY_PATH | - | Path to the TLS key file for HTTP. | +| ZO_HTTP_TLS_MIN_VERSION | - | Minimum TLS version for HTTP. Supported values are 1.2 or 1.3. Empty uses all supported versions. | +| ZO_HTTP_TLS_ROOT_CERTIFICATES | webpki | Root certificate store to use. Supported values are webpki and native. | + +## gRPC TLS and Authentication +| Environment Variable | Default Value | Description | +| ---------------------------------- | ------------- | ------------------------------------------ | +| ZO_INTERNAL_GRPC_TOKEN | - | Internal gRPC authentication token. | +| ZO_GRPC_CHANNEL_CACHE_DISABLED | false | Disables the gRPC channel cache. | +| ZO_GRPC_TLS_ENABLED | false | Enables TLS for gRPC. | +| ZO_GRPC_TLS_CERT_DOMAIN | - | Expected TLS server name for gRPC. | +| ZO_GRPC_TLS_CERT_PATH | - | Path to the TLS certificate file for gRPC. | +| ZO_GRPC_TLS_KEY_PATH | - | Path to the TLS key file for gRPC. | + + +## Router +| Environment Variable | Default Value | Description | +| -------------------- | ------------- | ------------------------------------------------------------ | +| ZO_ROUTE_STRATEGY | workload | Dispatch strategy. Supported values are workload and random. | + + +## Authentication +| Environment Variable | Default Value | Description | +| ------------------------- | ------------- | -------------------------------------- | +| ZO_ROOT_USER_TOKEN | - | Root user token. | +| ZO_CLI_USER_COOKIE | - | Cookie value used by the CLI user. | +| ZO_COOKIE_MAX_AGE | 2592000 | Cookie max age in seconds. | +| ZO_EXT_AUTH_SALT | openobserve | Salt used for external authentication. | +| O2_ACTION_SERVER_TOKEN | - | Token used by the action server. | + +## NATS +| Environment Variable | Default Value | Description | +| -------------------------- | ------------- | ------------------------------------------------------------------------------------- | +| ZO_NATS_ADDR | `localhost:4222` |NATS server address - If not stated explicitly the `nats://` schema and port `4222` is assumed.| +| ZO_NATS_PREFIX | `o2_` | NATS prefix for openobserve. | +| ZO_NATS_USER | - | NATS user name. | +| ZO_NATS_PASSWORD | - | NATS user password. | +| ZO_NATS_REPLICAS | 3 | Number of replicas for NATS. | +| ZO_NATS_CONNECT_TIMEOUT | 5 | NATS connection timeout in seconds. | +| ZO_NATS_COMMAND_TIMEOUT | 10 | NATS command timeout in seconds. | +| ZO_NATS_LOCK_WAIT_TIMEOUT | 3600 | NATS lock wait timeout in seconds. | +| ZO_NATS_QUEUE_MAX_AGE | 60 | NATS queue maximum age in days. | +| ZO_NATS_HISTORY | 3 | Number of historical entries to keep in NATS key value buckets. | +| ZO_NATS_DELIVER_POLICY | all | Starting point in the stream for message delivery. Allowed values are all, last, new. | +| ZO_NATS_SUB_CAPACITY | 65535 | Maximum subscription capacity. | +| ZO_NATS_QUEUE_MAX_SIZE | 2048 | Maximum queue size in megabytes. | + + +## S3 and Object Storage +| Environment Variable | Default Value | Description | +| -------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ZO_S3_SERVER_URL | - | Default for aws s3 & leave it empty, but for `minIO`, `gcs` one should configure it. | +| ZO_S3_REGION_NAME | - | Region name | +| ZO_S3_ACCESS_KEY | - | Access key | +| ZO_S3_SECRET_KEY | - | Secret key | +| ZO_S3_BUCKET_NAME | - | Bucket name | +| ZO_S3_BUCKET_PREFIX | - | You can store data in a sub directory, like: `openobserve/` | +| ZO_S3_PROVIDER | s3 | S3 provider name, like: aws, gcs, gcp, oss, minio, swift | +| ZO_S3_FEATURE_FORCE_HOSTED_STYLE | false | Feature: `force_hosted_style`, default enable for provider `minio` and `swift`. | +| AWS_EC2_METADATA_DISABLED | false | Feature, default enable for `swift`. | +| ZO_S3_FEATURE_BULK_DELETE | false | Enables bulk deletion of streams in object stores that support stream deletion. If your object store supports stream delete, you can enable this variable. AWS S3 and Azure ObjectStore are known to support it. When set to **true**, OpenObserve issues a single operation to delete all files under the stream’s storage prefix, reducing deletion time and API usage. | +| ZO_S3_ACCOUNTS | - | Comma-separated list of account identifiers. | +| ZO_S3_STREAM_STRATEGY | - | Stream to account selection strategy. Empty uses the default account. Other values are file_hash, stream_hash, and explicit mappings in the form stream1:account1. | +| ZO_S3_CONNECT_TIMEOUT | 10 | Connect timeout in seconds. | +| ZO_S3_REQUEST_TIMEOUT | 3600 | Request timeout in seconds. | +| ZO_S3_ALLOW_INVALID_CERTIFICATES | false | Allows invalid TLS certificates. | +| ZO_S3_SYNC_TO_CACHE_INTERVAL | 600 | Interval to sync object storage state to cache in seconds. | +| ZO_S3_MAX_RETRIES | 10 | Maximum number of retries for S3 operations. | +| ZO_S3_MAX_IDLE_PER_HOST | 0 | Maximum idle connections per host. | +| ZO_S3_CONNECTION_KEEPALIVE_TIMEOUT | 20 | Keepalive timeout in seconds for S3 connections. | +| ZO_S3_MULTI_PART_UPLOAD_SIZE | 100 | File size threshold for switching to multi part upload in megabytes. | +| ZO_S3_FEATURE_HTTP1_ONLY | false | Uses HTTP 1 only for S3 client connections. | +| ZO_S3_FEATURE_HTTP2_ONLY | false | Uses HTTP 2 only for S3 client connections. | + +## SNS +| Environment Variable | Default Value | Description | +| --------------------------- | ------------- | ----------------------------- | +| ZO_SNS_ENDPOINT | - | SNS endpoint URL. | +| ZO_SNS_CONNECT_TIMEOUT | 10 | Connect timeout in seconds. | +| ZO_SNS_OPERATION_TIMEOUT | 30 | Operation timeout in seconds. | + +## Real User Monitoring (RUM) +| Environment Variable | Default Value | Description | +| --------------------------------- | ------------- | ------------------------------------ | +| ZO_RUM_ENABLED | false | Enables Real User Monitoring. | +| ZO_RUM_CLIENT_TOKEN | - | Client token used by the RUM SDK. | +| ZO_RUM_APPLICATION_ID | - | RUM application identifier. | +| ZO_RUM_SITE | - | RUM site or domain. | +| ZO_RUM_SERVICE | - | Service name reported by RUM. | +| ZO_RUM_ENV | - | Environment name reported by RUM. | +| ZO_RUM_VERSION | - | Version string reported by RUM. | +| ZO_RUM_ORGANIZATION_IDENTIFIER | - | Organization identifier used by RUM. | +| ZO_RUM_API_VERSION | - | API version for RUM. | +| ZO_RUM_INSECURE_HTTP | false | Allows HTTP for RUM endpoints. | + + +## Pipeline +| Environment Variable | Default Value | Description | +| ------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| ZO_PIPELINE_REMOTE_STREAM_WAL_DIR | - | Directory for remote stream WAL files. Used to separate remote WAL from local WAL. | +| ZO_PIPELINE_REMOTE_STREAM_CONCURRENT_COUNT | 30 | Concurrent send count for remote stream WAL. | +| ZO_PIPELINE_OFFSET_FLUSH_INTERVAL | 10 | Interval to flush the sent offset for remote stream WAL in seconds. | +| ZO_PIPELINE_REMOTE_REQUEST_TIMEOUT | 600 | Request timeout for pipeline exporters in seconds. | +| ZO_PIPELINE_REMOTE_REQUEST_MAX_RETRY_TIME | 86400 | Maximum total retry time for pipeline exporters in seconds. | +| ZO_PIPELINE_WAL_SIZE_LIMIT | 0 | Data size limit for the pipeline WAL directory in MB. When set to zero the default is 50 percent of available local volume space. | +| ZO_PIPELINE_MAX_CONNECTIONS | 1024 | Maximum number of HTTP connections for the pipeline exporter client. | +| ZO_PIPELINE_BATCH_ENABLED | false | Enables batching of entries before sending HTTP requests. | +| ZO_PIPELINE_BATCH_SIZE | 100 | Maximum number of entries per batch. | +| ZO_PIPELINE_BATCH_TIMEOUT_MS | 1000 | Maximum time to wait for a batch to fill up in milliseconds. | +| ZO_PIPELINE_BATCH_SIZE_BYTES | 10485760 | Maximum batch size in bytes. | +| ZO_PIPELINE_BATCH_RETRY_MAX_ATTEMPTS | 3 | Maximum number of retry attempts for batch flush. | +| ZO_PIPELINE_BATCH_RETRY_INITIAL_DELAY_MS | 1000 | Initial delay for batch flush retries in milliseconds. | +| ZO_PIPELINE_BATCH_RETRY_MAX_DELAY_MS | 30000 | Maximum delay for batch flush retries in milliseconds. | +| ZO_PIPELINE_USE_SHARED_HTTP_CLIENT | false | Uses shared HTTP client instances to improve connection pooling. | +| ZO_PIPELINE_REMOVE_FILE_AFTER_MAX_RETRY | true | Removes the WAL file after reaching the maximum retry count. | +| ZO_PIPELINE_MAX_RETRY_COUNT | 10 | Maximum number of retries for pipeline exporters. | +| ZO_PIPELINE_MAX_RETRY_TIME_IN_HOURS | 24 | Maximum retry time for pipeline exporters in hours. | +| ZO_PIPELINE_MAX_FILE_SIZE_ON_DISK_MB | 128 | Maximum file size on disk for pipeline files in megabytes. | +| ZO_PIPELINE_MAX_FILE_RETENTION_TIME_SECONDS | 600 | Maximum retention time for pipeline files in seconds. | + +## Encryption +| Environment Variable | Default Value | Description | +| --------------------------------- | ------------- | --------------------------------------- | +| ZO_MASTER_ENCRYPTION_ALGORITHM | - | Master encryption algorithm identifier. | +| ZO_MASTER_ENCRYPTION_KEY | - | Master encryption key material. | + +## Health Check +| Environment Variable | Default Value | Description | +| -------------------------------- | ------------- | ------------------------------------------------------------------------------- | +| ZO_HEALTH_CHECK_ENABLED | true | Enables node health checks. | +| ZO_HEALTH_CHECK_TIMEOUT | 5 | Health check timeout in seconds. | +| ZO_HEALTH_CHECK_FAILED_TIMES | 3 | Removes the node from the consistent hash after this many consecutive failures. | + +## Search Group Resource Allocation +| Environment Variable | Default Value | Description | +| ------------------------------------------ | ------------- | -------------------------------------------------- | +| O2_SEARCH_GROUP_LONG_MAX_CPU | 0.8 | The percentage of CPU allocated to long queries | +| O2_SEARCH_GROUP_LONG_MAX_MEMORY | 0.8 | The percentage of memory allocated to long queries | +| O2_SEARCH_GROUP_LONG_MAX_CONCURRENCY | 2 | Maximum number of concurrent long queries. | +| O2_SEARCH_GROUP_SHORT_MAX_CPU | 0.2 | Percentage of CPU allocated to short queries. | +| O2_SEARCH_GROUP_SHORT_MAX_CONCURRENCY | 4 | Maximum number of concurrent short queries. | +| O2_SEARCH_GROUP_SHORT_MAX_MEMORY | 0.2 | Percentage of memory allocated to short queries. | + +## Organization Management +| Environment Variable | Default Value | Description | +| --------------------------------------------------- | ------------- | --------------------------------------------------------------------------- | +| ZO_USE_STREAM_SETTINGS_FOR_PARTITIONS_ENABLED | false | Uses stream settings for partitions for all streams. | +| ZO_ADDITIONAL_REPORTING_ORGS | - | Additional organizations included in reporting. | +| ZO_CREATE_ORG_THROUGH_INGESTION | true | Allows automatic organization creation through ingestion for the root user. | +| ZO_ORG_INVITE_EXPIRY | 7 | Number of days an invite token remains valid. | + + +## Elasticsearch Compatibility +| Environment Variable | Default Value | Description | +| --------------------- | ------------- | ------------------------------------- | +| ZO_FAKE_ES_VERSION | - | Fake Elasticsearch version to report. | +| ZO_ES_VERSION | - | Elasticsearch version to report. | +| ZO_BULK_RESPONSE_INCLUDE_ERRORS_ONLY | false | When using _bulk API which is compatible with Elasticsearch do not respond with records that succeeded. This allows for higher performance by returing smaller amount of data. | + + +## Prometheus Integration +| Environment Variable | Default Value | Description | +| ----------------------------- | ------------- | ---------------------------------------------- | +| ZO_DEFAULT_SCRAPE_INTERVAL | 15 | Default Prometheus scrape interval in seconds. | +| ZO_PROMETHEUS_HA_CLUSTER | cluster | For Prometheus cluster deduplication. | +| ZO_PROMETHEUS_HA_REPLICA | `__replica__` | For Prometheus cluster deduplication. | + +## Traces +| Environment Variable | Default Value | Description | +| ------------------------------------------- | ------------- | ----------------------------------------- | +| ZO_TRACES_SPAN_METRICS_ENABLED | false | Enables span metrics for traces. | +| ZO_TRACES_SPAN_METRICS_EXPORT_INTERVAL | 60 | Span metrics export interval in seconds. | +| ZO_TRACES_SPAN_METRICS_CHANNEL_BUFFER | 100000 | Buffer size for the span metrics channel. | +| ZO_TRACING_SEARCH_ENABLED | false | Enables tracing for search operations. | +| ZO_TRACING_ENABLED | false | enable it to send traces to remote trace server. | +| ZO_TRACING_HEADER_KEY | Authorization| Remote trace server endpoint authentication header key. | +| ZO_TRACING_HEADER_VALUE | - / e.g. Basic gjdsgfksgkfjgdskfgsdlfglsjdg | remote trace server endpoint authentication header value. | +| ZO_TRACING_SEARCH_ENABLED | false | Enables tracing for search operations. | +| OTEL_OTLP_HTTP_ENDPOINT | - / e.g. https://api.openobserve.ai/api/default | Remote trace server endpoint. | + +## Tokio Console +| Environment Variable | Default Value | Description | +| -------------------------------- | ------------- | --------------------------------------------------- | +| ZO_TOKIO_CONSOLE_SERVER_ADDR | 0.0.0.0 | Address for the Tokio console server. | +| ZO_TOKIO_CONSOLE_SERVER_PORT | 6699 | Port for the Tokio console server. | +| ZO_TOKIO_CONSOLE_RETENTION | 60 | Retention period in seconds for Tokio console data. | + +## Profiling +| Environment Variable | Default Value | Description | +| ---------------------------------- | ---------------------------------------------- | --------------------------------------------- | +| ZO_PROF_PPROF_ENABLED | false | Enables profiling with pprof-rs. | +| ZO_PROF_PPROF_PROTOBUF_ENABLED | false | Exports pprof-rs profiles in protobuf format. | +| ZO_PROF_PPROF_FLAMEGRAPH_PATH | - | Path to save flamegraph output. | +| ZO_PROF_PYROSCOPE_ENABLED | false | Enables profiling with pyroscope-rs. | +| ZO_PROF_PYROSCOPE_SERVER_URL | [http://localhost:4040](http://localhost:4040) | Pyroscope server URL. | +| ZO_PROF_PYROSCOPE_PROJECT_NAME | openobserve | Pyroscope project name. | + +## Tantivy Index +| Environment Variable | Default Value | Description | +| ----------------------------------------------------- | ------------- | ------------------------------------------------------------------------ | +| ZO_INVERTED_INDEX_RESULT_CACHE_ENABLED | false | Enables Tantivy result cache. | +| ZO_INVERTED_INDEX_OLD_FORMAT | false | Uses the old index format that generates the same stream name for index. | +| ZO_INVERTED_INDEX_CAMEL_CASE_TOKENIZER_DISABLED | false | Disables camel case tokenizer for inverted index. | +| ZO_INVERTED_INDEX_COUNT_OPTIMIZER_ENABLED | true | Enables inverted index count optimizer. | + + +## MaxMind GeoIP +| Environment Variable | Default Value | Description | +| -------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| ZO_MMDB_DISABLE_DOWNLOAD | true | By default, auto download of MMDB is disabled. To enable it, set this to false. | +| ZO_MMDB_DATA_DIR | ./data/openobserve/mmdb/ | Defines the local directory path where OpenObserve looks for MaxMind database files. | +| ZO_MMDB_UPDATE_DURATION_DAYS | 30 | Update interval for MMDB downloads in days. | +| ZO_MMDB_GEOLITE_CITYDB_URL | [https://geoip.zinclabs.dev/GeoLite2-City.mmdb](https://geoip.zinclabs.dev/GeoLite2-City.mmdb) | GeoLite City database URL. | +| ZO_MMDB_GEOLITE_ASNDB_URL | [https://geoip.zinclabs.dev/GeoLite2-ASN.mmdb](https://geoip.zinclabs.dev/GeoLite2-ASN.mmdb) | GeoLite ASN database URL. | +| ZO_MMDB_GEOLITE_CITYDB_SHA256_URL | [https://geoip.zinclabs.dev/GeoLite2-City.sha256](https://geoip.zinclabs.dev/GeoLite2-City.sha256) | GeoLite City database SHA-256 URL. | +| ZO_MMDB_GEOLITE_ASNDB_SHA256_URL | [https://geoip.zinclabs.dev/GeoLite2-ASN.sha256](https://geoip.zinclabs.dev/GeoLite2-ASN.sha256) | GeoLite ASN database SHA-256 URL. | + +## Meta Storage +| Environment Variable | Default Value | Description | +| ------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ZO_META_STORE | - | Default is sqlite for local mode, postgres or mysql for cluster mode. and supported values are: sqlite, postgres, mysql. Note that sqlite is supported only for local mode. | +| ZO_META_TRANSACTION_LOCK_TIMEOUT | 600 | Timeout (in seconds) of transaction lock in meta table. | +| ZO_META_TRANSACTION_RETRIES | 3 | Maximum time the transaction in the meta table will be retried. | +| ZO_META_POSTGRES_DSN | - | If you enable postgres as meta store, you need configure the database source address, like this: postgres://postgres:12345678@localhost:5432/openobserve | +| ZO_META_MYSQL_DSN | - | set this if you want to use MySQL as metadata and filelist store. | +| ZO_META_CONNECTION_POOL_MIN_SIZE | - | Minimum number of connections created in the connection pool size for postgres, sqlite, and mysql. Defaults to cpu_limits | +| ZO_META_CONNECTION_POOL_MAX_SIZE | - | Maximum number of connections created in the connection pool size for postgres, sqlite, and mysql. Defaults to `cpu_limits * 2` | + +> For local mode, OpenObserve use SQLite as the metadata store. +> For cluster mode, OpenObserve use PostgreSQL (recommended) or MySQL as the metadata store. + +## Bloom Filter +| Environment Variable | Default Value | Description | +| --------------------------------------- | ------------- | ------------------------------------------------------------------- | +| ZO_BLOOM_FILTER_ENABLED | true | Enable by default, but only enabled for trace_id field. | +| ZO_BLOOM_FILTER_DEFAULT_FIELDS | - | Add more fields support by bloom filter, will add UI setting later. | +| ZO_BLOOM_FILTER_DISABLED_ON_SEARCH | false | Disable bloom filter for search queries. | + +## Usage Reporting +| Environment Variable | Default Value | Description | +| ----------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ZO_USAGE_REPORTING_ENABLED | false | Enable usage reporting. This will start capturing how much data has been ingested across each org/stream. You can use this info to enable charge back for internal teams. | +| ZO_USAGE_ORG | meta | To which org the usage data should be sent. | +| ZO_USAGE_BATCH_SIZE | 2000 | How many requests should be batched before flushing the usage data from memory to disk. | +| ZO_USAGE_REPORTING_MODE | local | Local mode means the usage will be reported only in the internal cluster of ZO_USAGE_ORG. remote mode means that the usage reporting will be ingested to the remote target. both ingests the usage reports both to internal and remote target. | +| ZO_USAGE_REPORTING_URL | [http://localhost:5080/api/_meta/usage/_json](http://localhost:5080/api/_meta/usage/_json) | In case of remote or both value of ZO_USAGE_REPORTING_MODE, this URL is used to post the usage reports to remote target. | +| ZO_USAGE_REPORTING_CREDS | - | The credentials required to send along with the post request to the ZO_USAGE_REPORTING_URL. E.g. - Basic cm9vdEBleGFtcGxlLmNvbTpDb21wbGV4UGFzcyMxMjM=. | +| ZO_USAGE_PUBLISH_INTERVAL | 600 | Duration in seconds after the last reporting usage will be published. | + +## SMTP + +| Environment Variable | Default Value| Description | +| -------------------- | --------- | --------------------------------------------------------------------------- | +| ZO_SMTP_ENABLED | false | Indicates if smtp configuration is present. | +| ZO_SMTP_HOST | `localhost` | The SMTP host to connect to.| +| ZO_SMTP_PORT | 25 | The SMTP port to connect to. | +| ZO_SMTP_USER_NAME | | SMTP user name. `Required` when using smtp. | +| ZO_SMTP_PASSWORD | | SMTP user password. `Required` when using smtp. | +| ZO_SMTP_REPLY_TO | | The user email whom people can reply to. | +| ZO_SMTP_FROM_EMAIL | | The user email that is going to send the email. `Required` when using smtp. | +| ZO_SMTP_ENCRYPTION | | SMTP encryption method. Possible values are `ssltls`, `starttls` and "" (in case of localhost smtp). | + + +## Streaming search + +| Environment Variable | Default Value| Description | +| -------------------------------- | --------- | ------------------------------------------------------- | +| ZO_STREAMING_ENABLED | true | Enables streaming search. | +| ZO_STREAMING_RESPONSE_CHUNK_SIZE_MB | 1 | Size in megabytes for each chunk when streaming search responses. | + + +## Rate limiting + +| Environment Variable | Default Value | Description | +| -------------------------------- | --------- | ------------------------------------------------------- | +| O2_RATE_LIMIT_ENABLED | false | Enables rate limiting. | +| O2_RATE_LIMIT_RULE_REFRESH_INTERVAL | 10 | Refresh interval for rate limit rules in seconds. | + + +## Quick mode + +| Environment Variable | Default Value | Description | +| -------------------------------- | --------- | ------------------------------------------------------- | +| ZO_QUICK_MODE_ENABLED | false | Indicates if quick mode is enabled. | +| ZO_QUICK_MODE_NUM_FIELDS | 500 | The number of fields to consider for quick mode. | +| ZO_QUICK_MODE_STRATEGY | | Possible values are `first`, `last`, `both`. | + + +## Miscellaneous +| Environment Variable | Default Value | Description | +|---------------------|---------------|-------------| +| ZO_STARTING_EXPECT_QUERIER_NUM | 0 | The number of queriers expected to be running while caching enrichment tables. | +| ZO_QUERY_THREAD_NUM | - | The number of threads for searching in data files. | +| ZO_QUERY_TIMEOUT | 600 | Default timeout of query, unit: seconds | +| ZO_QUERY_INDEX_THREAD_NUM | 0 | Controls thread count for Tantivy index search. Set to 0 to use default: CPU cores × 4. Set a positive integer to override. 0 does not mean unlimited. | +| ZO_QUERY_OPTIMIZATION_NUM_FIELDS | 1000 | Field count threshold used by query optimizations. | +| ZO_QUERY_PARTITION_BY_SECS | 10 | Query partition size. Unit is seconds. | +| ZO_QUERY_GROUP_BASE_SPEED | 768 | Baseline throughput per core for group operations. Unit is MB per second per core. | +| ZO_MEMORY_CIRCUIT_BREAKER_ENABLED | false | Enables memory circuit breaker. | +| ZO_MEMORY_CIRCUIT_BREAKER_RATIO | 90 | Memory usage threshold percentage for circuit breaker. | +| ZO_RESTRICTED_ROUTES_ON_EMPTY_DATA | false | Redirects users to the ingestion page when no stream is found. | +| ZO_QUERY_ON_STREAM_SELECTION | true | Triggers search based on a button click event. | +| ZO_RESULT_CACHE_ENABLED | true | Enables result cache for query results. | +| ZO_USE_MULTIPLE_RESULT_CACHE | false | Uses multiple result caches for query results. | +| ZO_RESULT_CACHE_SELECTION_STRATEGY | overlap | Strategy for selecting result cache. Allowed values include both, overlap, duration. | +| ZO_ALIGN_PARTITIONS_FOR_INDEX | false | Uses large partitions for index across all streams. | +| ZO_TRACING_SEARCH_ENABLED | false | Enables tracing for search operations. | +| ZO_AGGREGATION_TOPK_ENABLED | true | Enables approx top-k aggregations. | +| ZO_FEATURE_FILELIST_DEDUP_ENABLED | false | Deprecated. Not used by the code. Will be removed. | +| ZO_FEATURE_QUERY_QUEUE_ENABLED | true | Enterprise edition must not enable this. In the open source edition, when enabled, the system processes only one search request at a time. | +| ZO_FEATURE_QUERY_INFER_SCHEMA | false | Deprecated. Not used by the code. Will be removed. | +| ZO_FEATURE_DISTINCT_EXTRA_FIELDS | - | Reserved for future use. Contact the maintainers for guidance. | + + +--- + +## Super-Cluster + +> The following environment variables are available only in the Enterprise edition. + +| Environment Variable | Default Value | Description | +| ---------------------------- | ------------- | ----------------------------------------------- | +| O2_SUPER_CLUSTER_ENABLED | false | Indicates if super cluster is enabled. | +| O2_SUPER_CLUSTER_REGION | default | Region of super cluster. | +| O2_SUPER_CLUSTER_PUBLIC_ADDR | | Public address of super cluster. | +| O2_SUPER_CLUSTER_PUBLIC_PORT | | Public port of super cluster (in case of gRPC). | +| O2_SUPER_CLUSTER_GRPC_TOKEN | | gRPC token. | + +## Search-Group +> The following environment variables are available only in the Enterprise edition. + +| Environment Variable | Default Value | Description | +| --------------------------------------- | ------------- | ------------------- | +| O2_SEARCH_GROUP_LONG_MAX_CPU | 80% | The percentage of CPU allocated to long queries. | +| O2_SEARCH_GROUP_LONG_MAX_MEMORY | 80% |The percentage of memory allocated to long queries. | +| O2_SEARCH_GROUP_LONG_MAX_CONCURRENCY | 2 |Maximum number of concurrent long queries.| +| O2_SEARCH_GROUP_SHORT_MAX_CPU | 20% |Percentage of CPU allocated to short queries.| +| O2_SEARCH_GROUP_SHORT_MAX_CONCURRENCY | 4 |Maximum number of concurrent short queries.| +| O2_SEARCH_GROUP_SHORT_MAX_MEMORY | 20% |Percentage of memory allocated to short queries.| +| O2_SEARCH_GROUP_BASE_SPEED | 1024 | Base speed in MB. | +| O2_SEARCH_GROUP_BASE_SECS | 10 | Base speed in secs. | + +## OpenFGA +> The following environment variables are available only in the Enterprise edition. + +| Environment Variable | Default Value | Description | +| ---------------------------------- | --------- | ---------------------------------------------------------------------------- | +| O2_OPENFGA_ENABLED | false| Indicates if openfga is enabled. | +| O2_OPENFGA_BASE_URL | `http://127.0.0.1:8080/stores` | The base URL of openfga stores server. **Required** when openfga is enabled. | +| O2_OPENFGA_STORE_NAME | `openobserve` | OpenFGA store name. **Required** when openfga is enabled. | +| O2_MAP_GROUP_TO_ROLE | false | If true, the group claims are mapped into roles in the default org. | +| O2_OPENFGA_PAGE_SIZE | `100`| The page size used for openfga queries. | +| O2_OPENFGA_LIST_ONLY_PERMITTED | false | If true, openobserve only lists resources that have `GET` permission. | +| O2_MAP_GROUP_TO_ROLE_SKIP_CREATION | true | Used with `O2_MAP_GROUP_TO_ROLE`. Skips creating the roles mapped from group claims assuming they already exists. | + +## DEX +> The following environment variables are available only in the Enterprise edition. + +| Environment Variable | Default Value |Description | +| --------------------------- | --------------------------- | ------------------------------------------------------------------- | +| O2_DEX_ENABLED | false | Enables SSO in OpenObserve using Dex. | +| O2_DEX_CLIENT_ID | - | Client id of static client. **Required** when dex is enabled. | +| O2_DEX_CLIENT_SECRET | - | Client secret of static client. **Required** when dex is enabled. | +| O2_DEX_BASE_URL | `http://127.0.0.1:5556/dex` | URL of the Dex identity provider. **Required** when dex is enabled. | +| O2_CALLBACK_URL | - | Set this value to `/web/cb`, after successful token received from dex, user will be redirected to this page. **Required** when dex is enabled. | +| O2_DEX_REDIRECT_URL | - | Set this value to `/config/redirect`, Should match to redirect uri specified in dex. **Required** when dex is enabled. | +| O2_DEX_SCOPES | openid profile email groups offline_access | Scopes to be fetched from dex. | +| O2_DEX_GROUP_ATTRIBUTE | ou | Maps user to OpenObserve organization. | +| O2_DEX_ROLE_ATTRIBUTE | cn | User's role in the organization. | +| O2_DEX_DEFAULT_ORG | default | Default organization for users not belonging to any group in ldap. | +| O2_DEX_TOKEN_EP_SUFFIX | `/token` | Suffix for dex token endpoint.| +| O2_DEX_KEYS_EP_SUFFIX | `/keys` | Suffix for dex keys endpoint. | +| O2_DEX_AUTH_EP_SUFFIX | `/auth` | Suffix for dex authentication endpoint. | +| O2_DEX_NATIVE_LOGIN_ENABLED | true | Indicates if native dex login is enabled. | + + +## Other Enterprise Features + +| Environment Variable | Default Value | Description | +| ------------------------- | ------------- | --------------------------------------------------------------------------------------- | +| O2_AUDIT_ENABLED | false | Indicates if audit reporting is enabled. | +| O2_AUDIT_BATCH_SIZE | 500 | How many requests should be batched before flushing the audit data from memory to disk. | +| O2_CUSTOM_LOGO_TEXT | | Custom logo text that will appear along with the openobserve logo. | +| O2_CUSTOM_SLACK_URL | | Custom slack URL that will be used by the `Slack` menu on the openobserve UI. | +| O2_CUSTOM_DOCS_URL | | Custom docs URL that will be used by the `docs` tab on the openobserve UI. | +| O2_CUSTOM_HIDE_MENUS | | Comma-separated menu items that should not be shown in the menu on openobserve UI. For example, `metrics,traces`. | + + + + \ No newline at end of file diff --git a/docs/images/enable-disable-streaming-search.png b/docs/images/enable-disable-streaming-search.png index 454b4d0497adcc4399f25e31f9589af7b449acb2..f88cf72911941125e28208431f92b579ceee4c37 100644 GIT binary patch literal 153658 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