Skip to content
Merged
Show file tree
Hide file tree
Changes from 96 commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
4931f6b
feat(log-surgeon)!: Add support for a single capture group in a schem…
davidlion Aug 28, 2025
a7a0be1
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Aug 28, 2025
61d5715
Add schema equals rule capture.
davidlion Aug 28, 2025
daf18ad
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Sep 17, 2025
20b26f9
Address some review comments.
davidlion Sep 18, 2025
b8089f1
Tweak tests.
davidlion Sep 18, 2025
98d1088
Fix wrapped token logic.
davidlion Sep 19, 2025
dc591cd
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Sep 19, 2025
dec9f6e
Fix formatting.
davidlion Sep 19, 2025
03a1f02
Remove wrapping logic by manipulating the token.
davidlion Sep 19, 2025
dee547a
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Nov 19, 2025
65541fb
Update log-surgeon.
davidlion Nov 19, 2025
56bb7a6
Update GrepCore.
davidlion Nov 19, 2025
610e76f
Update log surgeon code + tests with new version.
davidlion Nov 20, 2025
d52a8c3
Merge branch 'main' into capture-support
davidlion Nov 21, 2025
ec2c8f2
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Nov 24, 2025
578601a
Refactor writing a token to dictionaries into a private helper.
davidlion Nov 24, 2025
08d5c0c
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Nov 26, 2025
834fdb7
Add unit test; refactor test-ParserWithUserSchema.cpp.
davidlion Nov 27, 2025
ea1ad3b
Add null + empty check for token type ids.
davidlion Nov 27, 2025
8ce06ba
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Nov 27, 2025
3b36328
Fix coderabbit nits.
davidlion Nov 27, 2025
37df83f
Merge branch 'main' into capture-support
davidlion Dec 8, 2025
d390b9b
feat(deployment): Add `redis`, `queue` (RabbitMQ), and `results-cache…
junhaoliao Dec 8, 2025
5d21c41
feat(api-server): Add support for steaming query result files from S3…
hoophalab Dec 8, 2025
0d4fb24
refactor(webui): Restructure directory hierarchy to better separate P…
davemarco Dec 8, 2025
846a4c8
feat(log-ingestor): Add ingestion job orchestration: (#1740)
LinZhihao-723 Dec 8, 2025
868844d
fix(lint): Ensure linter-suggested fixes are applied before running R…
LinZhihao-723 Dec 8, 2025
eed6bbf
fix(docker): Ignore errors from clp-package dev image removal (fixes …
junhaoliao Dec 9, 2025
78b4c9d
fix(deps): Update the commit hash of `yscope-dev-utils` submodule ini…
Bill-hbrhbr Dec 9, 2025
fe0db96
fix(lint): Strengthen Ruff checks for Python scripts; run error-ignor…
sitaowang1998 Dec 9, 2025
f1fadb3
feat(integration-tests): Validate that the components of the CLP pack…
quinntaylormitchell Dec 9, 2025
73247a9
feat(deployment): Add support for root database credentials in Helm t…
junhaoliao Dec 10, 2025
bd2e23b
feat(clp-package): Add log-ingestor config interface and Docker Compo…
LinZhihao-723 Dec 10, 2025
6c674da
fix(clp-package): Updates decompression script with database name cha…
sitaowang1998 Dec 10, 2025
a01d7f6
docs(clp-package): Add Spider user guide; Update deployment orchestra…
sitaowang1998 Dec 10, 2025
8300068
refactor(clp-package-utils): Simplify `load_config_file` function and…
junhaoliao Dec 10, 2025
5b05b0c
refactor(clp-package): Migrate arg parsing to click in start_clp.py a…
junhaoliao Dec 11, 2025
3f44bab
chore: Remove redundant comments from `credentials.template.yaml` (re…
junhaoliao Dec 11, 2025
8b5472e
feat(integration-tests): Add port range assignment based on a configu…
quinntaylormitchell Dec 12, 2025
c422366
feat(clp-rust-utils): Use `NonEmptyString` in S3-related configs to e…
LinZhihao-723 Dec 13, 2025
96ef44c
feat(core): Add runtime CA bundle path detection for `CurlDownloadHan…
Bill-hbrhbr Dec 14, 2025
633d213
feat(webui): Move timestamp presets into AntD date picker. (#1734)
davemarco Dec 15, 2025
f3dc34a
feat(webui): Add file listing UI for submitting compression jobs for …
junhaoliao Dec 15, 2025
5dc4d8d
feat(clp-s)!: Change how timestamps are specified in the AST and KQL …
gibber9809 Dec 15, 2025
05042f0
refactor(helm): Refactor `createLocalPv`: (#1771)
junhaoliao Dec 16, 2025
0110e58
feat(clp-package): Add support for ingesting from custom S3 endpoints…
hoophalab Dec 16, 2025
39880cc
fix(helm): Improve chart test script (fixes #1782): (#1784)
junhaoliao Dec 16, 2025
7f5cdac
feat(integration-tests): Validate generated package service configura…
quinntaylormitchell Dec 16, 2025
e4a1f08
refactor(clp-s): Add utility functions to create and decompose the ar…
gibber9809 Dec 16, 2025
6d0ebe1
feat(log-ingestor): Add OpenAPI documentation for server APIs; Add Op…
LinZhihao-723 Dec 16, 2025
64cd4c0
feat(webui): Initialize root directory on file lister mount (resolves…
junhaoliao Dec 16, 2025
ef90b7c
docs(openapi): Pre-generate and commit OpenAPI docs instead of genera…
LinZhihao-723 Dec 17, 2025
2545190
refactor(helm): Replace dependency waiting logic with `waitFor` helpe…
junhaoliao Dec 17, 2025
227e65b
ci: Switch "clp-artifact-build" GH workflow to self-hosted runners. (…
jackluo923 Dec 18, 2025
2c3ba39
refactor(webui): Restructure directory hierarchy to better separate P…
davemarco Dec 18, 2025
e38b6ee
feat(helm): Add compression & query job orchestration and the webui t…
junhaoliao Dec 18, 2025
69e2bb9
fix(helm): Replace `database.name` with `database.names.clp` (fixes #…
junhaoliao Dec 19, 2025
ddcc1cf
refactor(helm): Remove unused `query_scheduler.port` from `values.yam…
junhaoliao Dec 19, 2025
00fb71c
fix(clp-mcp-server): Replace `database.name` with `database.names.clp…
junhaoliao Dec 19, 2025
872e5e0
feat(helm): Add readiness and liveness probes to query-scheduler (res…
junhaoliao Dec 19, 2025
7f4f88d
fix(ci): Prevent stale Docker image cache on self-hosted runners (fix…
jackluo923 Dec 19, 2025
e7260ae
docs(log-ingestor): Add user guide for using `log-ingestor`. (#1789)
LinZhihao-723 Dec 19, 2025
711496d
feat(clp-package): Add support for ingesting from custom S3 endpoints…
sudheergajula Dec 20, 2025
672b1e1
feat(helm): Add garbage collector deployment with retention period co…
junhaoliao Dec 20, 2025
599c95a
feat(deployment): Add default fallback for environment variables requ…
junhaoliao Dec 27, 2025
3cf486a
feat(helm): Add API server deployment. (#1818)
junhaoliao Jan 5, 2026
bab87b9
fix(job-orchestration): Set query job duration only when `start_time`…
sitaowang1998 Jan 5, 2026
cef4b88
fix(job-orchestration): Get SQL operation row count before transactio…
sitaowang1998 Jan 5, 2026
a814156
feat(helm): Add MCP server deployment. (#1819)
junhaoliao Jan 5, 2026
451eba5
refactor(helm): Standardize template formatting across deployments: (…
junhaoliao Jan 5, 2026
341a96e
docs: Use IEC size units in comments across the codebase (fixes #1756…
junhaoliao Jan 6, 2026
819fe23
refactor(scripts): Include full `components/core/tools/scripts` direc…
junhaoliao Jan 6, 2026
6a9770c
fix(clp-rust-utils): Align database name config with updated schema. …
Eden-D-Zhang Jan 7, 2026
659cab6
docs(clp-package): Add instructions for ingesting logs from non-AWS S…
hoophalab Jan 7, 2026
ebb28fc
fix(helm): Add missing spider database name configuration (fixes #184…
junhaoliao Jan 7, 2026
bce011a
feat(helm): Add S3 storage support for archives, streams, and log inp…
junhaoliao Jan 7, 2026
8e9628a
feat(kv-ir)!: Add support for matching KQL timestamp literals against…
gibber9809 Jan 8, 2026
ae09063
feat(clp-s::timestamp_parser): Add support for ignoring quotes in quo…
gibber9809 Jan 8, 2026
44ac419
feat(webui): Add dataset and paths to compression job table. (#1798)
davemarco Jan 12, 2026
a42c177
feat(helm): Add `log-ingestor` deployment. (#1856)
junhaoliao Jan 12, 2026
59bd992
feat(clp-package): Add configurable services restart policy for the P…
junhaoliao Jan 12, 2026
4bdfc35
fix(clp-package): Add missing archive output and storage engine setti…
junhaoliao Jan 12, 2026
3e48f1e
fix(docs): Upgrade `sphinxcontrib-mermaid` to v2.0.0; Adjust configur…
junhaoliao Jan 13, 2026
b55f140
fix(webui): Fix dataset handling in compression job creation to use d…
junhaoliao Jan 13, 2026
ef64a1c
feat(core): Optimize subquery generation by narrowing wildcard token …
gibber9809 Jan 13, 2026
a02bb70
feat(helm): Add multi-node deployment support with configurable sched…
junhaoliao Jan 14, 2026
b3b9914
fix(clp-package): Ensure `--count` and `--count-by-time` arguments ar…
junhaoliao Jan 15, 2026
5fee121
Update log surgeon to latest.
davidlion Jan 17, 2026
0fe2ac4
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Jan 17, 2026
9a1ccbe
Forgot to lint.
davidlion Jan 17, 2026
1b6d0c6
Revert accidental dev-utils change.
davidlion Jan 18, 2026
faa36f1
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Jan 18, 2026
3bac58f
Add LogTypeDictionaryEntry::add_static_text and do minor linting/refa…
davidlion Jan 23, 2026
e621e83
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Jan 23, 2026
3b68d9a
Add fallback to storing a token as static text if there is no capture…
davidlion Jan 23, 2026
936d9b0
Missing var_ids.
davidlion Jan 23, 2026
85f6b48
Add fallback to static text if log surgeon returns an empty capture l…
davidlion Jan 23, 2026
1016d84
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Jan 25, 2026
4a5a00a
Rename variables to drop unnecessary/confusing _view suffix.
davidlion Jan 26, 2026
89e4b32
doh
davidlion Jan 26, 2026
1e09594
Address coderabit nit by switching token.to_string to token.to_string…
davidlion Jan 27, 2026
9ce8524
Merge remote-tracking branch 'upstream/main' into capture-support
davidlion Jan 27, 2026
3ade8e4
Remove redundant else branch added by mistake.
davidlion Jan 27, 2026
c3f6b1b
Apply suggestions from code review.
davidlion Jan 28, 2026
247f552
Merge branch 'main' into capture-support
davidlion Jan 28, 2026
c45a55b
Merge branch 'main' into capture-support
davidlion Jan 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion components/core/config/schemas.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ float:\-{0,1}[0-9]+\.[0-9]+
// Dictionary variables
hex:[a-fA-F]+
hasNumber:.*\d.*
equals:.*=.*[a-zA-Z0-9].*
equals:.*=(?<var>.*[a-zA-Z0-9].*)
4 changes: 2 additions & 2 deletions components/core/src/clp/GrepCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,9 +257,9 @@ bool GrepCore::get_bounds_of_next_potential_var(
return false;
}
search_token = SearchToken{token.value()};
search_token.m_type_ids_set.insert(search_token.m_type_ids_ptr->at(0));
search_token.m_type_ids_set.insert(search_token.get_type_ids()->at(0));
}
auto const& type = search_token.m_type_ids_ptr->at(0);
auto const& type = search_token.get_type_ids()->at(0);
if (type != static_cast<int>(log_surgeon::SymbolId::TokenUncaughtString)
&& type != static_cast<int>(log_surgeon::SymbolId::TokenEnd))
{
Expand Down
56 changes: 31 additions & 25 deletions components/core/src/clp/LogTypeDictionaryEntry.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
#include "LogTypeDictionaryEntry.hpp"

#include "EncodedVariableInterpreter.hpp"
#include "ir/parsing.hpp"
#include "ir/types.hpp"
#include "type_utils.hpp"
#include "Utils.hpp"
#include <cstddef>
#include <cstdint>
#include <string>
#include <string_view>

#include <clp/EncodedVariableInterpreter.hpp>
#include <clp/ir/parsing.hpp>
#include <clp/ir/types.hpp>
#include <clp/type_utils.hpp>

namespace clp {
using clp::ir::VariablePlaceholder;
using std::string;
using std::string_view;

namespace clp {
size_t LogTypeDictionaryEntry::get_placeholder_info(
size_t placeholder_ix,
VariablePlaceholder& placeholder
Expand All @@ -34,7 +38,7 @@ size_t LogTypeDictionaryEntry::get_data_size() const {
}

void LogTypeDictionaryEntry::add_constant(
std::string_view value_containing_constant,
string_view value_containing_constant,
size_t begin_pos,
size_t length
) {
Expand Down Expand Up @@ -62,35 +66,37 @@ void LogTypeDictionaryEntry::add_escape() {
++m_num_escaped_placeholders;
}

bool LogTypeDictionaryEntry::parse_next_var(
std::string_view msg,
auto LogTypeDictionaryEntry::add_static_text(string_view static_text) -> void {
ir::append_constant_to_logtype(
static_text,
[&]([[maybe_unused]] string_view constant,
[[maybe_unused]] size_t char_to_escape_pos,
[[maybe_unused]] string& logtype) -> void { add_escape(); },
m_value
);
}

auto LogTypeDictionaryEntry::parse_next_var(
string_view msg,
size_t& var_begin_pos,
size_t& var_end_pos,
std::string_view& var
) {
auto last_var_end_pos = var_end_pos;
// clang-format off
auto escape_handler = [&](
[[maybe_unused]] string_view constant,
[[maybe_unused]] size_t char_to_escape_pos,
string& logtype
) -> void {
m_placeholder_positions.push_back(logtype.size());
++m_num_escaped_placeholders;
logtype += enum_to_underlying_type(VariablePlaceholder::Escape);
};
// clang-format on
string_view& var
) -> bool {
auto const last_var_end_pos{var_end_pos};
auto escape_handler = [&]([[maybe_unused]] string_view constant,
[[maybe_unused]] size_t char_to_escape_pos,
[[maybe_unused]] string& logtype) -> void { add_escape(); };
if (ir::get_bounds_of_next_var(msg, var_begin_pos, var_end_pos)) {
// Append to log type: from end of last variable to start of current variable
auto constant = msg.substr(last_var_end_pos, var_begin_pos - last_var_end_pos);
auto const constant{msg.substr(last_var_end_pos, var_begin_pos - last_var_end_pos)};
ir::append_constant_to_logtype(constant, escape_handler, m_value);

var = msg.substr(var_begin_pos, var_end_pos - var_begin_pos);
return true;
}
if (last_var_end_pos < msg.length()) {
// Append to log type: from end of last variable to end
auto constant = msg.substr(last_var_end_pos, msg.length() - last_var_end_pos);
auto const constant{msg.substr(last_var_end_pos, msg.length() - last_var_end_pos)};
ir::append_constant_to_logtype(constant, escape_handler, m_value);
}

Expand Down
9 changes: 7 additions & 2 deletions components/core/src/clp/LogTypeDictionaryEntry.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ class LogTypeDictionaryEntry : public DictionaryEntry<logtype_dictionary_id_t> {
*/
void add_escape();

/**
* Adds static text to the logtype escaping any placeholder characters.
Comment thread
davidlion marked this conversation as resolved.
Resolved
*/
auto add_static_text(std::string_view static_text) -> void;

/**
* Parses next variable from a message, constructing the constant part of the message's logtype
* as well
Expand All @@ -103,12 +108,12 @@ class LogTypeDictionaryEntry : public DictionaryEntry<logtype_dictionary_id_t> {
* @param var
* @return true if another variable was found, false otherwise
*/
bool parse_next_var(
auto parse_next_var(
std::string_view msg,
size_t& var_begin_pos,
size_t& var_end_pos,
std::string_view& var
);
) -> bool;

/**
* Reserves space for a constant of the given length
Expand Down
13 changes: 12 additions & 1 deletion components/core/src/clp/LogTypeDictionaryEntryReq.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ concept LogTypeDictionaryEntryReq = requires(
std::string_view& parsed_var_ref,
size_t begin_pos,
size_t placeholder_idx,
ir::VariablePlaceholder& placeholder_ref
ir::VariablePlaceholder& placeholder_ref,
std::string_view static_text
) {
/**
* Clears all internal state.
Expand Down Expand Up @@ -74,6 +75,16 @@ concept LogTypeDictionaryEntryReq = requires(
*/
{ entry.add_dictionary_var() } -> std::same_as<void>;

/**
* Adds an escape character
Comment thread
davidlion marked this conversation as resolved.
Resolved
*/
{ entry.add_escape() } -> std::same_as<void>;

/**
* Adds static text to the logtype escaping any placeholder characters.
Comment thread
davidlion marked this conversation as resolved.
Resolved
*/
{ entry.add_static_text(static_text) } -> std::same_as<void>;

/**
* @return The constant part of the logtype.
*/
Expand Down
25 changes: 17 additions & 8 deletions components/core/src/clp/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <iostream>
#include <memory>
#include <set>
#include <string>

#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
Expand Down Expand Up @@ -140,10 +141,8 @@ load_lexer_from_file(std::string const& schema_file_path, log_surgeon::lexers::B
lexer.m_symbol_id[log_surgeon::cTokenInt] = static_cast<int>(log_surgeon::SymbolId::TokenInt);
lexer.m_symbol_id[log_surgeon::cTokenFloat]
= static_cast<int>(log_surgeon::SymbolId::TokenFloat);
lexer.m_symbol_id[log_surgeon::cTokenFirstTimestamp]
= static_cast<int>(log_surgeon::SymbolId::TokenFirstTimestamp);
lexer.m_symbol_id[log_surgeon::cTokenNewlineTimestamp]
= static_cast<int>(log_surgeon::SymbolId::TokenNewlineTimestamp);
lexer.m_symbol_id[log_surgeon::cTokenHeader]
= static_cast<int>(log_surgeon::SymbolId::TokenHeader);
// cTokenNewline is not added in schema_vars and can be explicitly added as '\n' to catch the
// end of non-timestamped log messages
lexer.m_symbol_id[log_surgeon::cTokenNewline]
Expand All @@ -155,10 +154,8 @@ load_lexer_from_file(std::string const& schema_file_path, log_surgeon::lexers::B
lexer.m_id_symbol[static_cast<int>(log_surgeon::SymbolId::TokenInt)] = log_surgeon::cTokenInt;
lexer.m_id_symbol[static_cast<int>(log_surgeon::SymbolId::TokenFloat)]
= log_surgeon::cTokenFloat;
lexer.m_id_symbol[static_cast<int>(log_surgeon::SymbolId::TokenFirstTimestamp)]
= log_surgeon::cTokenFirstTimestamp;
lexer.m_id_symbol[static_cast<int>(log_surgeon::SymbolId::TokenNewlineTimestamp)]
= log_surgeon::cTokenNewlineTimestamp;
lexer.m_id_symbol[static_cast<int>(log_surgeon::SymbolId::TokenHeader)]
= log_surgeon::cTokenHeader;
lexer.m_id_symbol[static_cast<int>(log_surgeon::SymbolId::TokenNewline)]
= log_surgeon::cTokenNewline;

Expand Down Expand Up @@ -187,6 +184,18 @@ load_lexer_from_file(std::string const& schema_file_path, log_surgeon::lexers::B
for (std::unique_ptr<log_surgeon::ParserAST> const& parser_ast : schema_ast->m_schema_vars) {
auto* rule = dynamic_cast<log_surgeon::SchemaVarAST*>(parser_ast.get());

// Currently, we only support at most a single capture group in each variable. If a capture
// group is present its match will be treated as the variable rather than the full match.
auto const num_captures = rule->m_regex_ptr->get_subtree_positive_captures().size();
if (1 < num_captures) {
throw std::runtime_error(
schema_file_path + ":" + std::to_string(rule->m_line_num + 1)
+ ": error: the schema rule '" + rule->m_name
+ "' has a regex pattern containing > 1 capture groups (found "
+ std::to_string(num_captures) + ").\n"
);
}

Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
Comment thread
davidlion marked this conversation as resolved.
Resolved
if ("timestamp" == rule->m_name) {
continue;
}
Expand Down
Loading
Loading