SQE Local Lab is a local .NET application that emulates the core behavior of Geneva Standing Query Extension (SQE).
The project demonstrates how telemetry events are:
- Generated
- Serialized to JSON
- Written to an event stream
- Evaluated against standing queries
- Converted into metric points
- Aggregated by dimensions
- Emitted as metric outputs
Everything runs locally without:
- Geneva
- Monitoring Agent
- ETW
- Kusto
- Azure dependencies
This project is intended purely for learning and understanding the SQE processing model.
OrderEvent
β
StandingQueryDefinition
β
LocalTelemetryPipeline
β
LocalStandingQueryEvaluator
β
QueryEvaluationResult
β
LocalMetricPointFactory
β
MetricPoint
β
LocalMetricAggregator
β
AggregatedMetricPoint
SqeLocalLab
β
βββ Config
β βββ queries.json
β
βββ Engine
β βββ LocalMetricAggregator.cs
β βββ LocalMetricPointFactory.cs
β βββ LocalStandingQueryEvaluator.cs
β βββ QueryEvaluationResult.cs
β
βββ Models
β βββ AggregatedMetricPoint.cs
β βββ MetricPoint.cs
β βββ OrderEvent.cs
β βββ StandingQueryDefinition.cs
β
βββ Pipeline
β βββ LocalTelemetryPipeline.cs
β βββ PipelineExecutionResult.cs
β
βββ output
β βββ events.jsonl
β βββ metrics.jsonl
β βββ aggregated-metrics.jsonl
β
βββ Program.cs
Telemetry events are represented using:
OrderEventExample:
OrderProcessed
StatusCode = 500
OrderId = ORD-002
Events are serialized using:
JsonSerializer.Serialize(...)and written to:
output/events.jsonl
Example:
{"statusCode":200}
{"statusCode":500}
{"statusCode":503}Purpose:
Simulate an incoming telemetry stream
Queries are loaded from:
Config/queries.json
Example:
{
"name": "FailedOrders",
"filter": {
"eventName": "OrderProcessed",
"minimumStatusCode": 500
}
}Purpose:
Separate business rules from code
Events are evaluated using:
LocalStandingQueryEvaluatorResult:
QueryEvaluationResultPossible outcomes:
MATCHED
NOT MATCHED
Example:
StatusCode = 200
β NOT MATCHED
StatusCode = 500
β MATCHED
StatusCode = 503
β MATCHED
Matched evaluations are converted into:
MetricPointusing:
LocalMetricPointFactoryOutput:
output/metrics.jsonl
Example:
{
"name": "FailedOrderCount",
"value": 1
}Concept:
Match
β
Metric Contribution
The metric factory extracts configured dimensions.
Example dimensions:
data.operationName
data.statusCode
ext.environment
Possible result:
operationName = CreateOrder
statusCode = 500
environment = Local
Raw metric points are aggregated using:
LocalMetricAggregatorResult:
AggregatedMetricPointOutput:
output/aggregated-metrics.jsonl
A metric series is determined by:
Metric Name
+
Dimension Set
=
Time Series
Example:
Dimensions:
operationName
environment
Results:
MetricPoint #1
CreateOrder
Local
MetricPoint #2
CreateOrder
Local
Aggregate:
FailedOrderCount = 2
Dimensions:
operationName
statusCode
environment
Results:
CreateOrder
500
Local
and
CreateOrder
503
Local
Aggregate:
FailedOrderCount(status=500) = 1
FailedOrderCount(status=503) = 1
Two separate metric series are produced because the dimension values differ.
The processing engine is encapsulated inside:
LocalTelemetryPipelinePurpose:
Program.cs
β
Pipeline
β
Evaluator
β
Metric Factory
β
Aggregator
This separates orchestration from processing logic.
Contains all generated events.
Example:
{"statusCode":200}
{"statusCode":500}
{"statusCode":503}Contains raw metric contributions.
Example:
{
"name":"FailedOrderCount",
"value":1
}One line per metric contribution.
Contains aggregated metrics.
Example:
{
"name":"FailedOrderCount",
"value":2
}One line per final metric series.
A separate project validates all behavior:
SqeLocalLab.SelfTests
Result:
Passed: 8
Failed: 0
Input:
StatusCode = 200
Expected:
NOT MATCHED
Validates:
Query filtering
Input:
StatusCode = 500
Expected:
MATCHED
Validates:
Boundary condition
Expected:
MetricPoint created
Value = 1
Validates:
Metric generation
Expected:
Required dimensions exist
Validates:
Dimension extraction
Expected:
1 aggregate
Value = 2
Validates:
Grouping behavior
Expected:
2 aggregates
Validates:
Dimension-based separation
Expected:
InvalidOperationException
Validates:
Configuration validation
Expected:
Metric creation blocked
Validates:
System correctness
By completing this project, you implemented and understood:
- Telemetry event modeling
- JSON serialization
- JSONL event streams
- Standing query configuration
- Query evaluation
- Metric generation
- Dimension extraction
- Metric aggregation
- Time-series concepts
- Pipeline architecture
- Automated testing
- Configuration validation
β Local telemetry event stream
β Standing query engine
β Metric generation
β Dimension extraction
β Metric aggregation
β Pipeline abstraction
β Automated validation
β 8/8 tests passing
β Fully local execution
The application now serves as a small but complete SQE-style telemetry processing engine that can be extended with additional query operators, aggregations, dimensions, time-windowing, and more advanced event sources.