0.17.0 #1436
mickem
announced in
Announcements
0.17.0
#1436
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.
Windows server roles get their own checks, and check messages finally read like numbers
0.17.0 adds twelve new checks — eight for IIS and Remote Desktop Services on
Windows, four for the status pages of the common web servers — and gives every
filter check control over how it renders numbers, so
140.293GB/0.983TBcanbecome
141.09GB/1006.85GB(or141,09GB/1.006,85GB). Alongside that, thefilter engine stops quietly doing the wrong thing: text-versus-number
comparisons are numeric, fractional thresholds mean what they say, and an error
inside a syntax template is reported instead of rendering a blank.
Highlights
CheckWindowsAppsmodule covers IIS sites, application pools, workerprocesses and HTTP.sys request queues, plus RDS CAL licensing, session
counts, per-session load and the Connection Broker counterset.
check_apache_status,check_nginx_status,check_phpfpm_statusandcheck_tomcat_statusread thevendors' machine-readable status endpoints over HTTP(S), sharing
check_http's auth and TLS handling.decimals,byte-unit,decimal-separator,thousands-separator— on everyfilter check and every real-time filter (feature request NRPEServer: numbers formatting (decimal places and separators) #1428). Perfdata and thresholds are
untouched.
filter=value > 90no longer matchesvalue=100as false because "100" sortsbefore "90", and
90 > valueevaluates at all.count > 2.5meantcount > 3and
working_set > 1.5gmeant1g; both now mean what they say.including attachment targets and
[/includes]('{host}' variable in '[/attachments]' and '[/include]' #458) — and are sanitizedbefore they land in a local path 🔒.
SyslogClientread itsconnection settings from the wrong place and sent nothing at all; a configured
syslog target will start receiving traffic on upgrade.
are renamed, with the old names kept as deprecated aliases.
Detailed changes
CheckWindowsApps — a new module for Windows server roles
A new Windows-only module carrying IIS and Remote Desktop Services checks, built
on the performance counter sets and enriched from WMI where the role's provider
is installed. The two roles share one module deliberately: every check module
statically links Boost and the filter engine, so a role earns its own DLL only
when it drags in a heavy or optional dependency (the way
CheckMySQLcarrieslibmariadb.dll).check_iis_app_poolsunknownrather than hiding.check_iis_sitesrequests_per_sec/bytes_per_secbehindaverages=true. CRITICAL by default when an auto-start site is stopped.check_iis_worker_processesw3wpactive and served requests, with the<pid>_<pool>instance name split into keywords. An empty set is OK — idle pools spin their workers down.check_iis_request_queuescheck_rds_licensesWin32_TSLicenseKeyPack: total, issued and available licences. Warns atavailable < 10 and total > 0, critical atavailable = 0 and total > 0.check_rds_sessionscheck_rds_session_loadRDP-Tcp <n>) with CPU, working set and, on session hosts, RDP protocol bytes — the per-user attributioncheck_processcannot give.sessions-only=trueskips the session-0 aggregate.check_rds_brokerA host without the role gets a clean UNKNOWN naming the missing role, not a WMI
or PDH error dump. The counter plumbing landed as a reusable gather helper that
collects a set of English counter names for every instance of an object in one
query, keeping the existing localized/English/index resolution fallback — it was
verified against live Swedish-localized counters.
CheckNet — status-page checks for the common web servers
check_apache_statusmod_status(?autoappended automatically)check_nginx_statusstub_statuscheck_phpfpm_statusmax_children_reached, slow requests; warns by default when requests queue upcheck_tomcat_statusstatus?XML=true(appended automatically)All four share
check_http's connection handling — Basic auth, TLS version /verify / CA, timeout — and go CRITICAL by default when the endpoint is
unreachable, answers non-2xx, or serves something that is not the expected
status format. Numeric parsing pins the classic locale, so a host with a decimal
comma no longer truncates
ReqPerSecat the decimal point.Filter messages — configurable number rendering
check_drivesizereported140.293GB/0.983TB used: two units and six decimalsin one line, with no way to change either (#1428). Every filter check now takes
four options, and real-time filters take the same values as settings keys
(
decimals,byte unit,decimal separator,thousands separator),inheritable from the default template.
decimals-1keeps the historical "up to three, trailing zeros stripped". Capped at 15.byte-unitB…EB.decimal-separator,for the European rendering.thousands-separatorThe format lives on the evaluation context, so it reaches the message only:
performance data is built from the raw values and keeps its full precision and
its
.radix, and so does every number the filter grammar parses out of athreshold —
warning=used>1.5gmeans the same thing with a decimal comma inforce.
Three defects in the byte formatter came out of this work:
format_bytes(used, 'gb')rendered1.27055e-10, because the unit comparisonwas case sensitive against an uppercase table. Units are now case insensitive
everywhere.
times, rendering
value/1024^7. An unknown unit is now reported —Filter processing failed: format_bytes failed: Unknown byte unit: ZB— andthe same check applies inside real-time filters.
format_bytes(value, '')failed to parse at all; the empty string literal isnow accepted.
The filter/where engine — comparisons that mean what they say
against an unquoted number used to order lexically, or — with the operands
reversed — fail to evaluate. Both sides now compare as numbers. This covers
value/warn/crit/min/max(filter_perf,render_perf),speed(
check_network),string_value(check_registry_value) andcolumn()(
check_logfile). A value that is not a number never matches; the check logsone warning naming it and stays a certain non-match, not UNKNOWN. Quoted
literals keep the lexical comparison, as do
like,regexp,in,keyword-specific converters (
state = 'running',age > 30m) and the= 'unknown'/= 'never'sentinels.count > 2.5used to be rounded into thecounter's integer domain, and unit literals lost their fraction entirely
(
working_set > 1.5gmeant 1g,uptime < 2.5hmeant 2h).filter_perf/render_perf/xform_perf:maxandminwere swapped.maxread the perf-data minimum bound andminthe maximum; they now readthe bounds they name.
detail-syntaxor
top-syntaxleft the placeholder empty and said nothing; the check nowreturns UNKNOWN with
Filter processing failed: ….perf-config'sunit:converts instead of relabelling. On byte seriesthat do not auto-scale,
unit:KBused to change the label only, shipping=1536KBfor 1536 bytes. The value and the warn/crit bounds now convert.An unrecognised unit leaves the value alone rather than dividing it by 1024⁷.
Filter keywords — the clash with the generic summary keywords is resolved
A handful of checks registered a keyword named
status,countortotal— thesame names as the built-in summary keywords. The check-specific value won in
filter/warning/criticalanddetail-syntax, whiletop-syntaxand thereference documentation showed the generic one. Each now has a distinct name:
check_cpu,check_cpu_utilizationtotalusagecheck_batterystatusbattery_statuscheck_networkstatus,totallink_status,throughputcheck_os_updatescountupdatescheck_patch_agecountpatchescheck_pending_rebootcountsignalscheck_printjobsstatusjob_statuscheck_printqueuestatusprinter_statuscheck_installed_software(Linux)statuspackage_statuscheck_activationstatusactivation_statuscheck_dockerstatuscontainer_statuscheck_connectionscount,totalconnections,total_connectionscheck_dnscountrecordscheck_httpstatusstatus_messagecheck_shadowcopycountcopiescheck_disk_healthtotalsizeThe old names remain as undocumented deprecated aliases with unchanged
behaviour, so
check_cpu "warn=total > 80"still works.Settings — host name placeholders, and where they may land
${host},${hostname},${hostname_lc},${hostname_uc}and${domain}nowresolve in attachment target paths and in
[/includes], not only in settingsurls and the url an attachment is fetched from (#458). An unknown
${...}tokenin a path is not an error — it resolves to the installation directory — so a
configuration like
[/attachments] ${shared-path}/${host}.ini = …never failed,it quietly wrote one file with the installation directory in its name.
🔒 Because the host name is not fully under the operator's control (DHCP, or any
local privileged process can set it), a value substituted into a path is
reduced to the characters a legal RFC-952 host name can contain: anything else
becomes
_, and a dots-only value becomes_. Settings urls and the submitclients' host name specs are unaffected. See
Security notices.
nscp settings --migrate-to(and the REST migrate) now keeps a placeholder youpass it as-is in
boot.iniwhile migrating into the expanded per-host file, theway
--switchalready did, so the template survives on a fleet-managed machine.Clients — submission paths that were quietly dead
SyslogClientread its connection settings from the sender ratherthan the target, so address, port, facility, severity and templates were all
ignored: the agent logged
Undefined facility:and sent nothing. Broken since0.4.3 (2015).
CheckMKClienthad the same defect on its query path.empty and the EHLO fell back to
localhost. Setehlo-hostnameon the targetif your mail server applies HELO/EHLO policy.
cpu,run— answeredException processing command line: basic_string::substr …instead of running, in every module built on the shared client machinery
(NRPE, NSCA, NRDP, Graphite, …).
CheckSystem —
check_pending_rebootsays since whenThe CBS and Windows Update reboot keys exist only while their reboot is queued,
so their last-write time is when the signal appeared. Two new keywords follow
check_registry's naming:written(type_date, pluswritten_s) andage,duration-typed so
warning=pending = 1 and age > 7dreads as seven days. Thedefault message gains
(pending since <time>)when the time is known (#1415).The file-rename, computer-rename and domain-join signals carry no timestamp, so
both keywords are optional: they render as
unknown, compare false against everynumber and emit no perfdata rather than reporting a misleading value.
Data collection — one bad field no longer sinks the cycle
Win32_Processor.LoadPercentageis occasionally NULL, androw::get_inthad no case for it: the type-mismatch exception escaped half-way through the
row and the collector threw away the entire cycle's clock speeds and core
counts (
row::get_intthrows on NULL WMI values, discarding the whole collection #1391). Optional fields can now opt intoboost::none, mandatory onesfail with a clear
<col> is NULLinstead of localized COM text, andcheck_cpu_frequencyrenders a missing sample asno load samplerather thana fabricated
0.MaxQueueItemAgeon an idle, freshly started queue returnsPDH_CALC_NEGATIVE_DENOMINATOR, which failed a whole gather even when thecaller passed
ignore_errors— makingcheck_iis_request_queuesmisreport theobject as missing. With
ignore_errorsthe counter is now skipped for thattick (Flat performance data for check_cpu #642, check_network returns not plausible values #906); the background collector and every single-counter check
still throw, so they hear about an uncomputable counter instead of silently
reading a default.
Windows installer and file layout
A round of fixes to the modern (ProgramData) layout introduced in 0.16.2:
upgrading an enrolled host resolves every path token instead of failing;
ReadLayoutgets the install folder before directories resolve;CURRENT_LAYOUTis set through the public property setter; an upgrade of a modern host no longer
re-creates
nsclient.iniin Program Files; a%ProgramData%that cannot beresolved fails outright instead of half-applying the layout; migrated files get
the destination's ACL rather than the one they came with; resetting a renamed
tree to inherited strips the explicit ACEs; and
--migrate-layout legacymigrates to legacy instead of silently to modern.
Bug fixes
nscp settings --show --path …without a--keyused to print nothing andexit 0; it now reports
Invalid command line please use --path and --key with showand exits non-zero.diffendpoint kept listing an edit for thelifetime of the process after it had been written, reporting a
modifiedentrywhose old value equalled its new one.
deletions are masked in
has_key.true/falsein the generated referenceinstead of garbage.
Documentation
Options shared by every filter check (
filter,warning,top-syntax, …) andthe generic filter keywords are now single-sourced: they fold out of each
command's reference page into one shared page, so a command's documentation shows
only what is specific to it. Runtime-stubbed Windows-only checks are marked as
Windows only.
Upgrade notes
still points where you want before upgrading — it has not been delivering,
and it will now. The same applies to SMTP targets, which will start announcing
this host in EHLO instead of
localhost.${host},${hostname}or${domain}under[/attachments]or[/includes]and removeworkarounds — such a file lands somewhere new after upgrade. 🔒 The value is
sanitized when it lands in a local path. Configurations without a host name
placeholder are unaffected.
four options unset and messages are byte-for-byte unchanged. Set any of
them and plain float keywords move onto the number format too: with
decimalsunset they render with up to three decimals instead of the legacy
6-significant-digit form (
2.71094→2.711), and large values stop renderingscientific. A pipeline that matches float text in the message may need its
pattern relaxed.
format_bytes()now returns UNKNOWN instead of a quietlywrong number. A syntax string with a typo'd unit will fail until the unit is
fixed.
perf-configunit:on plain byte series changes the metric's magnitude. Adashboard that compensated for the old mislabelling will see the metric drop by
the unit ratio; a graph flat at a near-zero value because of a misspelled
unit:will jump to its real magnitude.deliberately relied on text ordering — quote the number to keep the old
behaviour.
expressions that already used a decimal point can behave differently.
maxandmininfilter_perf/render_perf/xform_perfwere swapped. Afilter that compensated needs the two names exchanged back.
default perfdata keys change because the default
perf-confignames the renamedkeyword:
check_cpu_utilization(Linux)cpu_total→cpu_usage,check_patch_agepatch_count→patch_patches,check_pending_rebootreboot_count→reboot_signals. Pass your ownperf-config=extra(...)withthe old name to keep the old key.
check_os_updates' default output now reportsthe actual number of updates instead of the matched-row count.
check_pending_reboot's default message gains a suffix —Reboot required: Windows Update (pending since 2026-08-16 09:41:12).Notification pipelines matching the exact message text need their pattern
relaxed.
nscp settings --showwithout--keynow fails. Scripts relying on thesilent success need the missing
--keyadded.Full Changelog: 0.16.4...0.17.0
This discussion was created from the release 0.17.0.
All reactions