plugins/postman-testgen/skills/log-assertion/SKILL.md
This skill should be used when writing Postman test script assertions for VictoriaLogs business log verification, when the user asks to "assert log events", "verify business logs", "check domain.action logs", "query VictoriaLogs from Postman", "validate log entries", or mentions business log verification in API tests.
npx skillsauth add hicaosen/skills Log Assertion PatternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Provide templates for querying VictoriaLogs and asserting business log events within Postman test scripts.
POST /select/logsql/query on the vlUrl environment variableapplication/x-www-form-urlencodedAccountID: 0, ProjectID: 0 (multi-tenancy)pm.environment.set('logStartTime', new Date().toISOString());
var vlUrl = pm.environment.get('vlUrl');
var logStart = pm.environment.get('logStartTime');
pm.sendRequest({
url: vlUrl + '/select/logsql/query',
method: 'POST',
header: {
'Content-Type': 'application/x-www-form-urlencoded',
'AccountID': '0', 'ProjectID': '0'
},
body: {
mode: 'urlencoded',
urlencoded: [
{ key: 'query', value: 'service:service-name' },
{ key: 'start', value: logStart },
{ key: 'limit', value: '100' }
]
}
}, function (err, response) {
var logs = response.text().trim().split('\n')
.filter(function (l) { return l; })
.map(function (l) { return JSON.parse(l); });
// assertions here
});
Log assertions should focus on three key aspects:
order.created must exist)order_id, status must be present and non-empty)INFO, not_found = WARNING, errors = ERROR)var eventLogs = logs.filter(function (l) { return l._msg && l._msg.includes('order.created'); });
pm.expect(eventLogs.length).to.be.above(0, 'order.created event not found in logs');
Verify key business fields exist and have non-empty values:
var event = logs.find(function (l) { return l._msg && l._msg.includes('order.created'); });
pm.expect(event, 'Event not found').to.exist;
pm.expect(event.order_id, 'order_id is missing or empty').to.exist.and.to.not.be.empty;
pm.expect(event.status, 'status is missing or empty').to.exist.and.to.not.be.empty;
// Normal flow should be INFO
pm.expect(event.level).to.eql('INFO');
// not_found scenarios should be WARNING
pm.expect(notFoundEvent.level).to.eql('WARNING');
// No unexpected ERROR logs during normal flow
var errors = logs.filter(function (l) { return l.level === 'ERROR'; });
pm.expect(errors).to.have.lengthOf(0);
var match = logs.filter(function (l) {
return l.domain === 'order' && l.action === 'created';
});
pm.expect(match.length).to.be.above(0, 'domain=order action=created not found');
Wrap in IIFE. Use [LOG] prefix:
// --- LOG LAYER ---
(function () {
var vlUrl = pm.environment.get('vlUrl');
var logStart = pm.environment.get('logStartTime');
if (!vlUrl || !logStart) return;
var logQuery = 'service:target-service';
pm.sendRequest({
url: vlUrl + '/select/logsql/query',
method: 'POST',
header: {
'Content-Type': 'application/x-www-form-urlencoded',
'AccountID': '0', 'ProjectID': '0'
},
body: {
mode: 'urlencoded',
urlencoded: [
{ key: 'query', value: logQuery },
{ key: 'start', value: logStart },
{ key: 'limit', value: '100' }
]
}
}, function (err, response) {
if (err) {
pm.test('[LOG] Query succeeded', function () {
pm.expect.fail('Log query failed: ' + err.message);
});
return;
}
var text = response.text().trim();
if (!text) {
pm.test('[LOG] Found logs', function () {
pm.expect.fail('No logs returned');
});
return;
}
var logs = text.split('\n')
.filter(function (l) { return l; })
.map(function (l) { try { return JSON.parse(l); } catch(e) { return null; } })
.filter(function (l) { return l; });
pm.test('[LOG] Found logs for service', function () {
pm.expect(logs.length).to.be.above(0);
});
pm.test('[LOG] No error-level logs', function () {
var errors = logs.filter(function (l) { return l.level === 'error'; });
pm.expect(errors).to.have.lengthOf(0);
});
});
})();
Prefix all log assertions with [LOG] to distinguish from [HTTP] and [TRACE] layers.
For complete query and assertion patterns, consult:
references/log-query-patterns.md — Full patterns including domain.action filtering, trace ID correlation, log order verification, structured field checks, hit stats, and complete assertion blocksdevelopment
VictoriaTraces HTTP API reference for querying distributed traces via Jaeger-compatible API. This skill should be used when searching traces, listing services/operations, getting trace details by ID, querying service dependencies, constructing HTTP requests to VictoriaTraces, or working with Jaeger API endpoints for distributed tracing analysis.
development
VictoriaMetrics HTTP API reference for querying metrics, exporting/importing data, TSDB stats, and administrative operations. This skill should be used when constructing HTTP requests to VictoriaMetrics, understanding query endpoints (/api/v1/query, /api/v1/query_range, /api/v1/export, /api/v1/import), response formats, checking cardinality, creating snapshots, or integrating with VictoriaMetrics API.
development
VictoriaLogs HTTP API reference for querying logs, hits stats, field discovery, live tailing, and log statistics. This skill should be used when constructing HTTP requests to VictoriaLogs, understanding query endpoints (/select/logsql/query, /select/logsql/tail, /select/logsql/hits, /select/logsql/field_names), response formats, or integrating with VictoriaLogs API for log search and analysis.
testing
PromQL query language fundamentals for Prometheus and Prometheus-compatible systems. Use for understanding PromQL instant/range vectors, label matchers, aggregation operators, offset/@ modifiers, or when targeting non-VictoriaMetrics Prometheus systems. For VictoriaMetrics-specific features like default_rollup, rollup, or outlier detection, use the metricsql skill.