log10x-mcp 1.30.21 → 1.30.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/build/index.js +26 -4
- package/build/index.js.map +1 -1
- package/build/lib/advisor/envelope.d.ts +1 -1
- package/build/lib/advisor/reporter-forwarders.d.ts +32 -13
- package/build/lib/advisor/reporter-forwarders.js +179 -94
- package/build/lib/advisor/reporter-forwarders.js.map +1 -1
- package/build/lib/advisor/reporter.d.ts +18 -10
- package/build/lib/advisor/reporter.js +43 -16
- package/build/lib/advisor/reporter.js.map +1 -1
- package/build/lib/advisor/retriever.d.ts +6 -0
- package/build/lib/advisor/retriever.js +5 -3
- package/build/lib/advisor/retriever.js.map +1 -1
- package/build/lib/advisor/types.d.ts +3 -1
- package/build/lib/cdk-recipes.d.ts +1 -1
- package/build/lib/cdk-recipes.js +21 -10
- package/build/lib/cdk-recipes.js.map +1 -1
- package/build/lib/discovery/types.d.ts +15 -10
- package/build/lib/fenced.d.ts +2 -0
- package/build/lib/fenced.js +2 -2
- package/build/lib/fenced.js.map +1 -1
- package/build/lib/offload-recipes.d.ts +2 -1
- package/build/lib/offload-recipes.js +13 -10
- package/build/lib/offload-recipes.js.map +1 -1
- package/build/lib/poc-report-renderer.js +17 -11
- package/build/lib/poc-report-renderer.js.map +1 -1
- package/build/lib/retriever-api.d.ts +14 -0
- package/build/lib/retriever-api.js +40 -10
- package/build/lib/retriever-api.js.map +1 -1
- package/build/lib/runtime-image.d.ts +7 -2
- package/build/lib/runtime-image.js +7 -2
- package/build/lib/runtime-image.js.map +1 -1
- package/build/lib/siem/_sampling.js +4 -0
- package/build/lib/siem/_sampling.js.map +1 -1
- package/build/lib/siem/cloudwatch.d.ts +18 -0
- package/build/lib/siem/cloudwatch.js +106 -2
- package/build/lib/siem/cloudwatch.js.map +1 -1
- package/build/lib/siem/datadog.js +1 -1
- package/build/lib/siem/datadog.js.map +1 -1
- package/build/lib/siem/elasticsearch.js +13 -1
- package/build/lib/siem/elasticsearch.js.map +1 -1
- package/build/lib/siem/splunk.d.ts +18 -0
- package/build/lib/siem/splunk.js +71 -7
- package/build/lib/siem/splunk.js.map +1 -1
- package/build/product-kb/docs/apps/receiver/compact/index.md +3 -3
- package/build/product-kb/docs/apps/receiver/compact/splunk.md +81 -67
- package/build/product-kb/docs/apps/retriever/faq.md +2 -2
- package/build/product-kb/docs/engine/launcher/extension.md +20 -20
- package/build/product-kb/docs/faq/apps/retriever.md +2 -2
- package/build/product-kb/docs/faq/general.md +1 -1
- package/build/product-kb/docs/faq/stacks/splunk/comparisons.md +3 -3
- package/build/product-kb/docs/faq/stacks/splunk/compatibility.md +19 -242
- package/build/product-kb/docs/faq/stacks/splunk/index.md +1 -1
- package/build/product-kb/docs/faq/stacks/splunk/kv-store.md +41 -159
- package/build/product-kb/docs/faq/stacks/splunk/optimization.md +4 -4
- package/build/product-kb/docs/run/input/forwarder/fluentbit/index.md +1 -1
- package/build/product-kb/docs/run/input/forwarder/fluentd/index.md +1 -1
- package/build/product-kb/docs/run/input/forwarder/otel-collector/index.md +1 -1
- package/build/product-kb/docs/run/input/forwarder/vector/index.md +1 -1
- package/build/product-kb/docs/summary.md +0 -1
- package/build/tools/advise-install.d.ts +25 -18
- package/build/tools/advise-install.js +156 -90
- package/build/tools/advise-install.js.map +1 -1
- package/build/tools/advise-retriever.d.ts +5 -5
- package/build/tools/advise-retriever.js +25 -9
- package/build/tools/advise-retriever.js.map +1 -1
- package/build/tools/doctor.js +3 -2
- package/build/tools/doctor.js.map +1 -1
- package/build/tools/emit-sample-plan.js +7 -1
- package/build/tools/emit-sample-plan.js.map +1 -1
- package/build/tools/poc-from-local.js +7 -6
- package/build/tools/poc-from-local.js.map +1 -1
- package/build/tools/poc-from-siem.js +71 -4
- package/build/tools/poc-from-siem.js.map +1 -1
- package/build/tools/retriever-query.js +1 -1
- package/build/tools/retriever-query.js.map +1 -1
- package/package.json +1 -1
- package/build/product-kb/docs/run/output/event/dev/index.md +0 -351
|
@@ -3,26 +3,27 @@ icon: material/check-circle-outline
|
|
|
3
3
|
title: "Compatibility"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Splunk dashboards, Universal Forwarders, testing on your own environment, HEC integration, Splunk Enterprise on-premises, and
|
|
6
|
+
Splunk dashboards, Universal Forwarders, testing on your own environment, HEC integration, Splunk Enterprise on-premises, and Splunk Cloud Platform.
|
|
7
7
|
|
|
8
8
|
??? tenx-compat "Does 10x work with my existing Splunk dashboards and queries"
|
|
9
9
|
|
|
10
|
-
**Yes.**
|
|
10
|
+
**Yes.** Compact events keep `host`, `source`, `sourcetype` and `index`; field extractions apply to the expanded text.
|
|
11
11
|
|
|
12
12
|
**Fields preserved:**
|
|
13
13
|
|
|
14
|
-
- `
|
|
15
|
-
- `_raw`,
|
|
16
|
-
-
|
|
17
|
-
- Custom metadata and tags
|
|
14
|
+
- `host`, `source`, `sourcetype`, `index`
|
|
15
|
+
- `_raw`, expanded at search time
|
|
16
|
+
- Field extractions, applied to the expanded text
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
`_time` on a compact event is the time Splunk indexed it; the original timestamp is in the expanded line.
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
- Scheduled alerts are compiled once at save time (via the **10x Compile Alert** view) so they run natively server-side
|
|
23
|
-
- SPL queries return the same results
|
|
20
|
+
**How searches reach compact events:**
|
|
24
21
|
|
|
25
|
-
|
|
22
|
+
- Classic dashboards in an app that carries `dashboard.js` keep their SPL unchanged; Dashboard Studio panels use `tenxsearch`
|
|
23
|
+
- The search bar, saved searches and the REST API wrap the search in the `tenxsearch` command
|
|
24
|
+
- Alerts created in the **Compile Alert** view are compiled once at save time, so they run natively server-side; an alert saved from the search page wraps its search in `tenxsearch`
|
|
25
|
+
|
|
26
|
+
**How optimization works:** The 10x Engine uses [template-based](https://doc.log10x.com/run/transform/){target="_blank"} encoding, keeping every value. Each repeated log event is replaced by a compact reference to its template while maintaining full searchability in Splunk.
|
|
26
27
|
|
|
27
28
|
??? tenx-compat "Does this work with Universal Forwarders"
|
|
28
29
|
|
|
@@ -36,7 +37,7 @@ Splunk dashboards, Universal Forwarders, testing on your own environment, HEC in
|
|
|
36
37
|
|
|
37
38
|
1. **[Cost POC](https://doc.log10x.com/apps/mcp/)**, install the 10x MCP and ask it to run a POC on your Splunk logs. The engine runs on your own machine, results in minutes. No account, no credit card.
|
|
38
39
|
2. **[Reporter](https://doc.log10x.com/apps/reporter/)**, Deploy as a DaemonSet alongside your forwarder for cost visibility before logs reach Splunk. Alternatively, the [MCP server](https://github.com/log-10x/log10x-mcp){target="_blank"}'s SIEM-sample tool connects to Splunk via REST API for agentless Splunk-side analysis (no DaemonSet).
|
|
39
|
-
3. **[Receiver](https://doc.log10x.com/apps/receiver/deploy/)**, Deploy via Helm chart alongside your forwarder. Filter mode (sampling) or [Compact mode](https://doc.log10x.com/apps/receiver/compact/) (lossless shrink via the [
|
|
40
|
+
3. **[Receiver](https://doc.log10x.com/apps/receiver/deploy/)**, Deploy via Helm chart alongside your forwarder. Filter mode (sampling) or [Compact mode](https://doc.log10x.com/apps/receiver/compact/) (lossless shrink via the [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/)). ~30 min setup.
|
|
40
41
|
4. **[Retriever](https://doc.log10x.com/apps/retriever/)**, Route events to S3, stream selected data to Splunk on-demand.
|
|
41
42
|
|
|
42
43
|
Each step is independent, start with the cost POC to see your reduction ratio, then move to production when ready.
|
|
@@ -68,11 +69,11 @@ Splunk dashboards, Universal Forwarders, testing on your own environment, HEC in
|
|
|
68
69
|
|
|
69
70
|
**Agentless Splunk analysis:** The [MCP server](https://github.com/log-10x/log10x-mcp){target="_blank"}'s SIEM-sample tool queries Splunk REST API for cost analysis without deploying a DaemonSet.
|
|
70
71
|
|
|
71
|
-
**Compatibility:**
|
|
72
|
+
**Compatibility:** The Receiver and Reporter send to any Splunk HEC endpoint, on Splunk Cloud Platform or Splunk Enterprise. No changes to HEC configuration required. The Log10x App, which expands compact events, supports Splunk Enterprise 9.4 through 10.4.
|
|
72
73
|
|
|
73
74
|
??? tenx-compat "Works with Splunk Enterprise on-premises"
|
|
74
75
|
|
|
75
|
-
**Yes.**
|
|
76
|
+
**Yes.** The Receiver, Reporter and Retriever work with Splunk Enterprise on-premises across single-instance, distributed, and clustered deployments. The Log10x App supports Splunk Enterprise 9.4 through 10.4.
|
|
76
77
|
|
|
77
78
|
On-premises, the Receiver sidecar and Reporter DaemonSet forward to HEC or to Heavy Forwarders, using either HEC token or Heavy Forwarder S2S authentication.
|
|
78
79
|
|
|
@@ -85,234 +86,10 @@ Splunk dashboards, Universal Forwarders, testing on your own environment, HEC in
|
|
|
85
86
|
|
|
86
87
|
**[Retriever](https://doc.log10x.com/apps/retriever/){target="_blank"} for on-premises:** Works with AWS S3, Azure Blobs, and any S3-compatible [object storage](https://doc.log10x.com/run/input/objectStorage/){target="_blank"}. Returns the exact offloaded events to Splunk Enterprise HEC endpoints on-demand.
|
|
87
88
|
|
|
88
|
-
??? tenx-compat "
|
|
89
|
-
|
|
90
|
-
The [10x for Splunk](https://github.com/log-10x/splunk-app){target="_blank"} app expands compact events at search time using a KV Store collection. Here's the complete setup and pilot validation checklist for Splunk Cloud.
|
|
91
|
-
|
|
92
|
-
**Before You Start**
|
|
93
|
-
|
|
94
|
-
- Admin or Power User access to your Splunk Cloud instance
|
|
95
|
-
- Splunk Cloud supporting KV Store (all modern instances do)
|
|
96
|
-
- Ability to create HTTP Event Collector (HEC) tokens
|
|
97
|
-
- Two HEC tokens configured: one for templates (`tenx_dml_raw_json` sourcetype), one for encoded events
|
|
98
|
-
|
|
99
|
-
**Day 1: App Installation & KV Store Setup**
|
|
100
|
-
|
|
101
|
-
1. **Install 10x for Splunk app**
|
|
102
|
-
- [ ] Download from [GitHub](https://github.com/log-10x/splunk-app/releases){target="_blank"}
|
|
103
|
-
- [ ] Upload via Settings > Apps > Install app from file
|
|
104
|
-
- [ ] Restart (if prompted by Splunk Cloud)
|
|
105
|
-
- [ ] Verify: Settings > Apps > Confirm "10x for Splunk" appears in app list
|
|
106
|
-
|
|
107
|
-
2. **Create KV Store collection**
|
|
108
|
-
- [ ] Go to Settings > Advanced Search > Collections
|
|
109
|
-
- [ ] Create new collection named `tenx_dml`
|
|
110
|
-
- [ ] Schema fields (automatically generated, verify all present):
|
|
111
|
-
```
|
|
112
|
-
_key (primary key)
|
|
113
|
-
pattern_hash (string)
|
|
114
|
-
pattern (string)
|
|
115
|
-
pattern_parts (array)
|
|
116
|
-
part_0 (string)
|
|
117
|
-
pattern_terminator (string)
|
|
118
|
-
timestamp_format (string)
|
|
119
|
-
```
|
|
120
|
-
- [ ] Verify: `| inputlookup tenx-dml-lookup | stats count` returns 0 (empty)
|
|
121
|
-
|
|
122
|
-
3. **Create indexes for template data**
|
|
123
|
-
- [ ] **Create `tenx_dml` index** (required for storing templates):
|
|
124
|
-
```
|
|
125
|
-
Settings → Indexes → New Index
|
|
126
|
-
Name: tenx_dml
|
|
127
|
-
Data type: Events
|
|
128
|
-
Max size: 10GB (adjust based on your expected template volume)
|
|
129
|
-
Retention: 30+ days (templates are reference data, not logs)
|
|
130
|
-
```
|
|
131
|
-
Verify: `| rest /services/data/indexes | search title="tenx_dml"`
|
|
132
|
-
- [ ] **Optional: Create separate index for encoded events:**
|
|
133
|
-
```
|
|
134
|
-
Settings → Indexes → New Index
|
|
135
|
-
Name: encoded_events (or your preferred name)
|
|
136
|
-
Data type: Events
|
|
137
|
-
Max size: Depends on log volume
|
|
138
|
-
```
|
|
139
|
-
Or use `main` index if preferred (encoded events are searchable until expansion)
|
|
140
|
-
|
|
141
|
-
4. **Verify props.conf and transforms.conf**
|
|
142
|
-
- [ ] Check Settings > Field Extractions > Verify `tenx_encoded` sourcetype has `REPORT-tenx` extraction
|
|
143
|
-
- [ ] Verify transforms.conf has `tenx-hash-vars-extraction` and `tenx-dml-lookup` defined
|
|
144
|
-
- [ ] If missing, manually add via Settings > Add data > Source type settings
|
|
145
|
-
|
|
146
|
-
**Phase 4: Enable HTTP Event Collector (HEC) globally**
|
|
147
|
-
|
|
148
|
-
4a. **Enable HEC globally** (required before creating tokens):
|
|
149
|
-
- [ ] Settings → Data Inputs → HTTP Event Collector → Global Settings
|
|
150
|
-
- [ ] Toggle "All Tokens" to **ENABLED**
|
|
151
|
-
- [ ] Set Default Input Port: `8088` (or your custom port)
|
|
152
|
-
- [ ] Enable SSL: **YES** (recommended for production)
|
|
153
|
-
- [ ] Click Save
|
|
154
|
-
- [ ] Verify: `| rest /services/data/inputs/http | search disabled=0`
|
|
155
|
-
|
|
156
|
-
4b. **Create HEC Token 1 (for templates)**:
|
|
157
|
-
- [ ] Settings → Data Inputs → HTTP Event Collector → New Token
|
|
158
|
-
- [ ] Name: `tenx-templates`
|
|
159
|
-
- [ ] Source Type: `tenx_dml_raw_json`
|
|
160
|
-
- [ ] Index: `tenx_dml` (created in step 3)
|
|
161
|
-
- [ ] Indexes allowed: `tenx_dml` (restrict to this index only)
|
|
162
|
-
- [ ] Disabled: NO
|
|
163
|
-
- [ ] Click **Save Token**
|
|
164
|
-
- [ ] Copy the token value (save it for later)
|
|
165
|
-
|
|
166
|
-
4c. **Create HEC Token 2 (for encoded events)**:
|
|
167
|
-
- [ ] Settings → Data Inputs → HTTP Event Collector → New Token
|
|
168
|
-
- [ ] Name: `tenx-encoded`
|
|
169
|
-
- [ ] Source Type: `tenx_encoded`
|
|
170
|
-
- [ ] Index: Your target index (where searchable events go)
|
|
171
|
-
- [ ] Indexes allowed: Your target index
|
|
172
|
-
- [ ] Disabled: NO
|
|
173
|
-
- [ ] Click **Save Token**
|
|
174
|
-
- [ ] Copy the token value (save it for later)
|
|
175
|
-
|
|
176
|
-
**Week 1: Data Ingestion & KV Store Population**
|
|
177
|
-
|
|
178
|
-
5. **Send template data via HEC** (or via your log forwarder)
|
|
179
|
-
- [ ] **Via curl** (for testing):
|
|
180
|
-
```bash
|
|
181
|
-
SPLUNK_HOST="your-splunk-cloud.splunkcloud.com"
|
|
182
|
-
SPLUNK_PORT="8088"
|
|
183
|
-
HEC_TOKEN="<your-tenx-templates-token>"
|
|
184
|
-
|
|
185
|
-
curl -k https://$SPLUNK_HOST:$SPLUNK_PORT/services/collector/event \
|
|
186
|
-
-H "Authorization: Splunk $HEC_TOKEN" \
|
|
187
|
-
-H "Content-Type: application/json" \
|
|
188
|
-
-d '{
|
|
189
|
-
"event": {
|
|
190
|
-
"templateHash": "abc123def456",
|
|
191
|
-
"template": "User %s logged in from %s",
|
|
192
|
-
"templateParts": ["User", "logged in from"]
|
|
193
|
-
},
|
|
194
|
-
"sourcetype": "tenx_dml_raw_json",
|
|
195
|
-
"index": "tenx_dml"
|
|
196
|
-
}'
|
|
197
|
-
```
|
|
198
|
-
- [ ] **Via Fluentd/Fluent Bit:** Configure your forwarder output to send to this HEC endpoint with same token and sourcetype
|
|
199
|
-
- [ ] Verify templates arriving: `index=tenx_dml sourcetype=tenx_dml_raw_json | head 10`
|
|
200
|
-
|
|
201
|
-
6. **Send encoded events via HEC** (or via your log forwarder)
|
|
202
|
-
- [ ] **Via curl** (for testing):
|
|
203
|
-
```bash
|
|
204
|
-
SPLUNK_HOST="your-splunk-cloud.splunkcloud.com"
|
|
205
|
-
SPLUNK_PORT="8088"
|
|
206
|
-
HEC_TOKEN="<your-tenx-encoded-token>"
|
|
207
|
-
|
|
208
|
-
curl -k https://$SPLUNK_HOST:$SPLUNK_PORT/services/collector/event \
|
|
209
|
-
-H "Authorization: Splunk $HEC_TOKEN" \
|
|
210
|
-
-H "Content-Type: application/json" \
|
|
211
|
-
-d '{
|
|
212
|
-
"event": "~abc123def456,admin,192.168.1.1",
|
|
213
|
-
"sourcetype": "tenx_encoded",
|
|
214
|
-
"index": "main"
|
|
215
|
-
}'
|
|
216
|
-
```
|
|
217
|
-
- [ ] **Via Fluentd/Fluent Bit:** Configure your forwarder output to send to this HEC endpoint with same token and sourcetype
|
|
218
|
-
- [ ] Verify encoded events arriving: `index=main sourcetype=tenx_encoded | head 10`
|
|
219
|
-
|
|
220
|
-
7. **Wait for KV Store population**
|
|
221
|
-
- [ ] The "Consume KV" saved search runs every 2 minutes (automatic)
|
|
222
|
-
- [ ] Check: `index=_internal savedsearch_name="Consume KV" | table _time, status, result_count` (verify no errors)
|
|
223
|
-
- [ ] Check KV store: `| inputlookup tenx-dml-lookup | stats count` (should be > 0 after 2-3 min)
|
|
224
|
-
|
|
225
|
-
8. **Monitor template consumption**
|
|
226
|
-
- [ ] Run: `sourcetype=tenx_dml_pure | stats count` (confirms templates are searchable; this sourcetype lands in the index set by `dest_dml_index`, `main` by default)
|
|
227
|
-
- [ ] Run: `| inputlookup tenx-dml-lookup | head 5 | table _key, pattern, timestamp_format` (verify structure)
|
|
228
|
-
|
|
229
|
-
**Week 2: Expansion Validation & Performance Testing**
|
|
230
|
-
|
|
231
|
-
9. **Test basic expansion**
|
|
232
|
-
- [ ] Run: `index=your_target_index sourcetype=tenx_encoded | head 10 | \`tenx-inflate\``
|
|
233
|
-
- [ ] Verify: All fields (`_raw`, `_time`, `host`, `source`, etc.) are restored to original values
|
|
234
|
-
- [ ] Check: No `tenx_hash`, `tenx_var_*` fields remain in final output (cleanup working)
|
|
235
|
-
|
|
236
|
-
10. **Test debug mode**
|
|
237
|
-
- [ ] Run: `index=your_target_index sourcetype=tenx_encoded | head 1 | \`tenx-inflate-debug\` | table *`
|
|
238
|
-
- [ ] Verify: `_raw` field matches original (unencoded) log format
|
|
239
|
-
- [ ] Check: `tenx_ts_sec` correctly detects timestamp precision (milliseconds vs nanoseconds)
|
|
240
|
-
|
|
241
|
-
11. **Test field extractions and searches post-expansion**
|
|
242
|
-
- [ ] Run existing saved search/dashboard on expanded data
|
|
243
|
-
- [ ] Verify: All field extractions work (extractions applied post-expansion)
|
|
244
|
-
- [ ] Check: Alerts trigger correctly on expanded events
|
|
245
|
-
- [ ] Compare: Results match pre-optimization historical logs (sample query on same time range)
|
|
246
|
-
|
|
247
|
-
12. **Measure search performance**
|
|
248
|
-
- [ ] Run: `index=your_target_index sourcetype=tenx_encoded earliest=-1h | \`tenx-inflate\` | stats count`
|
|
249
|
-
- [ ] Note: The `tenx-inflate` macro adds a per-event decode step at search time; expect a small overhead relative to searching un-encoded events
|
|
250
|
-
- [ ] Compare: Same query without expansion vs with expansion, and validate the overhead on your own data volume
|
|
251
|
-
|
|
252
|
-
**Post-Pilot: Production Deployment**
|
|
253
|
-
|
|
254
|
-
13. **Enable analytics dashboard**
|
|
255
|
-
- [ ] Open: App launcher > 10x for Splunk > Analytics Dashboard
|
|
256
|
-
- [ ] Verify: Shows total compact events, reduction ratio, storage savings
|
|
257
|
-
- [ ] Check: Panels populate when opened (the dashboard runs its searches on view)
|
|
258
|
-
|
|
259
|
-
14. **Set up monitoring and alerts**
|
|
260
|
-
- [ ] Monitor KV store size: `| inputlookup tenx-dml-lookup | stats count` (alert on growth or error against the threshold you set)
|
|
261
|
-
- [ ] Monitor expansion failures: Check tenx app logs for errors
|
|
262
|
-
- [ ] Optional: Set up dashboard for Splunk license impact (GB before/after)
|
|
263
|
-
|
|
264
|
-
15. **Risk Mitigation & Rollback**
|
|
265
|
-
- [ ] **Rollback procedure:** Simply disable 10x for Splunk app:
|
|
266
|
-
1. Settings > Apps > 10x for Splunk > Disable
|
|
267
|
-
2. Re-run searches without `\`tenx-inflate\`` macro (searches work on encoded raw data until disabled)
|
|
268
|
-
3. KV Store collection remains; can re-enable app without data loss
|
|
269
|
-
- [ ] **Zero data loss:** Encoded events remain in index; templates preserved in KV Store
|
|
270
|
-
- [ ] **Retention:** Configure KV Store collection retention if needed (Settings > Collections)
|
|
271
|
-
|
|
272
|
-
**Splunk Cloud Limitations & Workarounds**
|
|
273
|
-
|
|
274
|
-
- **No custom Python alert actions**, Covered. App uses standard KV Store and Search hooks (no custom Python required)
|
|
275
|
-
- **Limited app customization**, App config available in local/default folders; can override via local/ without modifying default/
|
|
276
|
-
- **Network egress**, All data stays within Splunk Cloud. No external calls needed after app installation
|
|
277
|
-
- **KV Store max size**, Bounded by your Splunk KV Store limits, one entry per template. Monitor via `| inputlookup tenx-dml-lookup | stats count`. If approaching your limit, consider archiving old templates
|
|
278
|
-
|
|
279
|
-
**Forwarder Configuration Examples**
|
|
280
|
-
|
|
281
|
-
**Fluentd:**
|
|
282
|
-
```yaml
|
|
283
|
-
<match encoded_events>
|
|
284
|
-
@type http_buffered
|
|
285
|
-
endpoint_url https://<splunk-host>:8088/services/collector/event
|
|
286
|
-
serializer json
|
|
287
|
-
auth_type basic
|
|
288
|
-
auth_key "Splunk <your-hec-token>"
|
|
289
|
-
<buffer>
|
|
290
|
-
flush_interval 10s
|
|
291
|
-
</buffer>
|
|
292
|
-
</match>
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
**Fluent Bit:**
|
|
296
|
-
```ini
|
|
297
|
-
[OUTPUT]
|
|
298
|
-
Name http
|
|
299
|
-
Match *
|
|
300
|
-
Host <splunk-host>
|
|
301
|
-
Port 8088
|
|
302
|
-
URI /services/collector/event
|
|
303
|
-
header Authorization Splunk <your-hec-token>
|
|
304
|
-
header Content-Type application/json
|
|
305
|
-
json_date_key timestamp
|
|
306
|
-
Format json
|
|
307
|
-
```
|
|
89
|
+
??? tenx-compat "Does the Log10x App run on Splunk Cloud Platform"
|
|
308
90
|
|
|
309
|
-
|
|
310
|
-
The Universal Forwarder integration uses a file relay pattern, not a custom forwarder output. Fluent Bit with the 10x sidecar reads logs from the original folder, filters and (optionally) compacts them, and writes the processed output to a second folder. The Universal Forwarder monitors that second folder with a standard `inputs.conf` and ships to the indexers over its normal S2S protocol. The UF keeps its existing configuration; no custom outputs are required.
|
|
91
|
+
The [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/) is tested on Splunk Enterprise 9.4, 10.0, 10.2 and 10.4, and the package passes AppInspect's Splunk Cloud checks. On Splunk Cloud Platform, an uploaded app goes through Splunk's own vetting before it installs.
|
|
311
92
|
|
|
312
|
-
|
|
93
|
+
Setup is the same on both: install the app, create the `tenx_dml` index and two HEC tokens, point the Receiver at them, set the `tenx-events` macro, and run the backfill search once if templates were indexed before the app. The app creates its KV Store collection itself. See the [Quickstart](https://doc.log10x.com/apps/receiver/compact/splunk/#quickstart).
|
|
313
94
|
|
|
314
|
-
|
|
315
|
-
- **Expansion returns empty:** Verify template format in `tenx_dml_raw_json` index, ensure KV Store has matching hash
|
|
316
|
-
- **Performance degradation:** Limit time ranges in searches; filter by `tenx_hash` before expansion for large datasets
|
|
317
|
-
- **HEC token rejected:** Verify token is enabled and not deleted: `| rest /services/data/inputs/http`
|
|
318
|
-
- **For detailed troubleshooting:** See [10x for Splunk Troubleshooting Guide](https://github.com/log-10x/splunk-app#troubleshooting){target="_blank"} on GitHub
|
|
95
|
+
The app runs Python on the search head: the `tenxsearch` command, the `/tenx-search` and `/tenx-alert` endpoints, and the alert action that stores templates. It makes no outbound calls.
|
|
@@ -19,7 +19,7 @@ Cut [Splunk](https://www.log10x.com/splunk.html){target="_blank"} costs by a mod
|
|
|
19
19
|
|
|
20
20
|
- :material-currency-usd: **[Optimization](optimization.md)**
|
|
21
21
|
|
|
22
|
-
How the
|
|
22
|
+
How the Log10x App expands compact events, search-time overhead, license-tier reduction, and what happens to filtered events.
|
|
23
23
|
|
|
24
24
|
- :material-scale-balance: **[Comparisons](comparisons.md)**
|
|
25
25
|
|
|
@@ -3,196 +3,78 @@ icon: material/database-check
|
|
|
3
3
|
title: "KV Store Validation & Diagnostics"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Validating the KV Store, diagnosing "Consume KV"
|
|
6
|
+
Validating the KV Store, diagnosing "Consume KV", loading templates indexed earlier, sizing, and search head clusters.
|
|
7
7
|
|
|
8
8
|
??? tenx-kvstore "How do I validate that KV Store is working correctly"
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Run each search in the Log10x App.
|
|
11
11
|
|
|
12
|
-
1. **
|
|
12
|
+
1. **Templates are arriving:**
|
|
13
|
+
```spl
|
|
14
|
+
index=tenx_dml sourcetype=tenx_dml_raw_json | stats count
|
|
13
15
|
```
|
|
14
|
-
|
|
15
|
-
| search title="tenx_dml"
|
|
16
|
-
```
|
|
17
|
-
Expected: Returns 1 result. If 0 results, collection wasn't created.
|
|
16
|
+
Expected: more than 0. If 0, check the templates HEC token points at `tenx_dml`.
|
|
18
17
|
|
|
19
|
-
2. **
|
|
20
|
-
```
|
|
18
|
+
2. **Templates are stored:**
|
|
19
|
+
```spl
|
|
21
20
|
| inputlookup tenx-dml-lookup | stats count
|
|
22
21
|
```
|
|
23
|
-
Expected:
|
|
22
|
+
Expected: close to the number of distinct templates sent.
|
|
24
23
|
|
|
25
|
-
3. **
|
|
24
|
+
3. **"Consume KV" is running:**
|
|
25
|
+
```spl
|
|
26
|
+
index=_internal sourcetype=scheduler savedsearch_name="Consume KV"
|
|
27
|
+
| stats latest(status) as status, latest(_time) as last_run
|
|
28
|
+
| eval last_run=strftime(last_run, "%F %T")
|
|
26
29
|
```
|
|
27
|
-
|
|
28
|
-
| stats latest(status) as status, latest(_time) as last_run by savedsearch_name
|
|
29
|
-
```
|
|
30
|
-
Expected: `status=success`, `last_run` within last 2 minutes.
|
|
31
|
-
|
|
32
|
-
**If any check fails, see troubleshooting below.**
|
|
30
|
+
Expected: `status=success`, `last_run` within the last 5 minutes.
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
The **Diagnostics** dashboard runs these checks and more on one page.
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
??? tenx-kvstore "\"Consume KV\" is not storing templates"
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
Step 1: Check scheduler logs
|
|
42
|
-
| index=_internal sourcetype=scheduler savedsearch_name="Consume KV"
|
|
43
|
-
| table _time, status, result_count, alert_action
|
|
44
|
-
| stats latest(*) as * by status
|
|
45
|
-
```
|
|
36
|
+
"Consume KV" runs every 5 minutes over the last 7 minutes of `tenx_dml_raw_json` and hands the results to the `tenx_dml_to_kv` alert action, which writes the KV Store.
|
|
46
37
|
|
|
47
|
-
|
|
38
|
+
| Symptom | Cause | Fix |
|
|
39
|
+
|---------|-------|-----|
|
|
40
|
+
| No scheduler entries | The search is disabled | Enable it in **Settings** → **Searches, reports, and alerts** |
|
|
41
|
+
| `success`, KV count stays 0 | No templates in the last 7 minutes | Check the templates token, then run the backfill search below |
|
|
42
|
+
| `success`, KV count stays 0, templates present | The alert action failed | Read `$SPLUNK_HOME/var/log/splunk/tenx_dml_to_kv.log` |
|
|
48
43
|
|
|
49
|
-
|
|
50
|
-
|--------|-------|-----|
|
|
51
|
-
| `error` | Search syntax error in saved search | Edit saved search "Consume KV" and verify query syntax |
|
|
52
|
-
| `success` / count=0 | No templates in `tenx_dml` index | Run: `\| index=tenx_dml \| stats count`, if 0, send templates via HEC |
|
|
53
|
-
| `failure` | Alert action (tenx_dml_to_kv.py) failed | Check: `\| index=_internal sourcetype=action_handler savedsearch_name="Consume KV"` |
|
|
54
|
-
| No results | Search never ran | Verify: Scheduler is enabled (Settings > Scheduled Searches) |
|
|
55
|
-
|
|
56
|
-
**Recovery steps:**
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
1. Verify templates exist:
|
|
60
|
-
| index=tenx_dml sourcetype=tenx_dml_raw_json | stats count
|
|
61
|
-
|
|
62
|
-
2. Force immediate execution:
|
|
63
|
-
Click saved search "Consume KV" > Run
|
|
64
|
-
(Or use: | savedsearch "Consume KV")
|
|
65
|
-
|
|
66
|
-
3. Wait 2 minutes and verify population:
|
|
67
|
-
| inputlookup tenx-dml-lookup | stats count
|
|
68
|
-
(Should show > 0)
|
|
44
|
+
The alert action's log is also searchable:
|
|
69
45
|
|
|
70
|
-
|
|
71
|
-
|
|
46
|
+
```spl
|
|
47
|
+
index=_internal source=*tenx_dml_to_kv.log* (ERROR OR WARNING)
|
|
72
48
|
```
|
|
73
49
|
|
|
74
|
-
??? tenx-kvstore "
|
|
50
|
+
??? tenx-kvstore "Templates were indexed before the app was installed"
|
|
75
51
|
|
|
76
|
-
KV
|
|
52
|
+
"Consume KV" reads only the last 7 minutes, so templates indexed earlier, or while it was disabled or failing, are never stored and their events stay compact.
|
|
77
53
|
|
|
78
|
-
|
|
54
|
+
Run this search once, as an admin or power user:
|
|
79
55
|
|
|
80
|
-
```
|
|
81
|
-
|
|
|
82
|
-
| stats count as num_templates, max(timestamp_format) as latest_update
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**Growth and partitioning guidance:**
|
|
86
|
-
|
|
87
|
-
The KV Store holds one row per template, so size grows with the number of
|
|
88
|
-
templates rather than event volume. Track `num_templates` over time
|
|
89
|
-
and watch expansion latency (query below). If lookup latency climbs well above
|
|
90
|
-
your normal baseline as the template count grows, consider archiving old
|
|
91
|
-
templates or partitioning across collections.
|
|
92
|
-
|
|
93
|
-
**If the template count keeps growing:**
|
|
94
|
-
|
|
95
|
-
Archive old templates by exporting them out of the collection and removing
|
|
96
|
-
them from `tenx_dml`:
|
|
97
|
-
```
|
|
98
|
-
| inputlookup tenx-dml-lookup
|
|
99
|
-
| search timestamp_format < "2024-01-01"
|
|
100
|
-
| ... (export to archive)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
The `tenx-inflate` macro reads a single collection (`tenx_dml`), so keep all
|
|
104
|
-
active templates in that one collection rather than splitting them.
|
|
105
|
-
|
|
106
|
-
**Monitor expansion latency:**
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
index=<your-index> sourcetype=tenx_encoded
|
|
110
|
-
| `tenx-inflate`
|
|
111
|
-
| stats avg(eval(round(relative_time(now(), "now") - _time, 3))) as inflate_latency_sec
|
|
56
|
+
```spl
|
|
57
|
+
index=tenx_dml sourcetype=tenx_dml_raw_json earliest=-30d | sendalert tenx_dml_to_kv
|
|
112
58
|
```
|
|
113
59
|
|
|
114
|
-
|
|
115
|
-
then watch for it rising well above that baseline as the template count grows.
|
|
60
|
+
Widen `earliest` to reach older templates. Templates already stored are skipped, so running it again is safe. The app's **Backfill KV** saved search holds the same search, but the **Run** button does not fire its alert action. Encoded events need no re-indexing: they expand as soon as their template is in the KV Store.
|
|
116
61
|
|
|
117
|
-
??? tenx-kvstore "
|
|
62
|
+
??? tenx-kvstore "How large does the KV Store get"
|
|
118
63
|
|
|
119
|
-
|
|
64
|
+
One row per template, not per event, so size follows the number of distinct templates. The **Analytics** dashboard shows the count as **Active Templates**; the same number from SPL:
|
|
120
65
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
Always verify template population BEFORE sending encoded events:
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
# Wait for this to return > 0:
|
|
66
|
+
```spl
|
|
127
67
|
| inputlookup tenx-dml-lookup | stats count
|
|
128
68
|
```
|
|
129
69
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
1. Load the missing templates
|
|
133
|
-
- Re-send template data via HEC (same format as before)
|
|
134
|
-
- Wait ~2 minutes for "Consume KV" to process (it runs every 2 minutes)
|
|
135
|
-
|
|
136
|
-
2. Re-index the encoded events (optional)
|
|
137
|
-
```
|
|
138
|
-
# If using Kubernetes:
|
|
139
|
-
kubectl delete pod <forwarder-pod-name> # Triggers reprocessing
|
|
140
|
-
|
|
141
|
-
# If using file-based forwarder:
|
|
142
|
-
# Delete offset tracking file, restart forwarder
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
3. Verify recovery:
|
|
146
|
-
```
|
|
147
|
-
| index=<your-index> sourcetype=tenx_encoded
|
|
148
|
-
| head 10 | `tenx-inflate`
|
|
149
|
-
# Should now return expanded events
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
??? tenx-kvstore "Distributed KV Store setup for multi-node Splunk clusters"
|
|
153
|
-
|
|
154
|
-
For production Splunk clusters, KV Store can be:
|
|
155
|
-
- **Replicated** (HA across nodes)
|
|
156
|
-
- **Partitioned** (scaled across multiple collections)
|
|
70
|
+
The `tenx-inflate` macro reads the single `tenx_dml` collection; keep every active template there.
|
|
157
71
|
|
|
158
|
-
|
|
72
|
+
??? tenx-kvstore "Search head clusters"
|
|
159
73
|
|
|
160
|
-
|
|
161
|
-
configuration, so confirm the `tenx_dml` collection is present and consistent
|
|
162
|
-
on each node:
|
|
74
|
+
The `tenx_dml` collection is defined in the app's `default/collections.conf` and replicates with the rest of the cluster's KV Store. Deploy the app to every search head with the deployer. Each member reports the same count:
|
|
163
75
|
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
| rest /servicesNS/nobody/tenx-for-splunk/storage/collections/config
|
|
167
|
-
| search title="tenx_dml"
|
|
168
|
-
| table label, acl{}.perms
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
Each node should return the same collection.
|
|
172
|
-
|
|
173
|
-
**Collection schema:**
|
|
174
|
-
|
|
175
|
-
The `tenx_dml` collection is defined in the app's `default/collections.conf`.
|
|
176
|
-
The `tenx-inflate` macro reads these fields at search time:
|
|
177
|
-
|
|
178
|
-
```
|
|
179
|
-
[tenx_dml]
|
|
180
|
-
field.pattern_hash = string
|
|
181
|
-
field.pattern = string
|
|
182
|
-
field.pattern_parts = array
|
|
183
|
-
field.part_0 = string
|
|
184
|
-
field.pattern_terminator = string
|
|
185
|
-
field.timestamp_format = string
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
**Monitoring cluster KV Store health:**
|
|
189
|
-
|
|
190
|
-
```
|
|
191
|
-
| rest /servicesNS/nobody/tenx-for-splunk/storage/collections/data/tenx_dml
|
|
192
|
-
| stats count as templates_primary
|
|
193
|
-
| append
|
|
194
|
-
[| rest /servicesNS/nobody/tenx-for-splunk/storage/collections/data/tenx_dml
|
|
195
|
-
| stats count as templates_replica]
|
|
76
|
+
```spl
|
|
77
|
+
| inputlookup tenx-dml-lookup | stats count
|
|
196
78
|
```
|
|
197
79
|
|
|
198
|
-
|
|
80
|
+
Only admins and power users can write the collection. The scheduled "Consume KV" search runs on one member, and its writes replicate to the others.
|
|
@@ -3,11 +3,11 @@ icon: material/currency-usd
|
|
|
3
3
|
title: "Optimization"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
How the
|
|
6
|
+
How the Log10x App expands compact events at search time, search-time overhead, potential license-tier reduction, and what happens to events the Receiver filters out.
|
|
7
7
|
|
|
8
|
-
??? tenx-costopt "How does the
|
|
8
|
+
??? tenx-costopt "How does the Log10x App expand optimized events"
|
|
9
9
|
|
|
10
|
-
On Splunk and self-hosted Elasticsearch or OpenSearch, the Receiver compacts events losslessly before they hit Splunk, so the saving lands on your license bill. The open-source [
|
|
10
|
+
On Splunk and self-hosted Elasticsearch or OpenSearch, the Receiver compacts events losslessly before they hit Splunk, so the saving lands on your license bill. The open-source [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/){target="_blank"} keeps that saving invisible to searchers: it automatically expands compact events back to their full original form before displaying results.
|
|
11
11
|
|
|
12
12
|
**How it works:**
|
|
13
13
|
|
|
@@ -30,7 +30,7 @@ How the 10x for Splunk app expands compact events at search time, search-time ov
|
|
|
30
30
|
- Top templates by usage
|
|
31
31
|
- Expansion success rate
|
|
32
32
|
|
|
33
|
-
**User experience:** Classic dashboards keep their panel SPL unchanged. From the search bar a query is wrapped in the app's `tenxsearch` command, since Splunk's search page loads no app JavaScript.
|
|
33
|
+
**User experience:** Classic dashboards keep their panel SPL unchanged. From the search bar a query is wrapped in the app's `tenxsearch` command, since Splunk's search page loads no app JavaScript. Alerts created in the app's Compile Alert view are compiled once into a native saved search. All three read the original full-fidelity data.
|
|
34
34
|
|
|
35
35
|
**Open source:** Available on [GitHub](https://github.com/log-10x/splunk-app){target="_blank"}.
|
|
36
36
|
|
|
@@ -95,7 +95,7 @@ tenx @run/input/forwarder/fluentbit @apps/receiver
|
|
|
95
95
|
# ... destination config
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
-
For Splunk integration see the [
|
|
98
|
+
For Splunk integration see the [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/) documentation. For Kubernetes deployment, add the `log10x/edge-10x` sidecar on top of the official Fluent Bit chart via an `extraContainers` values overlay, see the [Helm chart overlay](https://doc.log10x.com/apps/receiver/deploy/#fluent-bit).
|
|
99
99
|
|
|
100
100
|
## :material-wrench-outline: Config Files
|
|
101
101
|
|
|
@@ -101,7 +101,7 @@ tenx @run/input/forwarder/fluentd @apps/receiver
|
|
|
101
101
|
</label>
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
-
For Splunk integration see the [
|
|
104
|
+
For Splunk integration see the [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/) documentation. For Kubernetes deployment, add the `log10x/edge-10x` sidecar on top of the official Fluentd chart via a kustomize post-renderer overlay, see the [Helm chart overlay](https://doc.log10x.com/apps/receiver/deploy/#fluentd).
|
|
105
105
|
|
|
106
106
|
## :material-wrench-outline: Config Files
|
|
107
107
|
|
|
@@ -139,7 +139,7 @@ service:
|
|
|
139
139
|
exporters: [debug]
|
|
140
140
|
```
|
|
141
141
|
|
|
142
|
-
For Splunk integration see the [
|
|
142
|
+
For Splunk integration see the [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/) documentation. For Kubernetes deployment via the official OpenTelemetry Collector Helm chart see the [Helm sidecar overlay](https://doc.log10x.com/apps/receiver/deploy/#otel-collector).
|
|
143
143
|
|
|
144
144
|
## :material-wrench-outline: Config Files
|
|
145
145
|
|
|
@@ -116,7 +116,7 @@ sinks:
|
|
|
116
116
|
encoding: { codec: json }
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
For Splunk integration see the [
|
|
119
|
+
For Splunk integration see the [Log10x App](https://doc.log10x.com/apps/receiver/compact/splunk/) documentation. For Kubernetes deployment via the official Vector Helm chart see the [Helm sidecar overlay](https://doc.log10x.com/apps/receiver/deploy/#vector).
|
|
120
120
|
|
|
121
121
|
## :material-wrench-outline: Config Files
|
|
122
122
|
|
|
@@ -195,7 +195,6 @@
|
|
|
195
195
|
* [Socket](run/output/event/socket/)
|
|
196
196
|
* [Http](run/output/event/http/)
|
|
197
197
|
* [GitHub](run/output/event/github/)
|
|
198
|
-
* [Dev](run/output/event/dev/)
|
|
199
198
|
* [Custom](run/output/event/outputStream/)
|
|
200
199
|
* [Metric](run/output/metric/index.md)
|
|
201
200
|
* [Prometheus](run/output/metric/prometheus/index.md)
|