Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
64808ca
stub out a simple metrics collector for the sampler
KodrAus Jan 20, 2026
4a532aa
fill in initial metric support in sample ingest
KodrAus Jan 21, 2026
c7d6334
add some counters for order status
KodrAus Jan 21, 2026
5f1b3b2
align naming of request duration metric to conventions
KodrAus Jan 21, 2026
3b1c27d
align metric names to Serilog conventions
KodrAus Jan 21, 2026
9face8b
Merge pull request #440 from KodrAus/feat/sample-metrics
KodrAus Jan 21, 2026
ca100ec
update to .NET 10
KodrAus Jan 21, 2026
eab25ef
update some missed .NET version refs
KodrAus Jan 21, 2026
52cbdac
update libicu on arm
KodrAus Jan 21, 2026
111440e
Merge pull request #441 from KodrAus/chore/dotnet-10
nblumhardt Jan 22, 2026
759ad88
Use Sum rather than Counter for sample delta-temporality counter metr…
nblumhardt Feb 5, 2026
b795597
Merge pull request #443 from nblumhardt/metric-kind-fix
KodrAus Feb 5, 2026
1128e7a
feat: Add `seqcli events delete` command
mloskot Feb 19, 2026
2595110
fix up naming of order metrics
KodrAus Feb 23, 2026
22df463
Added missing `.` in metric descriptions.
nblumhardt Feb 23, 2026
31e34a4
Merge pull request #445 from mloskot/ml/feat/command-events-delete
nblumhardt Feb 23, 2026
2c64f43
Merge pull request #446 from KodrAus/fix/metrics
nblumhardt Feb 23, 2026
ec27789
Add note on environment variable support to README.md
nblumhardt Mar 26, 2026
1f25ced
Give test processes more time to exit cleanly
nblumhardt Mar 27, 2026
a538cf6
Merge pull request #450 from nblumhardt/extend-process-exit-timeout
nblumhardt Mar 27, 2026
1f0b5d4
.NET SDK update
nblumhardt Mar 27, 2026
f96c300
Whitespace edit to force a fresh CI run
nblumhardt Mar 27, 2026
4d541c8
track active readers/appenders in test filesystem
KodrAus Mar 27, 2026
e3fb80d
return correct file when replacing in tests
KodrAus Mar 28, 2026
d8f6d59
rework chunk filling logic, fixing multiple issues
KodrAus Mar 30, 2026
a92f0af
dispose files before trying to delete them
KodrAus Mar 30, 2026
d2bc708
update chunk file name
KodrAus Mar 30, 2026
eb13448
Merge pull request #451 from KodrAus/fix/invalid-delete
nblumhardt Mar 30, 2026
d02abf5
Santize trace and span ids to avoid deserialization errors when hosti…
nblumhardt Mar 31, 2026
8446d41
Merge pull request #452 from nblumhardt/suppress-host-deserialization…
nblumhardt Mar 31, 2026
973f868
Allow CI workflows to be initiated manually
nblumhardt Mar 31, 2026
e9643c1
Merge pull request #453 from nblumhardt/manual-ci-workflows
nblumhardt Mar 31, 2026
98039e9
Update baseversion to 2026.1; `dev` now uses the .NET SDK matching Se…
nblumhardt Mar 31, 2026
82fd409
Detect and drop all-zero trace/span/parent ids
nblumhardt Apr 8, 2026
758a2f1
Merge pull request #454 from nblumhardt/detect-zero-traceids
nblumhardt Apr 8, 2026
61006d3
Dependency/SDK updates; waiting on a Seq.Api 2026.1 build
nblumhardt May 7, 2026
e478234
Include `seqcli view *` commands and other metrics updates
nblumhardt May 7, 2026
2b43664
Update inconsistent copyright headers
nblumhardt May 7, 2026
8727d75
Update retention policy test case to use 2025.2-compatible features; …
nblumhardt May 7, 2026
63ad195
Misssing ignoreCase: true
nblumhardt May 7, 2026
6b5db65
Merge pull request #456 from nblumhardt/2026-dependency-updates
KodrAus May 8, 2026
00d8d0f
Update Actions dependencies to latest
nblumhardt May 8, 2026
c29057e
Merge pull request #457 from nblumhardt/dev
nblumhardt May 8, 2026
4d4940c
Mark SeqCli.EndToEnd as a non-test project so that it's not picked up…
May 26, 2026
184952b
seqcli skills install command
May 26, 2026
b3a4062
More skill WIP
May 29, 2026
f1784c6
More skill WIP
May 29, 2026
588230d
More skill and tool WIP
May 29, 2026
229bee3
More skill and tool WIP
May 29, 2026
f22d041
More fixes
May 29, 2026
9cb90ee
More WIP
May 29, 2026
1b47da1
Minor tweaks
May 29, 2026
aaaeb41
Remove .claude and add to .gitignore
May 30, 2026
2229605
Minimal tests for identifier generation
May 30, 2026
76a6cec
OTel property name accessor gotcha
May 30, 2026
c19d839
More gotchas; these are a useful catalog of papercuts we might actual…
May 30, 2026
9f131b9
Get the (implemented) integration tests running.
May 30, 2026
8ca84d5
Added a simple MCP end-to-end test case.
May 30, 2026
ae29b25
Add tests for SeqSyntaxFormatter.
May 30, 2026
093bccd
A first cut `mcp install` command.
May 30, 2026
c2eb030
Tidy up.
May 31, 2026
4d4f68f
Increase test coverage for McpSession.
May 31, 2026
cb5ed21
Add seq_new_session endpoint to clear state.
May 31, 2026
3380f5f
Factor some orthogonal API helpers out of the (crowded) tool class
May 31, 2026
4915842
Skill updates, add `mcp install` support for Qwen Code.
May 31, 2026
aa344ae
Use the example trace id consistently
May 31, 2026
6dd69db
More skill tweaks
May 31, 2026
40a1ae4
More skill tweaks
May 31, 2026
0e2de67
Update SKILL.md to remove deprecated operators
nblumhardt May 31, 2026
9cf0288
Review feedback, reduce SKILL.md token count by dropping out table/gr…
nblumhardt Jun 1, 2026
ce69818
Merge pull request #458 from nblumhardt-ro/feature/mcp
nblumhardt Jun 1, 2026
d343c76
Update skill, fix some CLI bugs and paper cuts
Jun 2, 2026
0d6eede
seq_list_signals tool
Jun 2, 2026
7952cc9
Fixes
Jun 2, 2026
b012068
Signal tool usage tests.
Jun 2, 2026
3aeb12b
Imporove signal list tests, use structured tool results for signal li…
Jun 2, 2026
757a2e6
Command aliases header
Jun 2, 2026
20cc455
Merge pull request #460 from nblumhardt-ro/cli-skill-updates
nblumhardt Jun 3, 2026
f5eeb63
Fix error reporting in `seqcli query`
nblumhardt Jun 3, 2026
f827f1f
Get rid of spaces trailing commas
nblumhardt Jun 3, 2026
9a535a0
Remove the data resource group helper, make sure views are exported b…
nblumhardt Jun 3, 2026
6cef52e
Refactor CSV writing
nblumhardt Jun 3, 2026
df3c094
Merge pull request #461 from nblumhardt/query-syntax-errors
nblumhardt Jun 3, 2026
29e4983
Nudge towards using signals in the skill
Jun 3, 2026
e08549b
Merge pull request #462 from nblumhardt-ro/signal-nudge
nblumhardt Jun 3, 2026
a7afcb6
Include sum in the sample Roastery histogram
nblumhardt Jun 3, 2026
393aa90
NuGet package updates
nblumhardt Jun 3, 2026
b278a4c
Merge pull request #464 from nblumhardt/package-updates-01
KodrAus Jun 3, 2026
5e1cde9
Merge pull request #463 from nblumhardt/roastery-histogram
KodrAus Jun 3, 2026
1921d1b
Extend MCP and skills install commands to cover more agents and corre…
Jun 3, 2026
e327c26
Tidy up extended MCP/skill installers
nblumhardt Jun 3, 2026
67c8d74
A little more feedback for the user
nblumhardt Jun 3, 2026
0e78d6f
Merge pull request #465 from nblumhardt-ro/updated-agent-installers
nblumhardt Jun 3, 2026
98dc158
README updates to point out preview MCP/agent skills
nblumhardt Jun 3, 2026
fb9aef6
Update `dashboard render` to accept `--native`
Jun 5, 2026
c159ea3
Merge pull request #466 from nblumhardt-ro/dashboard-native-rendering
KodrAus Jun 5, 2026
f88b446
Start work on metrics command group
Jun 5, 2026
d3e2e60
Dimensions command
Jun 5, 2026
2fe4cff
Dimension (values) command
Jun 5, 2026
e51e65e
Metrics CLI tests
Jun 5, 2026
bf8b46a
Metrics MCP tools
Jun 7, 2026
cae41fe
Port metrics CLI tests to cover the metrics MCP tools. Groups argumen…
Jun 7, 2026
88a70cb
Mark the Usage: seqcli <command> [<args>]
nblumhardt Jun 7, 2026
5da0565
Merge pull request #467 from nblumhardt/forwarder-non-pre
KodrAus Jun 7, 2026
6e01fc8
Fix string[] parameter binding
nblumhardt Jun 8, 2026
7f95d88
Invoke Deserialize() as an extension method
nblumhardt Jun 8, 2026
46e6cad
Quick README fix for non-pre Forwarder commands
nblumhardt Jun 8, 2026
12ffbf7
Add the app building skill
nblumhardt Jun 8, 2026
9b4fc2a
Merge pull request #469 from nblumhardt/apps-skill
KodrAus Jun 8, 2026
2b76a4c
Drop out Autofac from `mcp run` - yesterday's hack isn't holding up, …
Jun 9, 2026
02dc5db
PR feedback, basic metrics skill, fixes
Jun 9, 2026
4cd44a5
Patch up skill size test
nblumhardt Jun 9, 2026
f5c4611
Merge pull request #468 from nblumhardt/metrics-commands-2
nblumhardt Jun 9, 2026
d1cc303
Add a query example for exponentially bucketed histograms
nblumhardt Jun 9, 2026
572578a
Merge pull request #470 from nblumhardt/exponential-examples
nblumhardt Jun 9, 2026
69970f0
Update app building skill with publishing gotcha
nblumhardt Jun 10, 2026
f427e9c
Fix note pointing out @sa property name
nblumhardt Jun 10, 2026
38c8565
Merge pull request #471 from nblumhardt/app-skill-publishing
nblumhardt Jun 10, 2026
9fd5d01
use executing binary path for install command
KodrAus Jun 12, 2026
3977570
Merge pull request #472 from KodrAus/fix/windows-forwarder-install
nblumhardt Jun 12, 2026
c8d70ec
Final 2026.1 dependency updates
nblumhardt Jul 13, 2026
a74adf5
Avoid a vulnerable Microsoft.Bcl.Memory version
nblumhardt Jul 13, 2026
d971230
Merge pull request #473 from nblumhardt/dependency-updates-260713
KodrAus Jul 13, 2026
2e09823
Merge branch 'main' into dev
nblumhardt Jul 13, 2026
5bf7614
Fix test project package reference
nblumhardt Jul 13, 2026
7a0d73b
Switched package/project reference
nblumhardt Jul 13, 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
23 changes: 15 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,18 @@ on:
branches: [ "dev", "main" ]
pull_request:
branches: [ "dev", "main" ]
workflow_dispatch:
inputs:
publish:
description: 'Publish a GitHub release'
type: boolean
required: true
default: true

env:
CI_BUILD_NUMBER_BASE: ${{ github.run_number }}
CI_TARGET_BRANCH: ${{ github.head_ref || github.ref_name }}
CI_PUBLISH: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
CI_PUBLISH: ${{ (github.event_name == 'push' && github.ref_name == 'main') || inputs.publish }}

jobs:
build-windows:
Expand All @@ -22,11 +29,11 @@ jobs:
contents: write

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Setup
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x
- name: Build and Publish
env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
Expand All @@ -38,17 +45,17 @@ jobs:

build-linux:
name: Build (Linux)
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04

permissions:
contents: write

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Setup
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x
- name: Configure Docker
run: |
docker run --privileged --rm linuxkit/binfmt:bebbae0c1100ebf7bf2ad4dfb9dfd719cf0ef132
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -292,3 +292,7 @@ __pycache__/
global.json

.DS_Store/

.claude/
.qwen/
.agents/
34 changes: 28 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ seqcli config set -k connection.serverUrl -v https://your-seq-server
seqcli config set -k connection.apiKey -v your-api-key
```

The API key will be stored in your `SeqCli.json` configuration file; on Windows, this is encrypted using DPAPI; on Mac/Linux the key is stored in plain text unless an encryptor is defined in `encryption.encryptor`. As an alternative to storing the API key in configuration, it can be passed to each command via the `--apikey=` argument.
The API key will be stored in your `SeqCli.json` configuration file; on Windows, this is encrypted using DPAPI; on Mac/Linux the key is stored in
plain text unless an encryptor is defined in `encryption.encryptor`. As an alternative to storing the server URL and API key in configuration,
they can be passed to each command via the `--server=` and `--apikey=` arguments, or in the `SEQCLI_CONNECTION_SERVERURL` and
`SEQCLI_CONNECTION_APIKEY` environment variables.

`seqcli` is also available as a Docker container under [`datalust/seqcli`](https://store.docker.com/community/images/datalust/seqcli):

Expand Down Expand Up @@ -55,6 +58,28 @@ $token = (
)
```

### MCP and agent skills

The 2026.1 preview improves support for agent-driven diagnostics workflows:

```
dotnet tool install -g seqcli --prerelease
```

For skill installation:

```
seqcli skills install -a <agent> [--global]
```

For local MCP server installation:

```
seqcli mcp install -a <agent> [--global]
```

Credentials are set using configuration and environment variables as described above.

## Contributing

See `CONTRIBUTING.md`.
Expand Down Expand Up @@ -1843,7 +1868,7 @@ PS > seqcli signal list -i signal-m33302 --json
{"Title": "Alarms", "Description": "Automatically created", "Filters": [{"De...
```

## Store-and-forward ingestion proxy (preview)
## Store-and-forward ingestion proxy

The `seqcli forwarder` family of commands provide simple, durable ingestion buffering for occasionally-connected and
intermittently-disconnected systems. The forwarder implements the Seq ingestion API, so applications that write
Expand All @@ -1865,12 +1890,9 @@ destination Seq server.
To start a forwarder instance at the terminal, listening on port 5341 and forwarding to `seq.example.com`, run:

```shell
seqcli forwarder run --pre --listen http://127.0.0.1:5341 -s https://seq.example.com
seqcli forwarder run --listen http://127.0.0.1:5341 -s https://seq.example.com
```

> While the `forwarder` command group is in preview, all `forwarder` commands require the `--pre` switch; you'll
> also need to supply `--pre` when requesting help, e.g. `seqcli help forwarder run --pre`.

You can test your forwarder using the `seqcli log` command:

```shell
Expand Down
2 changes: 1 addition & 1 deletion baseversion
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2025.2
2026.1
2 changes: 1 addition & 1 deletion build/Build.Linux.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ $version = Get-SemVer

Write-Output "Building version $version"

$framework = "net9.0"
$framework = "net10.0"
$image = "datalust/seqcli"
$archs = @(
@{ rid = "x64"; platform = "linux/amd64" },
Expand Down
9 changes: 7 additions & 2 deletions build/Build.Windows.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ $version = Get-SemVer

Write-Output "Building version $version"

$framework = 'net9.0'
$framework = 'net10.0'

function Clean-Output
{
Expand Down Expand Up @@ -111,8 +111,13 @@ function Upload-NugetPackages
function Upload-GitHubRelease($version)
{
Write-Output "Creating release for version $version"

$prerelease = "";
if ($env:CI_TARGET_BRANCH -ne "main") {
$prerelease = "--prerelease ";
}

iex "gh release create v$version --title v$version --generate-notes $(get-item ./artifacts/*)"
iex "gh release create v$version --title v$version $prerelease--generate-notes $(get-item ./artifacts/*)"
}

function Remove-GlobalJson
Expand Down
2 changes: 1 addition & 1 deletion ci.global.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"sdk": {
"version": "9.0.311"
"version": "10.0.301"
}
}
6 changes: 3 additions & 3 deletions dockerfiles/seqcli/linux-arm64.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
FROM ubuntu:22.04
FROM ubuntu:24.04

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
libc6 \
libgcc1 \
libgssapi-krb5-2 \
libicu70 \
libicu-dev \
libssl3 \
libstdc++6 \
zlib1g \
&& rm -rf /var/lib/apt/lists/*

COPY src/SeqCli/bin/Release/net9.0/linux-arm64/publish /bin/seqcli
COPY src/SeqCli/bin/Release/net10.0/linux-arm64/publish /bin/seqcli

ENTRYPOINT ["/bin/seqcli/seqcli"]

Expand Down
6 changes: 3 additions & 3 deletions dockerfiles/seqcli/linux-x64.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
FROM ubuntu:22.04
FROM ubuntu:24.04

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
libc6 \
libgcc1 \
libgssapi-krb5-2 \
libicu70 \
libicu-dev \
libssl3 \
libstdc++6 \
zlib1g \
&& rm -rf /var/lib/apt/lists/*

COPY src/SeqCli/bin/Release/net9.0/linux-x64/publish /bin/seqcli
COPY src/SeqCli/bin/Release/net10.0/linux-x64/publish /bin/seqcli

ENTRYPOINT ["/bin/seqcli/seqcli"]

Expand Down
14 changes: 11 additions & 3 deletions src/Roastery/Api/OrdersController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Net;
using System.Threading.Tasks;
using Roastery.Data;
using Roastery.Metrics;
using Roastery.Model;
using Roastery.Web;
using Serilog;
Expand All @@ -15,8 +16,8 @@ class OrdersController : Controller
{
readonly Database _database;

public OrdersController(ILogger logger, Database database)
: base(logger)
public OrdersController(ILogger logger, RoasteryMetrics metrics, Database database)
: base(logger, metrics)
{
_database = database;
}
Expand All @@ -41,7 +42,10 @@ public async Task<HttpResponse> Create(HttpRequest request)
}

await _database.InsertAsync(order);

Metrics.RecordOrderCreated();
Log.Information("Created new order {OrderId} for customer {CustomerName}", order.Id, order.CustomerName);

return Json(order, HttpStatusCode.Created);
}

Expand All @@ -65,7 +69,11 @@ public async Task<HttpResponse> Update(HttpRequest request)
if (order.Status == OrderStatus.PendingShipment)
Log.Information("Order placed and ready for shipment");
else if (order.Status == OrderStatus.Shipped)
Log.Information("Order shipped to {CustomerName} at {ShippingAddress}", order.CustomerName, order.ShippingAddress);
{
Metrics.RecordOrderShipped();
Log.Information("Order shipped to {CustomerName} at {ShippingAddress}", order.CustomerName,
order.ShippingAddress);
}
else
Log.Information("Order updated");

Expand Down
5 changes: 3 additions & 2 deletions src/Roastery/Api/ProductsController.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Threading.Tasks;
using Roastery.Data;
using Roastery.Metrics;
using Roastery.Model;
using Roastery.Web;
using Serilog;
Expand All @@ -12,8 +13,8 @@ class ProductsController : Controller
{
readonly Database _database;

public ProductsController(ILogger logger, Database database)
: base(logger)
public ProductsController(ILogger logger, RoasteryMetrics metrics, Database database)
: base(logger, metrics)
{
_database = database;
}
Expand Down
68 changes: 68 additions & 0 deletions src/Roastery/Metrics/ExponentialHistogram.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;

namespace Roastery.Metrics;

public class ExponentialHistogram
{
public ExponentialHistogram(int initialScale = 20, int targetBuckets = 160)
{
_scale = initialScale;
_targetBuckets = targetBuckets;
_buckets = new Dictionary<double, ulong>();
}

readonly int _targetBuckets;

int _scale;
Dictionary<double, ulong> _buckets;

double _min;
double _max;
double _sum;
ulong _total;

public void Record(double rawValue)
{
_min = Math.Min(_min, rawValue);
_max = Math.Max(_max, rawValue);
_sum += rawValue;
_total += 1;

var midpoint = Midpoint(_scale, rawValue);
_buckets.TryAdd(midpoint, 0);
_buckets[midpoint] += 1;

if (_buckets.Count <= _targetBuckets) return;

// Rescale
var newScale = _scale - 1;
var newBuckets = new Dictionary<double, ulong>();

foreach (var (oldMidpoint, count) in _buckets)
{
var newMidpoint = Midpoint(_scale, oldMidpoint);
newBuckets.TryAdd(newMidpoint, 0);
newBuckets[newMidpoint] += count;
}

_buckets = newBuckets;
_scale = newScale;
}

static double Midpoint(int scale, double rawValue)
{
var gamma = Math.Pow(2d, Math.Pow(2d, -scale));
var index = Math.Abs(Math.Log(rawValue, gamma));

return (Math.Pow(gamma, index - 1) + Math.Pow(gamma, index)) / 2;
}

public IReadOnlyDictionary<double, ulong> Buckets => _buckets;
public int Scale => _scale;

public double Min => _min;
public double Max => _max;
public double Sum => _sum;
public ulong Total => _total;
}
3 changes: 3 additions & 0 deletions src/Roastery/Metrics/PropertyNameMapping.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Roastery.Metrics;

public record struct PropertyNameMapping(string MetricDefinitions);
Loading