0.12.0 #1245
mickem
announced in
Announcements
0.12.0
#1245
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
NSClient++ Release Notes
This release is dominated by a long-overdue cleanup of the Windows
check_service/check_processpaths, asubstantial overhaul of how thresholds (
warn=/crit=/ok=) are evaluated against summary variables such ascount, a brand-new * IcingaClient* module for submitting passive results to Icinga 2's REST API, an HTTP stackrefactor, and finally support for Windows CA-store.
A large number of long-standing GitHub issues are closed by this release.
TL;DR
checks (check_http, Elastic, Op5, Icinga, Graphite, NRDP, Syslog) "just work" without manually staging a CA bundle.
check_serviceis finally correct on busy machines, on mixed start-type services, and whenperf-syntax=noneisused.
check_processnow sees protected / cross-user processes when running asNETWORK SERVICE, and the realtime path isfinally case-insensitive like Windows itself.
warn=/crit=after iteration, so summary variables such ascountare stable,and mixed expressions are evaluated correctly even when no rows match.
See Breaking changes at the bottom for behavioural changes you may need to react to in existing configurations.
New features
IcingaClient — Icinga 2 REST API submission
A new client module that submits passive check results directly to an Icinga 2 master/satellite via the
/v1/actions/process-check-resultREST endpoint, as an alternative to NSCA or NRDP.Real-world example — submit a check from a scheduled task / NSCP console:
Native support for Windows CA-store
On startup NSClient++ will export the machine's
ROOTcertificate store as a single PEM bundle, so any check that doesTLS (
check_http, IcingaClient, NSCA over TLS, ...) can automatically validate certificates.Real-world example — verify an internal HTTPS endpoint signed by your enterprise CA that is already trusted by Windows:
check_service fixes
"Failed to enumerate service: 6f7" on busy hosts
Enumerating service might fail on server with many services.
The enumeration is now properly looped until the SCM signals end-of-data.
perf-syntax=noneactually suppresses perfdatacheck_servicewas emitting a stream of empty perfdata aliases (''=4;0;1 ''=4;0;1 ...) even when the user setperf-syntax=none, making the output unusable over size-limited transports such as NRPE.Real-world example — quietly checking 200 services over NRPE:
no more
TODOleaking into${desc}When using
service=<name>instead of afilter=, the display name was constructed with the literal string"TODO"and overwritten later. In some instances this was read before being populated causing TODO to end up in check results.
Real-world example:
delayedonly reported forSERVICE_AUTO_STARTQueryServiceConfig2(SERVICE_CONFIG_DELAYED_AUTO_START_INFO)only returns a meaningful value for auto-start services.The old code checked the delayed flag before the start type, so manual / boot / system / disabled services could
randomly show up as
delayed/delayed-trigger.Real-world example:
check_process fixes
see protected / cross-user processes as
NETWORK SERVICEWhen NSClient++ runs under a non-administrative account it cannot
OpenProcess(PROCESS_QUERY_INFORMATION)on criticalprocesses (
csrss.exe,smss.exe,services.exe,winlogon.exe, ...) or on processes owned by other users — theywere silently dropped from the enumeration, causing false
CRITICAL: <name>=stopped.A third fallback using
PROCESS_QUERY_LIMITED_INFORMATION+QueryFullProcessImageNameis now attempted. The processis visible by name and PID; detailed metrics (handle counts, VM, command line, modules) remain unavailable for those
processes because they require broader rights.
Real-world example — service is installed to run as
NT AUTHORITY\NetworkService:case-insensitive
process=in realtimeProcessnames were not caompared case insensetive so
process=notepad.exefailed to match a process whose on-disk imagename was
NOTEPAD.EXE.Real-world example:
This now fires regardless of how Windows happens to capitalise the image name.
Filter engine — stable summary thresholds
These changes touch the shared filter / threshold engine and therefore affect every modular check (
check_files,check_service,check_process,check_eventlog, ...).stable
count/total/*_countinwarn=/crit=warn=/crit=were evaluated during iteration. Summary variables such ascounttherefore exposed their runningvalue instead of the final post-iteration value, so a mixed expression like
mis-fired on the very first row (
count == 1 < 5) regardless of how many rows ultimately matched.Per-row evaluation is now deferred: matched rows are recorded during iteration, and the warn/crit/ok engines run in
match_post()once the summary state is final. Realtime checks now also callmatch_post()so the deferred verdict ismaterialised before the realtime helper inspects the return code.
Real-world impact:
mixed
warn=/crit=evaluated when no rows matchIf a filter excluded every row, no per-row evaluation happened and the post-row pass only re-evaluated expressions whose
AST did not require an object. Pure-summary expressions like
crit=count=0worked, but mixed expressions likewere skipped entirely — leaving the check
OKin the empty case.A force-evaluation path is added: when no rows matched, object-bound variables resolve to their default (
false) andsummary variables resolve to their final values, so the example above evaluates to
(false OR true) = trueandcorrectly returns CRITICAL.
Real-world example:
Quieter, more predictable expression evaluation
is_unsurepropagates consistently; invalid-type comparisons resolve tounsure-falseinsteadof erroring.
is_unsure=trueand produce a warning in thelog instead of an error per row — log volume on complex queries drops dramatically.
sure-intduring deferred evaluation so they don't get demoted to "unsure" by the new codepath.
HTTP refactor
Real-world impact:
check_httpagainst servers usingTransfer-Encoding: chunked(most modern reverse proxies, Icinga2, Kubernetes ingress, ...) now returns the full body instead of a truncated/garbled one. The IcingaClient module relies
on this.
plugin_manager response formatting
Performance data is now appended to the response message only when it exists, so checks with no perfdata no longer end
with a stray
|. The CLI parser also gained tighter option handling and clearer logging.Build / quality
a7194df5,f7614b58,82d8e7a6: new GitHub Actions workflow that builds with-fsanitize=address,undefinedandruns the test suite — sanitizers are now opt-in via the CMake config.
12beda0c: documentation cleanup, link fixes; passive-monitoring scenario doc renamed topassive-monitoring-nsca.md.Breaking changes
1.
delayedis no longer reported for non-auto servicesIf you have any filter / threshold that matched
start_type = 'delayed'on services that were actually configured asManual,Boot,SystemorDisabled, that match is gone — the field will now correctly report the real start type.Impact example:
If you actually wanted to alert on "any non-running service that isn't disabled", you should now write:
2.
warn=/crit=no longer fire mid-iteration on running countsIf a check incidentally relied on a mixed expression firing on the first matching row (e.g.
crit=count<5mixed with aper-row term), the verdict will now be computed against the final counts. This is the documented and intuitive
behaviour, but configurations that were "tuned" against the buggy early-fire will produce different results.
Impact example:
3. Mixed
warn=/crit=now evaluate when no rows matchMixed expressions used to be silently skipped on empty result sets, returning
OK. They are now evaluated withobject-bound variables defaulting to
falseand summary variables at their final values.Impact example:
If your old config was implicitly treating "empty" as "OK", you may want to add
count > 0 AND ...guards, or move theempty-case logic into a dedicated check.
4. Realtime
check_processis now case-insensitiveThe realtime path matched
process=case-sensitively; the active path was already case-insensitive. They are nowconsistent.
Impact: a realtime rule that intentionally matched only the exact casing (e.g.
process='Notepad.exe'to ignorenotepad.exe) will now match both. This was almost certainly a bug in the original config.5.
${desc}no longer returns the literal stringTODOIf any monitoring backend was matching on the string
TODOin the description field ofcheck_serviceresults todetect "this is the NSClient++ default", that will stop working. Use the real display name instead.
6.
perf-syntax=nonenow actually suppresses perfdata incheck_servicePreviously,
perf-syntax=nonewas silently ignored and a stream of empty-aliased perfdata entries was produced. Anymonitoring backend that consumed those empty entries (highly unlikely, but possible) will see them disappear when the
user requests
none. Match the documented semantics, shared withfilter/ok/warn/crit.7. HTTP request/response API changed (C++ consumers / module authors)
Internal C++ types
http::request/http::responseare now distinct types, headers are stored case-insensitively, andchunked decoding happens transparently. Out-of-tree modules that linked against the old shared "request/response bag"
type will not compile against this release without a small adjustment — typically:
8. Documentation reorganisation
Several old documentation pages have been merged or converted with the new scenarios so some old links might now be
broken.
Full Changelog: 0.11.33...0.12.0
This discussion was created from the release 0.12.0.
Beta Was this translation helpful? Give feedback.
All reactions