Policy
The policy module queries a Prometheus endpoint (e.g., 10x SaaS/self-hosted) for event types exhibiting the highest volume rates, storing the results in a lookup file locally or on Github.
Instances of the Edge regulator app running alongside log forwarders can fetch and use the lookup to filter 'noisy' events from shipping to log analyzers (e.g., Splunk, Elastic).
Workflow
The policy regulator executes the following periodic process:
graph LR
A["<div style='font-size: 14px;'>⏰ Scheduler</div><div style='font-size: 10px; text-align: center;'>Periodic Job</div>"] --> B["<div style='font-size: 14px;'>📊 Query</div><div style='font-size: 10px; text-align: center;'>Prometheus</div>"]
B --> C["<div style='font-size: 14px;'>🔧 Build Policy</div><div style='font-size: 10px; text-align: center;'>Lookup Table</div>"]
C --> D["<div style='font-size: 14px;'>📤 Push</div><div style='font-size: 10px; text-align: center;'>to GitHub</div>"]
D --> E["<div style='font-size: 14px;'>📥 Pull</div><div style='font-size: 10px; text-align: center;'>Edge Regulators</div>"]
E --> F["<div style='font-size: 14px;'>🚫 Filter</div><div style='font-size: 10px; text-align: center;'>Collected Events</div>"]
classDef schedule fill:#7c3aed88,stroke:#6d28d9,color:#ffffff,stroke-width:2px,rx:8,ry:8
classDef query fill:#9333ea88,stroke:#7c3aed,color:#ffffff,stroke-width:2px,rx:8,ry:8
classDef filter fill:#2563eb88,stroke:#1d4ed8,color:#ffffff,stroke-width:2px,rx:8,ry:8
classDef Push fill:#059669,stroke:#047857,color:#ffffff,stroke-width:2px,rx:8,ry:8
classDef pull fill:#dc2626,stroke:#b91c1c,color:#ffffff,stroke-width:2px,rx:8,ry:8
classDef regulate fill:#ea580c88,stroke:#c2410c,color:#ffffff,stroke-width:2px,rx:8,ry:8
class A schedule
class B query
class C filter
class D Push
class E pull
class F regulate
⏰ Periodic Invocation: Scheduled job triggers policy generation at configured intervals
📊 Prometheus Query: Retrieves cost metrics using range queries for event pattern analysis
🔧 Policy Building: Creates lookup table from high-cost event patterns exceeding thresholds
📤 GitHub Push: Commits policy lookup file to centralized repository for distribution (optional)
📥 Edge Regulator Pull: Distributed regulators fetch updated policies from central config
🚫 Event Filtering: Downstream edge regulators apply policies to regulate events before shipping
Output Lookup
The policy lookup file can either be pushed to GitHub for GitOps distribution or stored locally for custom distribution mechanisms.
The module uses a GitHub output to push the calculated event rates as lookup file containing the identities of the highest-rate event patterns for use by downstream Edge regulators.
The GitHub approach enables centralized GitOps workflows where edge regulators automatically pull policy updates from the repository, ensuring consistent regulation across distributed deployments.
The module can emit the policy lookup table to a local file on disk, allowing users to distribute it using their preferred mechanism to downstream edge regulators.
Distribution Examples:
- Kubernetes ConfigMaps: Mount the lookup file as a ConfigMap volume across edge regulator pods
- S3 Distribution: Upload the file to S3 and configure edge regulators to periodically download updates
- Network File Systems: Place the file on shared storage accessible by all edge nodes
- Container Images: Bundle the lookup file into custom container images for immutable deployments
This approach provides flexibility for organizations with existing distribution infrastructure or specific compliance requirements that prevent external repository usage.
Configuration
To configure the Policy regulator lookup input module, Edit these settings.
Below is the default configuration from: policy/config.yaml.
ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogImFycmF5IiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgInRlbngiIDogewogICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgfSwKICAgICJwb2xpY3kiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAicHJvbWV0aGV1cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICAgICAiZW5kcG9pbnQiIDogewogICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlByb21ldGhldXMgaW5zdGFuY2UgZW5kcG9pbnRcblxuRGVmaW5lcyB0aGUgYWRkcmVzcyBvZiB0aGUgUHJvbWV0aGV1cyBbSFRUUCBBUEldKGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L3F1ZXJ5aW5nL2FwaS8pIHRvIHF1ZXJ5IChEZWZhdWx0OiBodHRwczovL3Byb21ldGhldXMubG9nMTB4LmNvbSkiLAogICAgICAgICAgICAgICAgImRlZmF1bHQiIDogImh0dHBzOi8vcHJvbWV0aGV1cy5sb2cxMHguY29tIgogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgInNlcmllcyIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiUHJvbWV0aGV1cyBzZXJpZXMgdG8gcXVlcnlcblxuRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgc2VyaWVzIHRvIHF1ZXJ5IGZvciBldmVudHMgdm9sdW1lIGluIGJ5dGVzIChEZWZhdWx0OiBhbGxfZXZlbnRzX3N1bW1hcnlCeXRlc190b3RhbCkiLAogICAgICAgICAgICAgICAgImRlZmF1bHQiIDogImFsbF9ldmVudHNfc3VtbWFyeUJ5dGVzX3RvdGFsIgogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgImxhYmVscyIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICJhcnJheSIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiUHJvbWV0aGV1cyBtZXRyaWMgbGFiZWxzIGZvciBncm91cGluZ1xuXG5TcGVjaWZpZXMgdGhlIGxpc3Qgb2YgbWV0cmljIGxhYmVscyB0byBncm91cCBieSBpbiB0aGUgUHJvbWV0aGV1cyBxdWVyeS4gTk9URTogdGhpcyBsaXN0IG11c3QgbWF0Y2ggdGhlIFtyYXRlUmVndWxhdG9yRmllbGROYW1lc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vcmVndWxhdGUvcmF0ZS8jcmF0ZVJlZ3VsYXRvckZpZWxkTmFtZXMpIHNwZWNpZmllZCBieSB0aGUgZWRnZSByYXRlIHJlZ3VsYXRvci4gKERlZmF1bHQ6IFtcInN5bWJvbE1lc3NhZ2VcIl0pIiwKICAgICAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICAgICAgICAgICAic3ltYm9sTWVzc2FnZSIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJhcHBzIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlByb21ldGhldXMgbWV0cmljIGFwcCBuYW1lc1xuXG5TcGVjaWZpZXMgdGhlIGxpc3Qgb2YgMTB4IGVkZ2UgYXBwIG5hbWVzIHRvIHNwZWNpZnkgaW4gdGhlIFByb21ldGhldXMgcXVlcnkuIiwKICAgICAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAic3RhcnQiIDogewogICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlF1ZXJ5IHN0YXJ0IHRpbWVcblxuU2V0cyBxdWVyeSdzIGJlZ2lubmluZyB0aW1lc3RhbXAgZm9yIFByb21ldGhldXMgZGF0YSByZXRyaWV2YWwgKGUuZy4sIDIwMjUtMTAtMTNUMjM6Mjk6MjNaLCAxNzM2NzI0NTYzKS4iCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAicmFuZ2VJbnRlcnZhbCIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiUXVlcnkgdGltZSByYW5nZSBpbnRlcnZhbFxuXG5EZWZpbmVzIHRoZSB0aW1lIHJhbmdlIGludGVydmFsIGZvciB0aGUgUHJvbWV0aGV1cyByYW5nZSBxdWVyeSAoZS5nLiwgJzVtJywgJzFoJykgKERlZmF1bHQ6IDZoKSIsCiAgICAgICAgICAgICAgICAiZGVmYXVsdCIgOiAiNmgiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAic3RlcER1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJRdWVyeSByZXNvbHV0aW9uIHN0ZXAgZHVyYXRpb25cblxuRGVmaW5lcyB0aGUgcXVlcnkgcmVzb2x1dGlvbiBzdGVwIGR1cmF0aW9uIGZvciB0aGUgUHJvbWV0aGV1cyByYW5nZSBxdWVyeSAoZS5nLiwgJzMwcycsICcxbScpIChEZWZhdWx0OiA1bSkiLAogICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIjVtIgogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgInRvcEV2ZW50cyIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAic3RyaW5nIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOdW1iZXIgb2YgdG9wIGV2ZW50cyB0byByZXR1cm4gZnJvbSBQcm9tZXRoZXVzIHF1ZXJ5XG5cblNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGhpZ2hlc3QtcmF0ZSBldmVudCBwYXR0ZXJucyB0byByZXR1cm4gdXNpbmcgdGhlIFByb21ldGhldXMgW3RvcGsgb3BlcmF0b3JdKGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L3F1ZXJ5aW5nL29wZXJhdG9ycy8jYWdncmVnYXRpb24tb3BlcmF0b3JzKSAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MCkiLAogICAgICAgICAgICAgICAgImRlZmF1bHQiIDogNTAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAgICAgImxhYmVscyIsCiAgICAgICAgICAgICAgInJhbmdlSW50ZXJ2YWwiLAogICAgICAgICAgICAgICJzdGVwRHVyYXRpb24iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiaW5nZXN0aW9uQ29zdFBlckdCIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJWZW5kb3IgaW5nZXN0aW9uIGNvc3QgcGVyIEdCIGluIFVTRCBmb3IgY29zdCBjYWxjdWxhdGlvblxuXG5EZWZpbmVzIHRoZSBjb3N0IHBlciBHQiBjaGFyZ2VkIGJ5IHlvdXIgb2JzZXJ2YWJpbGl0eSB2ZW5kb3IgZm9yIGxvZyBpbmdlc3Rpb24uIFVzZWQgdG8gY2FsY3VsYXRlIGNvc3QtcGVyLWhvdXIgZGF0YSBmb3IgZWFjaCBldmVudCBwYXR0ZXJuIGluIHRoZSBnZW5lcmF0ZWQgbG9va3VwIGZpbGUuICBFZGdlIHJhdGUgcmVndWxhdG9ycyBpbiBnbG9iYWwgbW9kZSB1c2UgdGhpcyBjb3N0IGRhdGEgKGZyb20gdGhlIGxvb2t1cCkgdG8gZW5mb3JjZSBjbHVzdGVyLXdpZGUgYnVkZ2V0IHBvbGljaWVzLiAgKipJbXBvcnRhbnQ6KiogVGhpcyB2YWx1ZSBzaG91bGQgbWF0Y2hbcmF0ZVJlZ3VsYXRvckluZ2VzdGlvbkNvc3RQZXJHQl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vcmVndWxhdGUvcG9saWN5LyNwb2xpY3lpbmdlc3Rpb25jb3N0cGVyZ2IpIGNvbmZpZ3VyZWQgb24geW91ciBlZGdlIHJhdGUgcmVndWxhdG9ycy4gICoqQ29tbW9uIHZlbmRvciBwcmljaW5nICgyMDI1KToqKiAtICoqU3BsdW5rIENsb3VkKio6IH4kMS41MC9HQiAodmFyaWVzIGJ5IGNvbnRyYWN0LCBTS1UpIC0gKipEYXRhZG9nIExvZ3MqKjogfiQwLjEwLSQwLjI1L0dCIChkZXBlbmRzIG9uIHRpZXI6IHN0YW5kYXJkLCBmbGV4LCBvbmxpbmUgYXJjaGl2ZXMpIC0gKipFbGFzdGljIENsb3VkKio6IH4kMC4xMDkvR0IgKHN0YW5kYXJkIGxvZ2dpbmcgdGllcikgLSAqKk5ldyBSZWxpYyoqOiB+JDAuMzAvR0IgKERhdGEgUGx1cykgLSAqKlN1bW8gTG9naWMqKjogfiQxLjUwL0dCIChkZXBlbmRzIG9uIHBsYW4pIC0gKipBV1MgQ2xvdWRXYXRjaCBMb2dzKio6IH4kMC41MC9HQiBpbmdlc3Rpb24gKyAkMC4wMy9HQiBzdG9yYWdlICAqKkV4YW1wbGU6KiogSWYgeW91ciBTcGx1bmsgY29udHJhY3QgaXMgJDEuNTAvR0IgYW5kIHlvdSBlbWl0IDEwMEdCL2hvdXIgYWNyb3NzIGFsbCBhcHBzLCB0aGUgdG90YWwgY29zdCBpcyAkMTUwL2hvdXIuIFRoZSBwb2xpY3kgbW9kdWxlIGNhbGN1bGF0ZXMgcGVyLWV2ZW50LXBhdHRlcm4gY29zdHMgKGUuZy4sIFwiZXJyb3JfbG9naW58ZnJvbnRlbmRcIiA9ICQyMC9ob3VyKSBhbmQgd3JpdGVzIHRoZW0gdG8gdGhlIGxvb2t1cC4gRWRnZSByZWd1bGF0b3JzIHRoZW4gZW5mb3JjZSBwZXItYXBwIG9yIHBlci1wYXR0ZXJuIGNhcHMgYmFzZWQgb24gdGhpcyBkYXRhLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiAxKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAib3V0cHV0IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAgICJwYXRoIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJPdXRwdXQgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBwb2xpY3kgbG9va3VwIGZpbGVcblxuRGVmaW5lcyB0aGUgb3V0cHV0IHBhdGggZm9yIHRoZSBwb2xpY3kgbG9va3VwIGZpbGUgY29udGFpbmluZyBjbHVzdGVyLXdpZGUgc3BlbmQgZGF0YSAocGVyIGZpZWxkIHNldCBhbmQgdG90YWwpIGF2ZXJhZ2VkIG92ZXIgdGhlIGNvbmZpZ3VyZWQgdGltZSByYW5nZS4gKipCZWhhdmlvciBkZXBlbmRzIG9uIGBwb2xpY3lPdXRwdXRHaXRodWJSZXBvYDoqKiAgLSAqKklmIFtwb2xpY3lPdXRwdXRHaXRodWJSZXBvXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9yZWd1bGF0ZS9wb2xpY3kvI3BvbGljeW91dHB1dGdpdGh1YnJlcG8pIGlzIE5PVCBzZXQqKjogTG9jYWwgZmlsZSBwYXRoIHdoZXJlIHRoZSBsb29rdXAgd2lsbCBiZSB3cml0dGVuIChlLmcuLCBgL3RtcC9yYXRlLXBvbGljeS5jc3ZgLCBgLi9wb2xpY2llcy9yYXRlLWxvb2t1cC5jc3ZgKSAtICoqSWYgW3BvbGljeU91dHB1dEdpdGh1YlJlcG9dKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL3JlZ3VsYXRlL3BvbGljeS8jcG9saWN5b3V0cHV0Z2l0aHVicmVwbykgSVMgc2V0Kio6IFBhdGggd2l0aGluIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSB3aGVyZSB0aGUgbG9va3VwIHdpbGwgYmUgcHVzaGVkIChlLmcuLCBgcG9saWNpZXMvcmF0ZS1sb29rdXAuY3N2YCwgYHJhdGUtcG9saWN5LmNzdmApICBFZGdlIHJhdGUgcmVndWxhdG9ycyBpbiBnbG9iYWwgbW9kZSBwdWxsIHRoaXMgZmlsZSB0byBlbmZvcmNlIGNsdXN0ZXItd2lkZSBidWRnZXRzLiIKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJnaXRodWIiIDogewogICAgICAgICAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAgICAgICAgICJyZXBvIiA6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkdpdEh1YiByZXBvc2l0b3J5IHRvIHB1c2ggdGhlIHBvbGljeSBsb29rdXAgZmlsZVxuXG5EZWZpbmVzIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoZm9ybWF0OiBgb3duZXIvcmVwb2ApIHdoZXJlIHRoZSBnZW5lcmF0ZWQgcG9saWN5IGxvb2t1cCBmaWxlIHdpbGwgYmUgcHVzaGVkLiBVc2VkIGZvciBzaGFyaW5nIHRoZSBsb29rdXAgd2l0aCBkaXN0cmlidXRlZCBlZGdlIHJhdGUgcmVndWxhdG9ycy4gIFJlcXVpcmVzIEdpdEh1YiBhdXRoZW50aWNhdGlvbiAodmlhIHRva2VuIG9yIFNTSCBrZXkpLiAgKipFeGFtcGxlOioqIGBteS1vcmcvb2JzZXJ2YWJpbGl0eS1wb2xpY2llc2AiCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICJicmFuY2giIDogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiR2l0SHViIGJyYW5jaCBmb3IgcHVzaGluZyB0aGUgcG9saWN5IGxvb2t1cCBmaWxlXG5cbkRlZmluZXMgdGhlIEdpdCBicmFuY2ggdG8gdXNlIHdoZW4gcHVzaGluZyB0aGUgcG9saWN5IGxvb2t1cCBmaWxlIHRvIEdpdEh1Yi4gKipFeGFtcGxlOioqIGBtYWluYCwgYHByb2R1Y3Rpb25gLCBvciBgcG9saWNpZXNgIChEZWZhdWx0OiBtYWluKSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiIDogIm1haW4iCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICJzcXVhc2hNZXJnZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJVc2Ugc3F1YXNoIG1lcmdlIHdoZW4gbWVyZ2luZyBHaXRIdWIgcHVsbCByZXF1ZXN0c1xuXG5TcGVjaWZpZXMgd2hldGhlciB0byB1c2Ugc3F1YXNoIG1lcmdlICh0cnVlKSBvciByZWd1bGFyIG1lcmdlIChmYWxzZSkgd2hlbiBtZXJnaW5nIHB1bGwgcmVxdWVzdHMgdG8gR2l0SHViLiBTcXVhc2ggbWVyZ2UgY29tYmluZXMgYWxsIGNvbW1pdHMgaW50byBhIHNpbmdsZSBjb21taXQsIHJlc3VsdGluZyBpbiBhIGNsZWFuZXIgY29tbWl0IGhpc3RvcnkuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYXV0b21hdGVkIHBvbGljeSB1cGRhdGVzIHRoYXQgcnVuIGZyZXF1ZW50bHkgKGUuZy4sIGV2ZXJ5IDUgbWludXRlcykuICAqKlJlY29tbWVuZGF0aW9uOioqIEVuYWJsZSB0aGlzIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aXRoIGZyZXF1ZW50IHBvbGljeSB1cGRhdGVzLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSAoRGVmYXVsdDogdHJ1ZSkiLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6IHRydWUKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmVkIiA6IFsKICAgICAgICAgICAgICAicGF0aCIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=
# 🔟❎ 'run' policy generator configuration
# Policy generators periodically query a instance Prometheus to generate a filter lookup file on GitHub
# used by Edge regulators to filter 'noisy' telemetry from shipping to outputs (e.g., Splunk, Elastic).
# To learn more see https://doc.log10x.com/run/regulate/policy
# Set the 10x pipeline to 'run'
tenx: run
# =============================== Dependencies ================================
include:
- run/modules/regulate/policy
# =========================== Prometheus Policy Input =========================
policy:
- prometheus:
# 'endpoint' defines the address of the Prometheus HTTP API.
endpoint: https://prometheus.log10x.com
# 'series' defines the name of the series to query for events volume in bytes
series: all_events_summaryBytes_total
# 'labels' specifies the list of metric labels to group by in the Prometheus 'avg_over_time' query
labels:
- message_pattern
# 'start' sets the query's beginning timestamp for Prometheus data retrieval
start: $=now() / 1000
# 'rangeInterval' defines the time range interval for the Prometheus 'avg_over_time' query
rangeInterval: 24h
# 'policyStepDuration' defines the resolution step duration for the Prometheus 'avg_over_time' query
stepDuration: 5m
# 'topEvents' specifies the number of highest-rate event patterns to return using Prometheus topk operator
topEvents: 50
ingestionCostPerGB: 1.5
output:
path: $=path("data/sample/policy") + "/policy.csv"
github:
# 'repo' specifies the GitHub repo to push output lookup file to
repo: ""
# 'branch' specifies the GitHub repo branch to push the file to, defaults to main
branch: ""
Options
Specify the options below to configure multiple Policy regulator lookup input:
| Name | Description | Category |
|---|---|---|
| policyPrometheusEndpoint | Prometheus instance endpoint | Prometheus |
| policyPrometheusSeries | Prometheus series to query | Prometheus |
| policyPrometheusLabels | Prometheus metric labels for grouping | Prometheus |
| policyPrometheusApps | Prometheus metric app names | Prometheus |
| policyPrometheusStart | Query start time | Prometheus |
| policyPrometheusRangeInterval | Query time range interval | Prometheus |
| policyPrometheusStepDuration | Query resolution step duration | Prometheus |
| policyPrometheusTopEvents | Number of top events to return from Prometheus query | Prometheus |
| policyIngestionCostPerGB | Vendor ingestion cost per GB in USD for cost calculation | Cost |
| policyOutputPath | Output path for the generated policy lookup file | Output |
| policyOutputGithubRepo | GitHub repository to push the policy lookup file | Output |
| policyOutputGithubBranch | GitHub branch for pushing the policy lookup file | Output |
| policyOutputGithubSquashMerge | Use squash merge when merging GitHub pull requests | Output |
Prometheus
policyPrometheusEndpoint
Prometheus instance endpoint.
| Type | Default | Category |
|---|---|---|
| String | https://prometheus.log10x.com | Prometheus |
Defines the address of the Prometheus HTTP API to query.
policyPrometheusSeries
Prometheus series to query.
| Type | Default | Category |
|---|---|---|
| String | all_events_summaryBytes_total | Prometheus |
Defines the name of the series to query for events volume in bytes.
policyPrometheusLabels
Prometheus metric labels for grouping.
| Type | Required | Category |
|---|---|---|
| List | ✔ | Prometheus |
Specifies the list of metric labels to group by in the Prometheus query.
NOTE: this list must match the rateRegulatorFieldNames specified by the edge rate regulator.
policyPrometheusApps
Prometheus metric app names.
| Type | Default | Category |
|---|---|---|
| List | reporter|regulator|optimizer | Prometheus |
Specifies the list of 10x edge app names to specify in the Prometheus query.
policyPrometheusStart
Query start time.
| Type | Default | Category |
|---|---|---|
| String | 1772387753 | Prometheus |
Sets query's beginning timestamp for Prometheus data retrieval (e.g., 2025-10-13T23:29:23Z, 1736724563).
policyPrometheusRangeInterval
Query time range interval.
| Type | Required | Category |
|---|---|---|
| String | ✔ | Prometheus |
Defines the time range interval for the Prometheus range query (e.g., '5m', '1h').
policyPrometheusStepDuration
Query resolution step duration.
| Type | Required | Category |
|---|---|---|
| String | ✔ | Prometheus |
Defines the query resolution step duration for the Prometheus range query (e.g., '30s', '1m').
policyPrometheusTopEvents
Number of top events to return from Prometheus query.
| Type | Default | Category |
|---|---|---|
| Number | 50 | Prometheus |
Specifies the number of highest-rate event patterns to return using the Prometheus topk operator.
Cost
policyIngestionCostPerGB
Vendor ingestion cost per GB in USD for cost calculation.
| Type | Default | Category |
|---|---|---|
| Number | 1.5 | Cost |
Defines the cost per GB charged by your observability vendor for log ingestion. Used to calculate cost-per-hour data for each event pattern in the generated lookup file.
Edge rate regulators in global mode use this cost data (from the lookup) to enforce cluster-wide budget policies.
Important: This value should matchrateRegulatorIngestionCostPerGB configured on your edge rate regulators.
Common vendor pricing (2025):
- Splunk Cloud: ~$1.50/GB (varies by contract, SKU)
- Datadog Logs: ~$0.10-$0.25/GB (depends on tier: standard, flex, online archives)
- Elastic Cloud: ~$0.109/GB (standard logging tier)
- New Relic: ~$0.30/GB (Data Plus)
- Sumo Logic: ~$1.50/GB (depends on plan)
- AWS CloudWatch Logs: ~$0.50/GB ingestion + $0.03/GB storage
Example: If your Splunk contract is $1.50/GB and you emit 100GB/hour across all apps, the total cost is $150/hour. The policy module calculates per-event-pattern costs (e.g., "error_login|frontend" = $20/hour) and writes them to the lookup. Edge regulators then enforce per-app or per-pattern caps based on this data.
Output
policyOutputPath
Output path for the generated policy lookup file.
| Type | Required | Category |
|---|---|---|
| String | ✔ | Output |
Defines the output path for the policy lookup file containing cluster-wide spend data (per field set and total) averaged over the configured time range.
Behavior depends on policyOutputGithubRepo:
- If policyOutputGithubRepo is NOT set: Local file path where the lookup will be written (e.g.,
/tmp/rate-policy.csv,./policies/rate-lookup.csv) - If policyOutputGithubRepo IS set: Path within the GitHub repository where the lookup will be pushed (e.g.,
policies/rate-lookup.csv,rate-policy.csv)
Edge rate regulators in global mode pull this file to enforce cluster-wide budgets.
policyOutputGithubRepo
GitHub repository to push the policy lookup file.
| Type | Default | Category |
|---|---|---|
| String | "" | Output |
Defines the GitHub repository (format: owner/repo) where the generated policy lookup file will be pushed.
Used for sharing the lookup with distributed edge rate regulators.
Requires GitHub authentication (via token or SSH key).
Example: my-org/observability-policies.
policyOutputGithubBranch
GitHub branch for pushing the policy lookup file.
| Type | Default | Category |
|---|---|---|
| String | main | Output |
Defines the Git branch to use when pushing the policy lookup file to GitHub.
Example: main, production, or policies.
policyOutputGithubSquashMerge
Use squash merge when merging GitHub pull requests.
| Type | Default | Category |
|---|---|---|
| Boolean | true | Output |
Specifies whether to use squash merge (true) or regular merge (false) when merging pull requests to GitHub. Squash merge combines all commits into a single commit, resulting in a cleaner commit history. This is particularly useful for automated policy updates that run frequently (e.g., every 5 minutes).
Recommendation: Enable this for production environments with frequent policy updates.
This module is defined in policy/module.yaml.