ASP.NET (windows.plugin) (#20485)
thiagoftsm committed
Jul 11, 2025 at 11:24 UTC
3258c1a4328cdf452c87af6cda821f4adbbe3d9d
5 files changed
+1692
-2
CMakeLists.txt
+1
@@ -2065,6 +2065,7 @@ set(WINDOWS_PLUGIN_FILES
2065
src/collectors/windows.plugin/perflib-hyperv.c
2066
src/collectors/windows.plugin/perflib-exchange.c
2067
src/collectors/windows.plugin/perflib-numa.c
2068
+ src/collectors/windows.plugin/perflib-asp.c
2069
)
2070
2071
set(PROC_PLUGIN_FILES
src/collectors/windows.plugin/metadata.yaml
+264
@@ -3539,3 +3539,267 @@ modules:
3539
- name: free
3540
- name: standby
3541
- name: available
3542
+ - meta:
3543
+ plugin_name: windows.plugin
3544
+ module_name: PerflibASP
3545
+ monitored_instance:
3546
+ name: ASP.NET
3547
+ link: "https://dotnet.microsoft.com/en-us/apps/aspnet"
3548
+ categories:
3549
+ - data-collection.windows-systems
3550
+ icon_filename: "windows.svg"
3551
+ related_resources:
3552
+ integrations:
3553
+ list: []
3554
+ info_provided_to_referring_integrations:
3555
+ description: ""
3556
+ keywords:
3557
+ - windows
3558
+ - ASP
3559
+ - webservice
3560
+ most_popular: false
3561
+ overview:
3562
+ data_collection:
3563
+ metrics_description: |
3564
+ This collector monitors ASP.NET applications.
3565
+ method_description: |
3566
+ It queries for the 'ASP.NET' and 'ASP.NET Applications' objects from Perflib in order to gather the metrics.
3567
+ supported_platforms:
3568
+ include: ["windows"]
3569
+ exclude: []
3570
+ multi_instance: false
3571
+ additional_permissions:
3572
+ description: ""
3573
+ default_behavior:
3574
+ auto_detection:
3575
+ description: |
3576
+ The collector automatically detects all of the metrics, no further configuration is required.
3577
+ limits:
3578
+ description: ""
3579
+ performance_impact:
3580
+ description: ""
3581
+ setup:
3582
+ prerequisites:
3583
+ list: []
3584
+ configuration:
3585
+ file:
3586
+ name: "netdata.conf"
3587
+ section_name: "[plugin:windows]"
3588
+ description: "The Netdata main configuration file"
3589
+ options:
3590
+ description: ""
3591
+ folding:
3592
+ title: "Config option"
3593
+ enabled: false
3594
+ list:
3595
+ - name: PerflibASP
3596
+ description: An option to enable or disable the data collection.
3597
+ default_value: yes
3598
+ required: false
3599
+ examples:
3600
+ folding:
3601
+ enabled: true
3602
+ title: ""
3603
+ list: []
3604
+ troubleshooting:
3605
+ problems:
3606
+ list: []
3607
+ alerts: []
3608
+ metrics:
3609
+ folding:
3610
+ title: Metrics
3611
+ enabled: false
3612
+ description: ""
3613
+ availability: []
3614
+ scopes:
3615
+ - name: ASP.NET Global Data
3616
+ description: "These metrics refer to ASP.NET global metrics."
3617
+ labels: []
3618
+ metrics:
3619
+ - name: aspnet.application_restarts
3620
+ description: Number of times the application has been restarted.
3621
+ unit: restarts
3622
+ chart_type: line
3623
+ dimensions:
3624
+ - name: restarts
3625
+ - name: aspnet.worker_process_restarts
3626
+ description: Number of times a worker process has restarted on the machine.
3627
+ unit: restarts
3628
+ chart_type: line
3629
+ dimensions:
3630
+ - name: restarts
3631
+ - name: ASP.NET Applications
3632
+ description: "ASP.NET application performance counters"
3633
+ labels:
3634
+ - name: aspnet_app
3635
+ description: The application name.
3636
+ metrics:
3637
+ - name: aspnet.anonymous_request
3638
+ description: Number of requests utilizing anonymous authentication.
3639
+ unit: requests
3640
+ chart_type: line
3641
+ dimensions:
3642
+ - name: requests
3643
+ - name: aspnet.compilation_totals
3644
+ description: Number of source files dynamically compiled.
3645
+ unit: compilations
3646
+ chart_type: line
3647
+ dimensions:
3648
+ - name: compilations
3649
+ - name: aspnet.errors_during_preprocessing
3650
+ description: Errors During Preprocessing.
3651
+ unit: errors
3652
+ chart_type: line
3653
+ dimensions:
3654
+ - name: preprocessing
3655
+ - name: aspnet.errors_during_compilation
3656
+ description: Errors During Compilation.
3657
+ unit: errors
3658
+ chart_type: line
3659
+ dimensions:
3660
+ - name: compilation
3661
+ - name: aspnet.errors_during_execution
3662
+ description: Errors During Execution.
3663
+ unit: errors
3664
+ chart_type: line
3665
+ dimensions:
3666
+ - name: execution
3667
+ - name: aspnet.errors_during_unhandled_execution
3668
+ description: Errors Unhandled During Execution.
3669
+ unit: errors
3670
+ chart_type: line
3671
+ dimensions:
3672
+ - name: unhandled
3673
+ - name: aspnet.requests_byte_total
3674
+ description: Size of responses and request.
3675
+ unit: bytes
3676
+ chart_type: line
3677
+ dimensions:
3678
+ - name: in
3679
+ - name: out
3680
+ - name: aspnet.requests_executing
3681
+ description: The number of requests currently executing.
3682
+ unit: requests
3683
+ chart_type: line
3684
+ dimensions:
3685
+ - name: executing
3686
+ - name: aspnet.requests_failed
3687
+ description: Number of failed requests.
3688
+ unit: requests
3689
+ chart_type: line
3690
+ dimensions:
3691
+ - name: executing
3692
+ - name: aspnet.requests_not_found
3693
+ description: Requests for resources that were not found.
3694
+ unit: requests
3695
+ chart_type: line
3696
+ dimensions:
3697
+ - name: not found
3698
+ - name: aspnet.requests_in_application_queue
3699
+ description: Requests in the application queue.
3700
+ unit: requests
3701
+ chart_type: line
3702
+ dimensions:
3703
+ - name: queue
3704
+ - name: aspnet.requests_timeout
3705
+ description: Requests that timed out.
3706
+ unit: requests
3707
+ chart_type: line
3708
+ dimensions:
3709
+ - name: timeout
3710
+ - name: aspnet.requests_succeeded
3711
+ description: Requests that executed successfully.
3712
+ unit: requests
3713
+ chart_type: line
3714
+ dimensions:
3715
+ - name: success
3716
+ - name: aspnet.sessions_active
3717
+ description: Sessions currently active.
3718
+ unit: sessions
3719
+ chart_type: line
3720
+ dimensions:
3721
+ - name: active
3722
+ - name: aspnet.sessions_abandoned
3723
+ description: Sessions explicitly abandoned.
3724
+ unit: sessions
3725
+ chart_type: line
3726
+ dimensions:
3727
+ - name: abandoned
3728
+ - name: aspnet.sessions_abandoned
3729
+ description: Sessions explicitly abandoned.
3730
+ unit: sessions
3731
+ chart_type: line
3732
+ dimensions:
3733
+ - name: abandoned
3734
+ - name: aspnet.sessions_timed_out
3735
+ description: Sessions timed out.
3736
+ unit: sessions
3737
+ chart_type: line
3738
+ dimensions:
3739
+ - name: timed out
3740
+ - name: aspnet.transactions_aborted
3741
+ description: Transactions Aborted.
3742
+ unit: transactions
3743
+ chart_type: line
3744
+ dimensions:
3745
+ - name: aborted
3746
+ - name: aspnet.transactions_committed
3747
+ description: Transactions Committed.
3748
+ unit: transactions
3749
+ chart_type: line
3750
+ dimensions:
3751
+ - name: committed
3752
+ - name: aspnet.transactions_pending
3753
+ description: Transactions Pending.
3754
+ unit: transactions
3755
+ chart_type: line
3756
+ dimensions:
3757
+ - name: pending
3758
+ - name: aspnet.events_raised_per_sec
3759
+ description: Instrumentation events.
3760
+ unit: events
3761
+ chart_type: line
3762
+ dimensions:
3763
+ - name: raised
3764
+ - name: aspnet.error_events_raised_per_sec
3765
+ description: Runtime error events raised.
3766
+ unit: errors
3767
+ chart_type: line
3768
+ dimensions:
3769
+ - name: events
3770
+ - name: aspnet.events_audit_success
3771
+ description: Audit successes in the application.
3772
+ unit: errors
3773
+ chart_type: line
3774
+ dimensions:
3775
+ - name: events
3776
+ - name: aspnet.events_audit_failure
3777
+ description: Audit Failure Events Raised
3778
+ unit: failures
3779
+ chart_type: line
3780
+ dimensions:
3781
+ - name: audit
3782
+ - name: aspnet.membership_auth_success
3783
+ description: Membership Authentication Success.
3784
+ unit: auth
3785
+ chart_type: line
3786
+ dimensions:
3787
+ - name: success
3788
+ - name: aspnet.form_authentication_success
3789
+ description: Membership Authentication Failure.
3790
+ unit: auth
3791
+ chart_type: line
3792
+ dimensions:
3793
+ - name: success
3794
+ - name: aspnet.form_authentication_success
3795
+ description: Forms Authentication Success.
3796
+ unit: auth
3797
+ chart_type: line
3798
+ dimensions:
3799
+ - name: success
3800
+ - name: aspnet.form_authentication_failure
3801
+ description: Forms Authentication Failure.
3802
+ unit: auth
3803
+ chart_type: line
3804
+ dimensions:
3805
+ - name: failure
\ No newline at end of file
src/collectors/windows.plugin/perflib-asp.c
new
+1385
@@ -0,0 +1,1385 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#include "windows_plugin.h"
4
+#include "windows-internals.h"
5
+
6
+struct aspnet_app {
7
+ RRDSET *st_aspnet_anonymous_request;
8
+ RRDSET *st_aspnet_compilations_total;
9
+ RRDSET *st_aspnet_errors_during_preprocessing;
10
+ RRDSET *st_aspnet_errors_during_compilation;
11
+ RRDSET *st_aspnet_errors_during_execution;
12
+ RRDSET *st_aspnet_errors_unhandled_execution_sec;
13
+ RRDSET *st_aspnet_requests_byte_total;
14
+ RRDSET *st_aspnet_requests_executing;
15
+ RRDSET *st_aspnet_requests_failed;
16
+ RRDSET *st_aspnet_requests_not_found;
17
+ RRDSET *st_aspnet_requests_in_application_queue;
18
+ RRDSET *st_aspnet_requests_not_authorized;
19
+ RRDSET *st_aspnet_requests_timeout;
20
+ RRDSET *st_aspnet_requests_succeeded;
21
+ RRDSET *st_aspnet_sessions_active;
22
+ RRDSET *st_aspnet_sessions_abandoned;
23
+ RRDSET *st_aspnet_sessions_timed_out;
24
+ RRDSET *st_aspnet_transactions_aborted;
25
+ RRDSET *st_aspnet_transactions_committed;
26
+ RRDSET *st_aspnet_transactions_pending;
27
+ RRDSET *st_aspnet_transactions_per_sec;
28
+ RRDSET *st_aspnet_events_raised_per_sec;
29
+ RRDSET *st_aspnet_error_events_raised_per_sec;
30
+ RRDSET *st_aspnet_audit_success_events_raised;
31
+ RRDSET *st_aspnet_audit_failures_events_raised;
32
+ RRDSET *st_aspnet_membership_authentication_success;
33
+ RRDSET *st_aspnet_membership_authentication_failure;
34
+ RRDSET *st_aspnet_form_authentication_success;
35
+ RRDSET *st_aspnet_form_authentication_failure;
36
+
37
+ RRDDIM *rd_aspnet_anonymous_request;
38
+ RRDDIM *rd_aspnet_compilations_total;
39
+ RRDDIM *rd_aspnet_errors_during_preprocessing;
40
+ RRDDIM *rd_aspnet_errors_during_compilation;
41
+ RRDDIM *rd_aspnet_errors_during_execution;
42
+ RRDDIM *rd_aspnet_errors_unhandled_execution_sec;
43
+ RRDDIM *rd_aspnet_requests_byte_total_in;
44
+ RRDDIM *rd_aspnet_requests_byte_total_out;
45
+ RRDDIM *rd_aspnet_requests_executing;
46
+ RRDDIM *rd_aspnet_requests_failed;
47
+ RRDDIM *rd_aspnet_requests_not_found;
48
+ RRDDIM *rd_aspnet_requests_in_application_queue;
49
+ RRDDIM *rd_aspnet_requests_not_authorized;
50
+ RRDDIM *rd_aspnet_requests_timeout;
51
+ RRDDIM *rd_aspnet_requests_succeeded;
52
+ RRDDIM *rd_aspnet_sessions_active;
53
+ RRDDIM *rd_aspnet_sessions_abandoned;
54
+ RRDDIM *rd_aspnet_sessions_timed_out;
55
+ RRDDIM *rd_aspnet_transactions_aborted;
56
+ RRDDIM *rd_aspnet_transactions_committed;
57
+ RRDDIM *rd_aspnet_transactions_pending;
58
+ RRDDIM *rd_aspnet_transactions_per_sec;
59
+ RRDDIM *rd_aspnet_events_raised_per_sec;
60
+ RRDDIM *rd_aspnet_error_events_raised_per_sec;
61
+ RRDDIM *rd_aspnet_audit_success_events_raised;
62
+ RRDDIM *rd_aspnet_audit_failures_events_raised;
63
+ RRDDIM *rd_aspnet_membership_authentication_success;
64
+ RRDDIM *rd_aspnet_membership_authentication_failure;
65
+ RRDDIM *rd_aspnet_form_authentication_success;
66
+ RRDDIM *rd_aspnet_form_authentication_failure;
67
+
68
+ COUNTER_DATA aspnetAnonymousRequestPerSec;
69
+ COUNTER_DATA aspnetCompilationsTotal;
70
+ COUNTER_DATA aspnetErrorsDuringPreProcessing;
71
+ COUNTER_DATA aspnetErrorsDuringCompilation;
72
+ COUNTER_DATA aspnetErrorsDuringExecution;
73
+ COUNTER_DATA aspnetErrorsUnhandledExecutionSec;
74
+ COUNTER_DATA aspnetRequestsBytesTotalIn;
75
+ COUNTER_DATA aspnetRequestsBytesTotalOut;
76
+ COUNTER_DATA aspnetRequestsExecuting;
77
+ COUNTER_DATA aspnetRequestsFailed;
78
+ COUNTER_DATA aspnetRequestsNotFound;
79
+ COUNTER_DATA aspnetRequestsInApplicationQueue;
80
+ COUNTER_DATA aspnetRequestsNotAuthorized;
81
+ COUNTER_DATA aspnetRequestsTimeout;
82
+ COUNTER_DATA aspnetRequestsSucceeded;
83
+ COUNTER_DATA aspnetSessionsActive;
84
+ COUNTER_DATA aspnetSessionsAbandoned;
85
+ COUNTER_DATA aspnetSessionsTimedOut;
86
+ COUNTER_DATA aspnetTransactionsAborted;
87
+ COUNTER_DATA aspnetTransactionsCommited;
88
+ COUNTER_DATA aspnetTransactionsPending;
89
+ COUNTER_DATA aspnetTransactionsPerSec;
90
+ COUNTER_DATA aspnetEventsRaisedPerSec;
91
+ COUNTER_DATA aspnetErrorEventsRaisedPerSec;
92
+ COUNTER_DATA aspnetAuditSuccessEventsRaised;
93
+ COUNTER_DATA aspnetAuditFailuresEventsRaised;
94
+ COUNTER_DATA aspnetMembershipAuthenticationSuccess;
95
+ COUNTER_DATA aspnetMembershipAuthenticationFailure;
96
+ COUNTER_DATA aspnetFormAuthenticationSuccess;
97
+ COUNTER_DATA aspnetFormAuthenticationFailure;
98
+};
99
+
100
+DICTIONARY *aspnet_apps;
101
+
102
+static void aspnet_app_initialize_variables(struct aspnet_app *ap)
103
+{
104
+ ap->aspnetAnonymousRequestPerSec.key = "Anonymous Requests/Sec";
105
+ ap->aspnetCompilationsTotal.key = "Compilations Total";
106
+ ap->aspnetErrorsDuringPreProcessing.key = "Errors During Preprocessing";
107
+ ap->aspnetErrorsDuringCompilation.key = "Errors During Compilation";
108
+ ap->aspnetErrorsDuringExecution.key = "Errors During Execution";
109
+ ap->aspnetErrorsUnhandledExecutionSec.key = "Errors Unhandled During Execution/Sec";
110
+ ap->aspnetRequestsBytesTotalIn.key = "Request Bytes In Total";
111
+ ap->aspnetRequestsBytesTotalOut.key = "Request Bytes Out Total";
112
+ ap->aspnetRequestsExecuting.key = "Requests Executing";
113
+ ap->aspnetRequestsFailed.key = "Requests Failed";
114
+ ap->aspnetRequestsNotFound.key = "Requests Not Found";
115
+ ap->aspnetRequestsInApplicationQueue.key = "Requests In Application Queue";
116
+ ap->aspnetRequestsNotAuthorized.key = "Requests Not Authorized";
117
+ ap->aspnetRequestsTimeout.key = "Requests Timed Out";
118
+ ap->aspnetRequestsSucceeded.key = "Requests Succeeded";
119
+ ap->aspnetSessionsActive.key = "Sessions Active";
120
+ ap->aspnetSessionsAbandoned.key = "Sessions Abandoned";
121
+ ap->aspnetSessionsTimedOut.key = "Sessions Timed Out";
122
+ ap->aspnetTransactionsAborted.key = "Transactions Aborted";
123
+ ap->aspnetTransactionsCommited.key = "Transactions Committed";
124
+ ap->aspnetTransactionsPending.key = "Transactions Pending";
125
+ ap->aspnetTransactionsPerSec.key = "Transactions/Sec";
126
+ ap->aspnetEventsRaisedPerSec.key = "Events Raised/Sec";
127
+ ap->aspnetErrorEventsRaisedPerSec.key = "Error Events Raised/Sec";
128
+ ap->aspnetAuditSuccessEventsRaised.key = "Audit Success Events Raised";
129
+ ap->aspnetAuditFailuresEventsRaised.key = "Audit Failure Events Raised";
130
+ ap->aspnetMembershipAuthenticationSuccess.key = "Membership Authentication Success";
131
+ ap->aspnetMembershipAuthenticationFailure.key = "Membership Authentication Failure";
132
+ ap->aspnetFormAuthenticationSuccess.key = "Forms Authentication Success";
133
+ ap->aspnetFormAuthenticationFailure.key = "Forms Authentication Failure";
134
+};
135
+
136
+static void
137
+dict_aspnet_insert_app_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
138
+{
139
+ struct aspnet_app *ap = value;
140
+
141
+ aspnet_app_initialize_variables(ap);
142
+}
143
+
144
+static void initialize(void)
145
+{
146
+ aspnet_apps = dictionary_create_advanced(
147
+ DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct aspnet_app));
148
+ dictionary_register_insert_callback(aspnet_apps, dict_aspnet_insert_app_cb, NULL);
149
+}
150
+
151
+static void netdata_aspnet_application_restarts(COUNTER_DATA *value, int update_every)
152
+{
153
+ static RRDSET *st_aspnet_application_restarts = NULL;
154
+ static RRDDIM *rd_aspnet_application_restarts = NULL;
155
+
156
+ if (unlikely(!st_aspnet_application_restarts)) {
157
+ st_aspnet_application_restarts = rrdset_create_localhost(
158
+ "aspnet",
159
+ "application_restarts",
160
+ NULL,
161
+ "aspnet",
162
+ "aspnet.application_restarts",
163
+ "Number of times the application has been restarted.",
164
+ "restarts",
165
+ PLUGIN_WINDOWS_NAME,
166
+ "PerflibASP",
167
+ PRIO_ASPNET_APPLICATION_RESTART,
168
+ update_every,
169
+ RRDSET_TYPE_LINE);
170
+
171
+ rd_aspnet_application_restarts =
172
+ rrddim_add(st_aspnet_application_restarts, "restarts", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
173
+ }
174
+
175
+ rrddim_set_by_pointer(
176
+ st_aspnet_application_restarts, rd_aspnet_application_restarts, (collected_number)value->current.Data);
177
+ rrdset_done(st_aspnet_application_restarts);
178
+}
179
+
180
+static void netdata_aspnet_worker_process_restarts(COUNTER_DATA *value, int update_every)
181
+{
182
+ static RRDSET *st_aspnet_worker_process_restarts = NULL;
183
+ static RRDDIM *rd_aspnet_worker_process_restarts = NULL;
184
+
185
+ if (unlikely(!st_aspnet_worker_process_restarts)) {
186
+ st_aspnet_worker_process_restarts = rrdset_create_localhost(
187
+ "aspnet",
188
+ "worker_process_restarts",
189
+ NULL,
190
+ "aspnet",
191
+ "aspnet.worker_process_restarts",
192
+ "Number of times a worker process has restarted on the machine.",
193
+ "restarts",
194
+ PLUGIN_WINDOWS_NAME,
195
+ "PerflibASP",
196
+ PRIO_ASPNET_WORKER_PROCESS_RESTART,
197
+ update_every,
198
+ RRDSET_TYPE_LINE);
199
+
200
+ rd_aspnet_worker_process_restarts =
201
+ rrddim_add(st_aspnet_worker_process_restarts, "restarts", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
202
+ }
203
+
204
+ rrddim_set_by_pointer(
205
+ st_aspnet_worker_process_restarts, rd_aspnet_worker_process_restarts, (collected_number)value->current.Data);
206
+ rrdset_done(st_aspnet_worker_process_restarts);
207
+}
208
+
209
+static void netdata_aspnet_global_objects(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
210
+{
211
+ static COUNTER_DATA appApplicationRestarts = {.key = "Application Restarts"};
212
+ static COUNTER_DATA appWorkerProcessRestarts = {.key = "Worker Process Restarts"};
213
+
214
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &appApplicationRestarts))
215
+ netdata_aspnet_application_restarts(&appApplicationRestarts, update_every);
216
+
217
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &appWorkerProcessRestarts))
218
+ netdata_aspnet_worker_process_restarts(&appWorkerProcessRestarts, update_every);
219
+}
220
+
221
+static void netdata_aspnet_anonymous_request(struct aspnet_app *aa, char *app, int update_every)
222
+{
223
+ if (unlikely(!aa->st_aspnet_anonymous_request)) {
224
+ char id[RRD_ID_LENGTH_MAX + 1];
225
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_anonymous_request", app);
226
+
227
+ aa->st_aspnet_anonymous_request = rrdset_create_localhost(
228
+ "aspnet",
229
+ id,
230
+ NULL,
231
+ "aspnet",
232
+ "aspnet.anonymous_request",
233
+ "Number of requests utilizing anonymous authentication.",
234
+ "requests",
235
+ PLUGIN_WINDOWS_NAME,
236
+ "PerflibASP",
237
+ PRIO_ASPNET_APP_ANONYMOUS_REQUEST,
238
+ update_every,
239
+ RRDSET_TYPE_LINE);
240
+
241
+ aa->rd_aspnet_anonymous_request =
242
+ rrddim_add(aa->st_aspnet_anonymous_request, "request", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
243
+
244
+ rrdlabels_add(aa->st_aspnet_anonymous_request->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
245
+ }
246
+
247
+ rrddim_set_by_pointer(
248
+ aa->st_aspnet_anonymous_request,
249
+ aa->rd_aspnet_anonymous_request,
250
+ (collected_number)aa->aspnetAnonymousRequestPerSec.current.Data);
251
+ rrdset_done(aa->st_aspnet_anonymous_request);
252
+}
253
+
254
+static void netdata_aspnet_compilations_total(struct aspnet_app *aa, char *app, int update_every)
255
+{
256
+ if (unlikely(!aa->st_aspnet_compilations_total)) {
257
+ char id[RRD_ID_LENGTH_MAX + 1];
258
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_compilation_totals", app);
259
+
260
+ aa->st_aspnet_compilations_total = rrdset_create_localhost(
261
+ "aspnet",
262
+ id,
263
+ NULL,
264
+ "aspnet",
265
+ "aspnet.compilation_totals",
266
+ "Number of source files dynamically compiled.",
267
+ "compilations",
268
+ PLUGIN_WINDOWS_NAME,
269
+ "PerflibASP",
270
+ PRIO_ASPNET_APP_COMPILATION_TOTALS,
271
+ update_every,
272
+ RRDSET_TYPE_LINE);
273
+
274
+ aa->rd_aspnet_compilations_total =
275
+ rrddim_add(aa->st_aspnet_compilations_total, "compilation", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
276
+
277
+ rrdlabels_add(aa->st_aspnet_compilations_total->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
278
+ }
279
+
280
+ rrddim_set_by_pointer(
281
+ aa->st_aspnet_compilations_total,
282
+ aa->rd_aspnet_compilations_total,
283
+ (collected_number)aa->aspnetCompilationsTotal.current.Data);
284
+ rrdset_done(aa->st_aspnet_compilations_total);
285
+}
286
+
287
+static void netdata_aspnet_errors_during_preprocessing(struct aspnet_app *aa, char *app, int update_every)
288
+{
289
+ if (unlikely(!aa->st_aspnet_errors_during_preprocessing)) {
290
+ char id[RRD_ID_LENGTH_MAX + 1];
291
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_errors_during_preprocessing", app);
292
+
293
+ aa->st_aspnet_errors_during_preprocessing = rrdset_create_localhost(
294
+ "aspnet",
295
+ id,
296
+ NULL,
297
+ "aspnet",
298
+ "aspnet.errors_during_preprocessing",
299
+ "Errors During Preprocessing.",
300
+ "errors",
301
+ PLUGIN_WINDOWS_NAME,
302
+ "PerflibASP",
303
+ PRIO_ASPNET_ERRORS_DURING_PREPROCESSING,
304
+ update_every,
305
+ RRDSET_TYPE_LINE);
306
+
307
+ aa->rd_aspnet_errors_during_preprocessing =
308
+ rrddim_add(aa->st_aspnet_errors_during_preprocessing, "preprocessing", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
309
+
310
+ rrdlabels_add(aa->st_aspnet_errors_during_preprocessing->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
311
+ }
312
+
313
+ rrddim_set_by_pointer(
314
+ aa->st_aspnet_errors_during_preprocessing,
315
+ aa->rd_aspnet_errors_during_preprocessing,
316
+ (collected_number)aa->aspnetErrorsDuringPreProcessing.current.Data);
317
+ rrdset_done(aa->st_aspnet_errors_during_preprocessing);
318
+}
319
+
320
+static void netdata_aspnet_errors_during_compilation(struct aspnet_app *aa, char *app, int update_every)
321
+{
322
+ if (unlikely(!aa->st_aspnet_errors_during_compilation)) {
323
+ char id[RRD_ID_LENGTH_MAX + 1];
324
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_errors_during_compilation", app);
325
+
326
+ aa->st_aspnet_errors_during_compilation = rrdset_create_localhost(
327
+ "aspnet",
328
+ id,
329
+ NULL,
330
+ "aspnet",
331
+ "aspnet.errors_during_compilation",
332
+ "Errors During Compilation.",
333
+ "errors",
334
+ PLUGIN_WINDOWS_NAME,
335
+ "PerflibASP",
336
+ PRIO_ASPNET_ERRORS_DURING_COMPILATION,
337
+ update_every,
338
+ RRDSET_TYPE_LINE);
339
+
340
+ aa->rd_aspnet_errors_during_compilation =
341
+ rrddim_add(aa->st_aspnet_errors_during_compilation, "compilation", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
342
+
343
+ rrdlabels_add(aa->st_aspnet_errors_during_compilation->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
344
+ }
345
+
346
+ rrddim_set_by_pointer(
347
+ aa->st_aspnet_errors_during_compilation,
348
+ aa->rd_aspnet_errors_during_compilation,
349
+ (collected_number)aa->aspnetErrorsDuringCompilation.current.Data);
350
+ rrdset_done(aa->st_aspnet_errors_during_compilation);
351
+}
352
+
353
+static void netdata_aspnet_errors_during_execution(struct aspnet_app *aa, char *app, int update_every)
354
+{
355
+ if (unlikely(!aa->st_aspnet_errors_during_execution)) {
356
+ char id[RRD_ID_LENGTH_MAX + 1];
357
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_errors_during_execution", app);
358
+
359
+ aa->st_aspnet_errors_during_execution = rrdset_create_localhost(
360
+ "aspnet",
361
+ id,
362
+ NULL,
363
+ "aspnet",
364
+ "aspnet.errors_during_execution",
365
+ "Errors During Execution.",
366
+ "errors",
367
+ PLUGIN_WINDOWS_NAME,
368
+ "PerflibASP",
369
+ PRIO_ASPNET_ERRORS_DURING_EXECUTION,
370
+ update_every,
371
+ RRDSET_TYPE_LINE);
372
+
373
+ aa->rd_aspnet_errors_during_execution =
374
+ rrddim_add(aa->st_aspnet_errors_during_execution, "execution", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
375
+
376
+ rrdlabels_add(aa->st_aspnet_errors_during_execution->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
377
+ }
378
+
379
+ rrddim_set_by_pointer(
380
+ aa->st_aspnet_errors_during_execution,
381
+ aa->rd_aspnet_errors_during_execution,
382
+ (collected_number)aa->aspnetErrorsDuringExecution.current.Data);
383
+ rrdset_done(aa->st_aspnet_errors_during_execution);
384
+}
385
+
386
+static void netdata_aspnet_errors_during_unhandled_execution(struct aspnet_app *aa, char *app, int update_every)
387
+{
388
+ if (unlikely(!aa->st_aspnet_errors_unhandled_execution_sec)) {
389
+ char id[RRD_ID_LENGTH_MAX + 1];
390
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_errors_during_unhandled_execution", app);
391
+
392
+ aa->st_aspnet_errors_unhandled_execution_sec = rrdset_create_localhost(
393
+ "aspnet",
394
+ id,
395
+ NULL,
396
+ "aspnet",
397
+ "aspnet.errors_during_unhandled_execution",
398
+ "Errors Unhandled During Execution.",
399
+ "errors",
400
+ PLUGIN_WINDOWS_NAME,
401
+ "PerflibASP",
402
+ PRIO_ASPNET_ERRORS_UNHANDLED_EXECUTION_PER_SEC,
403
+ update_every,
404
+ RRDSET_TYPE_LINE);
405
+
406
+ aa->rd_aspnet_errors_unhandled_execution_sec =
407
+ rrddim_add(aa->st_aspnet_errors_unhandled_execution_sec, "unhandled", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
408
+
409
+ rrdlabels_add(aa->st_aspnet_errors_unhandled_execution_sec->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
410
+ }
411
+
412
+ rrddim_set_by_pointer(
413
+ aa->st_aspnet_errors_unhandled_execution_sec,
414
+ aa->rd_aspnet_errors_unhandled_execution_sec,
415
+ (collected_number)aa->aspnetErrorsUnhandledExecutionSec.current.Data);
416
+ rrdset_done(aa->st_aspnet_errors_unhandled_execution_sec);
417
+}
418
+
419
+static inline void netdata_aspnet_apps_runtime_errors(
420
+ PERF_DATA_BLOCK *pDataBlock,
421
+ PERF_OBJECT_TYPE *pObjectType,
422
+ struct aspnet_app *aa,
423
+ int update_every)
424
+{
425
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetErrorsDuringPreProcessing))
426
+ netdata_aspnet_errors_during_preprocessing(aa, windows_shared_buffer, update_every);
427
+
428
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetErrorsDuringCompilation))
429
+ netdata_aspnet_errors_during_compilation(aa, windows_shared_buffer, update_every);
430
+
431
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetErrorsDuringExecution))
432
+ netdata_aspnet_errors_during_execution(aa, windows_shared_buffer, update_every);
433
+
434
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetErrorsUnhandledExecutionSec))
435
+ netdata_aspnet_errors_during_unhandled_execution(aa, windows_shared_buffer, update_every);
436
+}
437
+
438
+static void netdata_aspnet_requests_bytes(struct aspnet_app *aa, char *app, int update_every)
439
+{
440
+ if (unlikely(!aa->st_aspnet_requests_byte_total)) {
441
+ char id[RRD_ID_LENGTH_MAX + 1];
442
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_byte_total", app);
443
+
444
+ aa->st_aspnet_requests_byte_total = rrdset_create_localhost(
445
+ "aspnet",
446
+ id,
447
+ NULL,
448
+ "aspnet",
449
+ "aspnet.requests_byte_total",
450
+ "Size of responses and request.",
451
+ "bytes",
452
+ PLUGIN_WINDOWS_NAME,
453
+ "PerflibASP",
454
+ PRIO_ASPNET_REQUESTS_BYTES_TOTAL,
455
+ update_every,
456
+ RRDSET_TYPE_LINE);
457
+
458
+ aa->rd_aspnet_requests_byte_total_in =
459
+ rrddim_add(aa->st_aspnet_requests_byte_total, "in", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
460
+
461
+ aa->rd_aspnet_requests_byte_total_out =
462
+ rrddim_add(aa->st_aspnet_requests_byte_total, "out", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
463
+
464
+ rrdlabels_add(aa->st_aspnet_requests_byte_total->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
465
+ }
466
+
467
+ rrddim_set_by_pointer(
468
+ aa->st_aspnet_requests_byte_total,
469
+ aa->rd_aspnet_requests_byte_total_in,
470
+ (collected_number)aa->aspnetRequestsBytesTotalIn.current.Data);
471
+
472
+ rrddim_set_by_pointer(
473
+ aa->st_aspnet_requests_byte_total,
474
+ aa->rd_aspnet_requests_byte_total_out,
475
+ (collected_number)aa->aspnetRequestsBytesTotalOut.current.Data);
476
+ rrdset_done(aa->st_aspnet_requests_byte_total);
477
+}
478
+
479
+static void netdata_aspnet_requests_executing(struct aspnet_app *aa, char *app, int update_every)
480
+{
481
+ if (unlikely(!aa->st_aspnet_requests_executing)) {
482
+ char id[RRD_ID_LENGTH_MAX + 1];
483
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_executing", app);
484
+
485
+ aa->st_aspnet_requests_executing = rrdset_create_localhost(
486
+ "aspnet",
487
+ id,
488
+ NULL,
489
+ "aspnet",
490
+ "aspnet.requests_executing",
491
+ "The number of requests currently executing.",
492
+ "requests",
493
+ PLUGIN_WINDOWS_NAME,
494
+ "PerflibASP",
495
+ PRIO_ASPNET_REQUESTS_EXECUTING,
496
+ update_every,
497
+ RRDSET_TYPE_LINE);
498
+
499
+ aa->rd_aspnet_requests_executing =
500
+ rrddim_add(aa->st_aspnet_requests_executing, "executing", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
501
+
502
+ rrdlabels_add(aa->st_aspnet_requests_executing->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
503
+ }
504
+
505
+ rrddim_set_by_pointer(
506
+ aa->st_aspnet_requests_executing,
507
+ aa->rd_aspnet_requests_executing,
508
+ (collected_number)aa->aspnetRequestsBytesTotalIn.current.Data);
509
+ rrdset_done(aa->st_aspnet_requests_executing);
510
+}
511
+
512
+static void netdata_aspnet_requests_failed(struct aspnet_app *aa, char *app, int update_every)
513
+{
514
+ if (unlikely(!aa->st_aspnet_requests_failed)) {
515
+ char id[RRD_ID_LENGTH_MAX + 1];
516
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_failed", app);
517
+
518
+ aa->st_aspnet_requests_failed = rrdset_create_localhost(
519
+ "aspnet",
520
+ id,
521
+ NULL,
522
+ "aspnet",
523
+ "aspnet.requests_failed",
524
+ "Number of failed requests.",
525
+ "requests",
526
+ PLUGIN_WINDOWS_NAME,
527
+ "PerflibASP",
528
+ PRIO_ASPNET_REQUESTS_FAILED,
529
+ update_every,
530
+ RRDSET_TYPE_LINE);
531
+
532
+ aa->rd_aspnet_requests_failed =
533
+ rrddim_add(aa->st_aspnet_requests_failed, "failed", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
534
+
535
+ rrdlabels_add(aa->st_aspnet_requests_failed->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
536
+ }
537
+
538
+ rrddim_set_by_pointer(
539
+ aa->st_aspnet_requests_failed,
540
+ aa->rd_aspnet_requests_failed,
541
+ (collected_number)aa->aspnetRequestsFailed.current.Data);
542
+ rrdset_done(aa->st_aspnet_requests_failed);
543
+}
544
+
545
+static void netdata_aspnet_requests_not_found(struct aspnet_app *aa, char *app, int update_every)
546
+{
547
+ if (unlikely(!aa->st_aspnet_requests_not_found)) {
548
+ char id[RRD_ID_LENGTH_MAX + 1];
549
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_not_found", app);
550
+
551
+ aa->st_aspnet_requests_not_found = rrdset_create_localhost(
552
+ "aspnet",
553
+ id,
554
+ NULL,
555
+ "aspnet",
556
+ "aspnet.requests_not_found",
557
+ "Requests for resources that were not found.",
558
+ "requests",
559
+ PLUGIN_WINDOWS_NAME,
560
+ "PerflibASP",
561
+ PRIO_ASPNET_REQUESTS_NOT_FOUND,
562
+ update_every,
563
+ RRDSET_TYPE_LINE);
564
+
565
+ aa->rd_aspnet_requests_not_found =
566
+ rrddim_add(aa->st_aspnet_requests_not_found, "not found", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
567
+
568
+ rrdlabels_add(aa->st_aspnet_requests_not_found->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
569
+ }
570
+
571
+ rrddim_set_by_pointer(
572
+ aa->st_aspnet_requests_not_found,
573
+ aa->rd_aspnet_requests_not_found,
574
+ (collected_number)aa->aspnetRequestsNotFound.current.Data);
575
+ rrdset_done(aa->st_aspnet_requests_not_found);
576
+}
577
+
578
+static void netdata_aspnet_requests_in_application_queue(struct aspnet_app *aa, char *app, int update_every)
579
+{
580
+ if (unlikely(!aa->st_aspnet_requests_in_application_queue)) {
581
+ char id[RRD_ID_LENGTH_MAX + 1];
582
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_in_application_queue", app);
583
+
584
+ aa->st_aspnet_requests_in_application_queue = rrdset_create_localhost(
585
+ "aspnet",
586
+ id,
587
+ NULL,
588
+ "aspnet",
589
+ "aspnet.requests_in_application_queue",
590
+ "Requests in the application queue.",
591
+ "requests",
592
+ PLUGIN_WINDOWS_NAME,
593
+ "PerflibASP",
594
+ PRIO_ASPNET_REQUESTS_IN_APPLICATION_QUEUE,
595
+ update_every,
596
+ RRDSET_TYPE_LINE);
597
+
598
+ aa->rd_aspnet_requests_in_application_queue =
599
+ rrddim_add(aa->st_aspnet_requests_in_application_queue, "queue", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
600
+
601
+ rrdlabels_add(aa->st_aspnet_requests_in_application_queue->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
602
+ }
603
+
604
+ rrddim_set_by_pointer(
605
+ aa->st_aspnet_requests_in_application_queue,
606
+ aa->rd_aspnet_requests_in_application_queue,
607
+ (collected_number)aa->aspnetRequestsInApplicationQueue.current.Data);
608
+ rrdset_done(aa->st_aspnet_requests_in_application_queue);
609
+}
610
+
611
+static void netdata_aspnet_requests_not_authorized(struct aspnet_app *aa, char *app, int update_every)
612
+{
613
+ if (unlikely(!aa->st_aspnet_requests_not_authorized)) {
614
+ char id[RRD_ID_LENGTH_MAX + 1];
615
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_not_authorized", app);
616
+
617
+ aa->st_aspnet_requests_not_authorized = rrdset_create_localhost(
618
+ "aspnet",
619
+ id,
620
+ NULL,
621
+ "aspnet",
622
+ "aspnet.requests_not_authorized",
623
+ "Requests in the application queue.",
624
+ "requests",
625
+ PLUGIN_WINDOWS_NAME,
626
+ "PerflibASP",
627
+ PRIO_ASPNET_REQUESTS_NOT_AUTHORIZED,
628
+ update_every,
629
+ RRDSET_TYPE_LINE);
630
+
631
+ aa->rd_aspnet_requests_not_authorized =
632
+ rrddim_add(aa->st_aspnet_requests_not_authorized, "queue", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
633
+
634
+ rrdlabels_add(aa->st_aspnet_requests_not_authorized->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
635
+ }
636
+
637
+ rrddim_set_by_pointer(
638
+ aa->st_aspnet_requests_not_authorized,
639
+ aa->rd_aspnet_requests_not_authorized,
640
+ (collected_number)aa->aspnetRequestsNotAuthorized.current.Data);
641
+ rrdset_done(aa->st_aspnet_requests_not_authorized);
642
+}
643
+
644
+static void netdata_aspnet_requests_timeout(struct aspnet_app *aa, char *app, int update_every)
645
+{
646
+ if (unlikely(!aa->st_aspnet_requests_timeout)) {
647
+ char id[RRD_ID_LENGTH_MAX + 1];
648
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_timeout", app);
649
+
650
+ aa->st_aspnet_requests_timeout = rrdset_create_localhost(
651
+ "aspnet",
652
+ id,
653
+ NULL,
654
+ "aspnet",
655
+ "aspnet.requests_timeout",
656
+ "Requests that timed out.",
657
+ "requests",
658
+ PLUGIN_WINDOWS_NAME,
659
+ "PerflibASP",
660
+ PRIO_ASPNET_REQUESTS_TIMEOUT,
661
+ update_every,
662
+ RRDSET_TYPE_LINE);
663
+
664
+ aa->rd_aspnet_requests_timeout =
665
+ rrddim_add(aa->st_aspnet_requests_timeout, "timeout", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
666
+
667
+ rrdlabels_add(aa->st_aspnet_requests_timeout->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
668
+ }
669
+
670
+ rrddim_set_by_pointer(
671
+ aa->st_aspnet_requests_timeout,
672
+ aa->rd_aspnet_requests_timeout,
673
+ (collected_number)aa->aspnetRequestsTimeout.current.Data);
674
+ rrdset_done(aa->st_aspnet_requests_timeout);
675
+}
676
+
677
+static void netdata_aspnet_requests_succeeded(struct aspnet_app *aa, char *app, int update_every)
678
+{
679
+ if (unlikely(!aa->st_aspnet_requests_succeeded)) {
680
+ char id[RRD_ID_LENGTH_MAX + 1];
681
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_requests_succeeded", app);
682
+
683
+ aa->st_aspnet_requests_succeeded = rrdset_create_localhost(
684
+ "aspnet",
685
+ id,
686
+ NULL,
687
+ "aspnet",
688
+ "aspnet.requests_succeeded",
689
+ "Requests that executed successfully.",
690
+ "requests",
691
+ PLUGIN_WINDOWS_NAME,
692
+ "PerflibASP",
693
+ PRIO_ASPNET_REQUESTS_SUCCEEDED,
694
+ update_every,
695
+ RRDSET_TYPE_LINE);
696
+
697
+ aa->rd_aspnet_requests_succeeded =
698
+ rrddim_add(aa->st_aspnet_requests_succeeded, "success", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
699
+
700
+ rrdlabels_add(aa->st_aspnet_requests_succeeded->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
701
+ }
702
+
703
+ rrddim_set_by_pointer(
704
+ aa->st_aspnet_requests_succeeded,
705
+ aa->rd_aspnet_requests_succeeded,
706
+ (collected_number)aa->aspnetRequestsSucceeded.current.Data);
707
+ rrdset_done(aa->st_aspnet_requests_succeeded);
708
+}
709
+
710
+static inline void netdata_aspnet_apps_requests(
711
+ PERF_DATA_BLOCK *pDataBlock,
712
+ PERF_OBJECT_TYPE *pObjectType,
713
+ struct aspnet_app *aa,
714
+ int update_every)
715
+{
716
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsBytesTotalIn) &&
717
+ perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsBytesTotalOut))
718
+ netdata_aspnet_requests_bytes(aa, windows_shared_buffer, update_every);
719
+
720
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsExecuting))
721
+ netdata_aspnet_requests_executing(aa, windows_shared_buffer, update_every);
722
+
723
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsFailed))
724
+ netdata_aspnet_requests_failed(aa, windows_shared_buffer, update_every);
725
+
726
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsNotFound))
727
+ netdata_aspnet_requests_not_found(aa, windows_shared_buffer, update_every);
728
+
729
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsInApplicationQueue))
730
+ netdata_aspnet_requests_in_application_queue(aa, windows_shared_buffer, update_every);
731
+
732
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsNotAuthorized))
733
+ netdata_aspnet_requests_not_authorized(aa, windows_shared_buffer, update_every);
734
+
735
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsTimeout))
736
+ netdata_aspnet_requests_timeout(aa, windows_shared_buffer, update_every);
737
+
738
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetRequestsSucceeded))
739
+ netdata_aspnet_requests_succeeded(aa, windows_shared_buffer, update_every);
740
+}
741
+
742
+static void netdata_aspnet_sessions_active(struct aspnet_app *aa, char *app, int update_every)
743
+{
744
+ if (unlikely(!aa->st_aspnet_sessions_active)) {
745
+ char id[RRD_ID_LENGTH_MAX + 1];
746
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_sessions_active", app);
747
+
748
+ aa->st_aspnet_sessions_active = rrdset_create_localhost(
749
+ "aspnet",
750
+ id,
751
+ NULL,
752
+ "aspnet",
753
+ "aspnet.sessions_active",
754
+ "Sessions currently active.",
755
+ "sessions",
756
+ PLUGIN_WINDOWS_NAME,
757
+ "PerflibASP",
758
+ PRIO_ASPNET_SESSIONS_ACTIVE,
759
+ update_every,
760
+ RRDSET_TYPE_LINE);
761
+
762
+ aa->rd_aspnet_sessions_active =
763
+ rrddim_add(aa->st_aspnet_sessions_active, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
764
+
765
+ rrdlabels_add(aa->st_aspnet_sessions_active->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
766
+ }
767
+
768
+ rrddim_set_by_pointer(
769
+ aa->st_aspnet_sessions_active,
770
+ aa->rd_aspnet_sessions_active,
771
+ (collected_number)aa->aspnetSessionsActive.current.Data);
772
+ rrdset_done(aa->st_aspnet_sessions_active);
773
+}
774
+
775
+static void netdata_aspnet_sessions_abandoned(struct aspnet_app *aa, char *app, int update_every)
776
+{
777
+ if (unlikely(!aa->st_aspnet_sessions_abandoned)) {
778
+ char id[RRD_ID_LENGTH_MAX + 1];
779
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_sessions_abandoned", app);
780
+
781
+ aa->st_aspnet_sessions_abandoned = rrdset_create_localhost(
782
+ "aspnet",
783
+ id,
784
+ NULL,
785
+ "aspnet",
786
+ "aspnet.sessions_abandoned",
787
+ "Sessions explicitly abandoned.",
788
+ "sessions",
789
+ PLUGIN_WINDOWS_NAME,
790
+ "PerflibASP",
791
+ PRIO_ASPNET_SESSIONS_ABANDONED,
792
+ update_every,
793
+ RRDSET_TYPE_LINE);
794
+
795
+ aa->rd_aspnet_sessions_abandoned =
796
+ rrddim_add(aa->st_aspnet_sessions_abandoned, "abandoned", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
797
+
798
+ rrdlabels_add(aa->st_aspnet_sessions_abandoned->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
799
+ }
800
+
801
+ rrddim_set_by_pointer(
802
+ aa->st_aspnet_sessions_abandoned,
803
+ aa->rd_aspnet_sessions_abandoned,
804
+ (collected_number)aa->aspnetSessionsAbandoned.current.Data);
805
+ rrdset_done(aa->st_aspnet_sessions_abandoned);
806
+}
807
+
808
+static void netdata_aspnet_sessions_timedout(struct aspnet_app *aa, char *app, int update_every)
809
+{
810
+ if (unlikely(!aa->st_aspnet_sessions_timed_out)) {
811
+ char id[RRD_ID_LENGTH_MAX + 1];
812
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_sessions_timed_out", app);
813
+
814
+ aa->st_aspnet_sessions_timed_out = rrdset_create_localhost(
815
+ "aspnet",
816
+ id,
817
+ NULL,
818
+ "aspnet",
819
+ "aspnet.sessions_timed_out",
820
+ "Sessions timed out.",
821
+ "sessions",
822
+ PLUGIN_WINDOWS_NAME,
823
+ "PerflibASP",
824
+ PRIO_ASPNET_SESSIONS_TIMEDOUT,
825
+ update_every,
826
+ RRDSET_TYPE_LINE);
827
+
828
+ aa->rd_aspnet_sessions_timed_out =
829
+ rrddim_add(aa->st_aspnet_sessions_timed_out, "timed out", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
830
+
831
+ rrdlabels_add(aa->st_aspnet_sessions_timed_out->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
832
+ }
833
+
834
+ rrddim_set_by_pointer(
835
+ aa->st_aspnet_sessions_timed_out,
836
+ aa->rd_aspnet_sessions_timed_out,
837
+ (collected_number)aa->aspnetSessionsTimedOut.current.Data);
838
+ rrdset_done(aa->st_aspnet_sessions_timed_out);
839
+}
840
+
841
+static inline void netdata_aspnet_apps_sessions(
842
+ PERF_DATA_BLOCK *pDataBlock,
843
+ PERF_OBJECT_TYPE *pObjectType,
844
+ struct aspnet_app *aa,
845
+ int update_every)
846
+{
847
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetSessionsActive))
848
+ netdata_aspnet_sessions_active(aa, windows_shared_buffer, update_every);
849
+
850
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetSessionsAbandoned))
851
+ netdata_aspnet_sessions_abandoned(aa, windows_shared_buffer, update_every);
852
+
853
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetSessionsTimedOut))
854
+ netdata_aspnet_sessions_timedout(aa, windows_shared_buffer, update_every);
855
+}
856
+
857
+static void netdata_aspnet_transactions_aborted(struct aspnet_app *aa, char *app, int update_every)
858
+{
859
+ if (unlikely(!aa->st_aspnet_transactions_aborted)) {
860
+ char id[RRD_ID_LENGTH_MAX + 1];
861
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_transactions_aborted", app);
862
+
863
+ aa->st_aspnet_transactions_aborted = rrdset_create_localhost(
864
+ "aspnet",
865
+ id,
866
+ NULL,
867
+ "aspnet",
868
+ "aspnet.transactions_aborted",
869
+ "Transactions Aborted",
870
+ "transactions",
871
+ PLUGIN_WINDOWS_NAME,
872
+ "PerflibASP",
873
+ PRIO_ASPNET_TRANSACTIONS_ABORTED,
874
+ update_every,
875
+ RRDSET_TYPE_LINE);
876
+
877
+ aa->rd_aspnet_transactions_aborted =
878
+ rrddim_add(aa->st_aspnet_transactions_aborted, "aborted", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
879
+
880
+ rrdlabels_add(aa->st_aspnet_transactions_aborted->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
881
+ }
882
+
883
+ rrddim_set_by_pointer(
884
+ aa->st_aspnet_transactions_aborted,
885
+ aa->rd_aspnet_transactions_aborted,
886
+ (collected_number)aa->aspnetTransactionsAborted.current.Data);
887
+ rrdset_done(aa->st_aspnet_transactions_aborted);
888
+}
889
+
890
+static void netdata_aspnet_transactions_committed(struct aspnet_app *aa, char *app, int update_every)
891
+{
892
+ if (unlikely(!aa->st_aspnet_transactions_committed)) {
893
+ char id[RRD_ID_LENGTH_MAX + 1];
894
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_transactions_committed", app);
895
+
896
+ aa->st_aspnet_transactions_committed = rrdset_create_localhost(
897
+ "aspnet",
898
+ id,
899
+ NULL,
900
+ "aspnet",
901
+ "aspnet.transactions_committed",
902
+ "Transactions Committed.",
903
+ "transactions",
904
+ PLUGIN_WINDOWS_NAME,
905
+ "PerflibASP",
906
+ PRIO_ASPNET_TRANSACTIONS_COMMITED,
907
+ update_every,
908
+ RRDSET_TYPE_LINE);
909
+
910
+ aa->rd_aspnet_transactions_committed =
911
+ rrddim_add(aa->st_aspnet_transactions_committed, "committed", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
912
+
913
+ rrdlabels_add(aa->st_aspnet_transactions_committed->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
914
+ }
915
+
916
+ rrddim_set_by_pointer(
917
+ aa->st_aspnet_transactions_committed,
918
+ aa->rd_aspnet_transactions_committed,
919
+ (collected_number)aa->aspnetTransactionsCommited.current.Data);
920
+ rrdset_done(aa->st_aspnet_transactions_committed);
921
+}
922
+
923
+static void netdata_aspnet_transactions_pending(struct aspnet_app *aa, char *app, int update_every)
924
+{
925
+ if (unlikely(!aa->st_aspnet_transactions_pending)) {
926
+ char id[RRD_ID_LENGTH_MAX + 1];
927
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_transactions_pending", app);
928
+
929
+ aa->st_aspnet_transactions_pending = rrdset_create_localhost(
930
+ "aspnet",
931
+ id,
932
+ NULL,
933
+ "aspnet",
934
+ "aspnet.transactions_pending",
935
+ "Transactions Pending.",
936
+ "transactions",
937
+ PLUGIN_WINDOWS_NAME,
938
+ "PerflibASP",
939
+ PRIO_ASPNET_TRANSACTIONS_COMMITED,
940
+ update_every,
941
+ RRDSET_TYPE_LINE);
942
+
943
+ aa->rd_aspnet_transactions_pending =
944
+ rrddim_add(aa->st_aspnet_transactions_pending, "pending", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
945
+
946
+ rrdlabels_add(aa->st_aspnet_transactions_pending->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
947
+ }
948
+
949
+ rrddim_set_by_pointer(
950
+ aa->st_aspnet_transactions_pending,
951
+ aa->rd_aspnet_transactions_pending,
952
+ (collected_number)aa->aspnetTransactionsPending.current.Data);
953
+ rrdset_done(aa->st_aspnet_transactions_pending);
954
+}
955
+
956
+static void netdata_aspnet_transactions_per_sec(struct aspnet_app *aa, char *app, int update_every)
957
+{
958
+ if (unlikely(!aa->st_aspnet_transactions_per_sec)) {
959
+ char id[RRD_ID_LENGTH_MAX + 1];
960
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_transactions_per_sec", app);
961
+
962
+ aa->st_aspnet_transactions_per_sec = rrdset_create_localhost(
963
+ "aspnet",
964
+ id,
965
+ NULL,
966
+ "aspnet",
967
+ "aspnet.transactions_per_sec",
968
+ "Transactions Started.",
969
+ "transactions",
970
+ PLUGIN_WINDOWS_NAME,
971
+ "PerflibASP",
972
+ PRIO_ASPNET_TRANSACTIONS_COMMITED,
973
+ update_every,
974
+ RRDSET_TYPE_LINE);
975
+
976
+ aa->rd_aspnet_transactions_per_sec =
977
+ rrddim_add(aa->st_aspnet_transactions_per_sec, "transactions", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
978
+
979
+ rrdlabels_add(aa->st_aspnet_transactions_per_sec->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
980
+ }
981
+
982
+ rrddim_set_by_pointer(
983
+ aa->st_aspnet_transactions_per_sec,
984
+ aa->rd_aspnet_transactions_per_sec,
985
+ (collected_number)aa->aspnetTransactionsPerSec.current.Data);
986
+ rrdset_done(aa->st_aspnet_transactions_per_sec);
987
+}
988
+
989
+static inline void netdata_aspnet_apps_transactions(
990
+ PERF_DATA_BLOCK *pDataBlock,
991
+ PERF_OBJECT_TYPE *pObjectType,
992
+ struct aspnet_app *aa,
993
+ int update_every)
994
+{
995
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetTransactionsAborted))
996
+ netdata_aspnet_transactions_aborted(aa, windows_shared_buffer, update_every);
997
+
998
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetTransactionsCommited))
999
+ netdata_aspnet_transactions_committed(aa, windows_shared_buffer, update_every);
1000
+
1001
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetTransactionsPending))
1002
+ netdata_aspnet_transactions_aborted(aa, windows_shared_buffer, update_every);
1003
+
1004
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetTransactionsPerSec))
1005
+ netdata_aspnet_transactions_aborted(aa, windows_shared_buffer, update_every);
1006
+}
1007
+
1008
+static void netdata_aspnet_events_raised(struct aspnet_app *aa, char *app, int update_every)
1009
+{
1010
+ if (unlikely(!aa->st_aspnet_events_raised_per_sec)) {
1011
+ char id[RRD_ID_LENGTH_MAX + 1];
1012
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_events_raised_per_sec", app);
1013
+
1014
+ aa->st_aspnet_events_raised_per_sec = rrdset_create_localhost(
1015
+ "aspnet",
1016
+ id,
1017
+ NULL,
1018
+ "aspnet",
1019
+ "aspnet.events_raised_per_sec",
1020
+ "Instrumentation events.",
1021
+ "events",
1022
+ PLUGIN_WINDOWS_NAME,
1023
+ "PerflibASP",
1024
+ PRIO_ASPNET_EVENTS_RAISED_PER_SEC,
1025
+ update_every,
1026
+ RRDSET_TYPE_LINE);
1027
+
1028
+ aa->rd_aspnet_events_raised_per_sec =
1029
+ rrddim_add(aa->st_aspnet_events_raised_per_sec, "raised", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1030
+
1031
+ rrdlabels_add(aa->st_aspnet_events_raised_per_sec->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1032
+ }
1033
+
1034
+ rrddim_set_by_pointer(
1035
+ aa->st_aspnet_events_raised_per_sec,
1036
+ aa->rd_aspnet_events_raised_per_sec,
1037
+ (collected_number)aa->aspnetEventsRaisedPerSec.current.Data);
1038
+ rrdset_done(aa->st_aspnet_events_raised_per_sec);
1039
+}
1040
+
1041
+static void netdata_aspnet_error_events_raised(struct aspnet_app *aa, char *app, int update_every)
1042
+{
1043
+ if (unlikely(!aa->st_aspnet_error_events_raised_per_sec)) {
1044
+ char id[RRD_ID_LENGTH_MAX + 1];
1045
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_error_events_raised_per_sec", app);
1046
+
1047
+ aa->st_aspnet_error_events_raised_per_sec = rrdset_create_localhost(
1048
+ "aspnet",
1049
+ id,
1050
+ NULL,
1051
+ "aspnet",
1052
+ "aspnet.error_events_raised_per_sec",
1053
+ "Runtime error events raised.",
1054
+ "errors",
1055
+ PLUGIN_WINDOWS_NAME,
1056
+ "PerflibASP",
1057
+ PRIO_ASPNET_EVENTS_RAISED_PER_SEC,
1058
+ update_every,
1059
+ RRDSET_TYPE_LINE);
1060
+
1061
+ aa->rd_aspnet_error_events_raised_per_sec =
1062
+ rrddim_add(aa->st_aspnet_error_events_raised_per_sec, "events", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1063
+
1064
+ rrdlabels_add(aa->st_aspnet_error_events_raised_per_sec->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1065
+ }
1066
+
1067
+ rrddim_set_by_pointer(
1068
+ aa->st_aspnet_error_events_raised_per_sec,
1069
+ aa->rd_aspnet_error_events_raised_per_sec,
1070
+ (collected_number)aa->aspnetErrorEventsRaisedPerSec.current.Data);
1071
+ rrdset_done(aa->st_aspnet_error_events_raised_per_sec);
1072
+}
1073
+
1074
+static void netdata_aspnet_events_audit_success(struct aspnet_app *aa, char *app, int update_every)
1075
+{
1076
+ if (unlikely(!aa->st_aspnet_audit_success_events_raised)) {
1077
+ char id[RRD_ID_LENGTH_MAX + 1];
1078
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_events_audit_success", app);
1079
+
1080
+ aa->st_aspnet_audit_success_events_raised = rrdset_create_localhost(
1081
+ "aspnet",
1082
+ id,
1083
+ NULL,
1084
+ "aspnet",
1085
+ "aspnet.events_audit_success",
1086
+ "Audit successes in the application.",
1087
+ "errors",
1088
+ PLUGIN_WINDOWS_NAME,
1089
+ "PerflibASP",
1090
+ PRIO_ASPNET_AUDIT_SUCCESS_EVENTS_RAISED,
1091
+ update_every,
1092
+ RRDSET_TYPE_LINE);
1093
+
1094
+ aa->rd_aspnet_audit_success_events_raised =
1095
+ rrddim_add(aa->st_aspnet_audit_success_events_raised, "events", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1096
+
1097
+ rrdlabels_add(aa->st_aspnet_audit_success_events_raised->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1098
+ }
1099
+
1100
+ rrddim_set_by_pointer(
1101
+ aa->st_aspnet_audit_success_events_raised,
1102
+ aa->rd_aspnet_audit_success_events_raised,
1103
+ (collected_number)aa->aspnetAuditSuccessEventsRaised.current.Data);
1104
+ rrdset_done(aa->st_aspnet_audit_success_events_raised);
1105
+}
1106
+
1107
+static void netdata_aspnet_events_audit_failure(struct aspnet_app *aa, char *app, int update_every)
1108
+{
1109
+ if (unlikely(!aa->st_aspnet_audit_failures_events_raised)) {
1110
+ char id[RRD_ID_LENGTH_MAX + 1];
1111
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_events_audit_failure", app);
1112
+
1113
+ aa->st_aspnet_audit_failures_events_raised = rrdset_create_localhost(
1114
+ "aspnet",
1115
+ id,
1116
+ NULL,
1117
+ "aspnet",
1118
+ "aspnet.events_audit_failure",
1119
+ "Audit Failure Events Raised",
1120
+ "failures",
1121
+ PLUGIN_WINDOWS_NAME,
1122
+ "PerflibASP",
1123
+ PRIO_ASPNET_AUDIT_FAILURES_EVENTS_RAISED,
1124
+ update_every,
1125
+ RRDSET_TYPE_LINE);
1126
+
1127
+ aa->rd_aspnet_audit_failures_events_raised =
1128
+ rrddim_add(aa->st_aspnet_audit_failures_events_raised, "audit", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1129
+
1130
+ rrdlabels_add(aa->st_aspnet_audit_failures_events_raised->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1131
+ }
1132
+
1133
+ rrddim_set_by_pointer(
1134
+ aa->st_aspnet_audit_failures_events_raised,
1135
+ aa->rd_aspnet_audit_failures_events_raised,
1136
+ (collected_number)aa->aspnetAuditFailuresEventsRaised.current.Data);
1137
+ rrdset_done(aa->st_aspnet_audit_failures_events_raised);
1138
+}
1139
+
1140
+static inline void netdata_aspnet_apps_events(
1141
+ PERF_DATA_BLOCK *pDataBlock,
1142
+ PERF_OBJECT_TYPE *pObjectType,
1143
+ struct aspnet_app *aa,
1144
+ int update_every)
1145
+{
1146
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetEventsRaisedPerSec))
1147
+ netdata_aspnet_events_raised(aa, windows_shared_buffer, update_every);
1148
+
1149
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetErrorEventsRaisedPerSec))
1150
+ netdata_aspnet_error_events_raised(aa, windows_shared_buffer, update_every);
1151
+
1152
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetAuditSuccessEventsRaised))
1153
+ netdata_aspnet_events_audit_success(aa, windows_shared_buffer, update_every);
1154
+
1155
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetAuditFailuresEventsRaised))
1156
+ netdata_aspnet_events_audit_failure(aa, windows_shared_buffer, update_every);
1157
+}
1158
+
1159
+static void netdata_aspnet_membership_authentication_success(struct aspnet_app *aa, char *app, int update_every)
1160
+{
1161
+ if (unlikely(!aa->st_aspnet_membership_authentication_success)) {
1162
+ char id[RRD_ID_LENGTH_MAX + 1];
1163
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_membership_auth_success", app);
1164
+
1165
+ aa->st_aspnet_membership_authentication_success = rrdset_create_localhost(
1166
+ "aspnet",
1167
+ id,
1168
+ NULL,
1169
+ "aspnet",
1170
+ "aspnet.membership_auth_success",
1171
+ "Membership Authentication Success.",
1172
+ "auth",
1173
+ PLUGIN_WINDOWS_NAME,
1174
+ "PerflibASP",
1175
+ PRIO_ASPNET_MEMBERSHIP_AUTHENTICATION_SUCCESS,
1176
+ update_every,
1177
+ RRDSET_TYPE_LINE);
1178
+
1179
+ aa->rd_aspnet_membership_authentication_success =
1180
+ rrddim_add(aa->st_aspnet_membership_authentication_success, "success", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1181
+
1182
+ rrdlabels_add(aa->st_aspnet_membership_authentication_success->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1183
+ }
1184
+
1185
+ rrddim_set_by_pointer(
1186
+ aa->st_aspnet_membership_authentication_success,
1187
+ aa->rd_aspnet_membership_authentication_success,
1188
+ (collected_number)aa->aspnetMembershipAuthenticationSuccess.current.Data);
1189
+ rrdset_done(aa->st_aspnet_membership_authentication_success);
1190
+}
1191
+
1192
+static void netdata_aspnet_membership_authentication_failure(struct aspnet_app *aa, char *app, int update_every)
1193
+{
1194
+ if (unlikely(!aa->st_aspnet_membership_authentication_failure)) {
1195
+ char id[RRD_ID_LENGTH_MAX + 1];
1196
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_membership_auth_failure", app);
1197
+
1198
+ aa->st_aspnet_membership_authentication_failure = rrdset_create_localhost(
1199
+ "aspnet",
1200
+ id,
1201
+ NULL,
1202
+ "aspnet",
1203
+ "aspnet.membership_auth_failure",
1204
+ "Membership Authentication Failure.",
1205
+ "auth",
1206
+ PLUGIN_WINDOWS_NAME,
1207
+ "PerflibASP",
1208
+ PRIO_ASPNET_MEMBERSHIP_AUTHENTICATION_FAILURE,
1209
+ update_every,
1210
+ RRDSET_TYPE_LINE);
1211
+
1212
+ aa->rd_aspnet_membership_authentication_failure =
1213
+ rrddim_add(aa->st_aspnet_membership_authentication_failure, "failure", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1214
+
1215
+ rrdlabels_add(aa->st_aspnet_membership_authentication_failure->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1216
+ }
1217
+
1218
+ rrddim_set_by_pointer(
1219
+ aa->st_aspnet_membership_authentication_failure,
1220
+ aa->rd_aspnet_membership_authentication_failure,
1221
+ (collected_number)aa->aspnetMembershipAuthenticationFailure.current.Data);
1222
+ rrdset_done(aa->st_aspnet_membership_authentication_failure);
1223
+}
1224
+
1225
+static void netdata_aspnet_form_authentication_success(struct aspnet_app *aa, char *app, int update_every)
1226
+{
1227
+ if (unlikely(!aa->st_aspnet_form_authentication_success)) {
1228
+ char id[RRD_ID_LENGTH_MAX + 1];
1229
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_form_authentication_success", app);
1230
+
1231
+ aa->st_aspnet_form_authentication_success = rrdset_create_localhost(
1232
+ "aspnet",
1233
+ id,
1234
+ NULL,
1235
+ "aspnet",
1236
+ "aspnet.form_authentication_success",
1237
+ "Forms Authentication Success.",
1238
+ "auth",
1239
+ PLUGIN_WINDOWS_NAME,
1240
+ "PerflibASP",
1241
+ PRIO_ASPNET_MEMBERSHIP_AUTHENTICATION_FAILURE,
1242
+ update_every,
1243
+ RRDSET_TYPE_LINE);
1244
+
1245
+ aa->rd_aspnet_form_authentication_success =
1246
+ rrddim_add(aa->st_aspnet_form_authentication_success, "success", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1247
+
1248
+ rrdlabels_add(aa->st_aspnet_form_authentication_success->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1249
+ }
1250
+
1251
+ rrddim_set_by_pointer(
1252
+ aa->st_aspnet_form_authentication_success,
1253
+ aa->rd_aspnet_form_authentication_success,
1254
+ (collected_number)aa->aspnetFormAuthenticationSuccess.current.Data);
1255
+ rrdset_done(aa->st_aspnet_form_authentication_success);
1256
+}
1257
+
1258
+static void netdata_aspnet_form_authentication_failure(struct aspnet_app *aa, char *app, int update_every)
1259
+{
1260
+ if (unlikely(!aa->st_aspnet_form_authentication_failure)) {
1261
+ char id[RRD_ID_LENGTH_MAX + 1];
1262
+ snprintfz(id, RRD_ID_LENGTH_MAX, "aspnet_app_%s_form_authentication_failure", app);
1263
+
1264
+ aa->st_aspnet_form_authentication_failure = rrdset_create_localhost(
1265
+ "aspnet",
1266
+ id,
1267
+ NULL,
1268
+ "aspnet",
1269
+ "aspnet.form_authentication_failure",
1270
+ "Forms Authentication Failure.",
1271
+ "auth",
1272
+ PLUGIN_WINDOWS_NAME,
1273
+ "PerflibASP",
1274
+ PRIO_ASPNET_MEMBERSHIP_AUTHENTICATION_FAILURE,
1275
+ update_every,
1276
+ RRDSET_TYPE_LINE);
1277
+
1278
+ aa->rd_aspnet_form_authentication_failure =
1279
+ rrddim_add(aa->st_aspnet_form_authentication_failure, "failure", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1280
+
1281
+ rrdlabels_add(aa->st_aspnet_form_authentication_failure->rrdlabels, "aspnet_app", app, RRDLABEL_SRC_AUTO);
1282
+ }
1283
+
1284
+ rrddim_set_by_pointer(
1285
+ aa->st_aspnet_form_authentication_failure,
1286
+ aa->rd_aspnet_form_authentication_failure,
1287
+ (collected_number)aa->aspnetFormAuthenticationFailure.current.Data);
1288
+ rrdset_done(aa->st_aspnet_form_authentication_failure);
1289
+}
1290
+
1291
+static inline void netdata_aspnet_apps_auth(
1292
+ PERF_DATA_BLOCK *pDataBlock,
1293
+ PERF_OBJECT_TYPE *pObjectType,
1294
+ struct aspnet_app *aa,
1295
+ int update_every)
1296
+{
1297
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetMembershipAuthenticationSuccess))
1298
+ netdata_aspnet_membership_authentication_success(aa, windows_shared_buffer, update_every);
1299
+
1300
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetMembershipAuthenticationFailure))
1301
+ netdata_aspnet_membership_authentication_failure(aa, windows_shared_buffer, update_every);
1302
+
1303
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetFormAuthenticationSuccess))
1304
+ netdata_aspnet_form_authentication_success(aa, windows_shared_buffer, update_every);
1305
+
1306
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetFormAuthenticationFailure))
1307
+ netdata_aspnet_form_authentication_failure(aa, windows_shared_buffer, update_every);
1308
+}
1309
+
1310
+static void netdata_aspnet_apps_objects(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
1311
+{
1312
+ PERF_INSTANCE_DEFINITION *pi = NULL;
1313
+ for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1314
+ pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1315
+ if (!pi)
1316
+ break;
1317
+
1318
+ if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1319
+ strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1320
+
1321
+ if (strcasecmp(windows_shared_buffer, "__Total__") == 0)
1322
+ continue;
1323
+
1324
+ struct aspnet_app *aa = dictionary_set(aspnet_apps, windows_shared_buffer, NULL, sizeof(*aa));
1325
+ if (!aa)
1326
+ continue;
1327
+
1328
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetAnonymousRequestPerSec))
1329
+ netdata_aspnet_anonymous_request(aa, windows_shared_buffer, update_every);
1330
+
1331
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &aa->aspnetCompilationsTotal))
1332
+ netdata_aspnet_compilations_total(aa, windows_shared_buffer, update_every);
1333
+
1334
+ netdata_aspnet_apps_runtime_errors(pDataBlock, pObjectType, aa, update_every);
1335
+
1336
+ netdata_aspnet_apps_requests(pDataBlock, pObjectType, aa, update_every);
1337
+
1338
+ netdata_aspnet_apps_sessions(pDataBlock, pObjectType, aa, update_every);
1339
+
1340
+ netdata_aspnet_apps_transactions(pDataBlock, pObjectType, aa, update_every);
1341
+
1342
+ netdata_aspnet_apps_events(pDataBlock, pObjectType, aa, update_every);
1343
+
1344
+ netdata_aspnet_apps_auth(pDataBlock, pObjectType, aa, update_every);
1345
+ }
1346
+}
1347
+
1348
+struct netdata_exchange_objects {
1349
+ void (*fnct)(PERF_DATA_BLOCK *, PERF_OBJECT_TYPE *, int);
1350
+ char *object;
1351
+} asp_obj[] = {
1352
+ {.fnct = netdata_aspnet_global_objects, .object = "ASP.NET"},
1353
+ {.fnct = netdata_aspnet_apps_objects, .object = "ASP.NET Applications"},
1354
+
1355
+ // This is the end of the loop
1356
+ {.fnct = NULL, .object = NULL}
1357
+};
1358
+
1359
+int do_PerflibASP(int update_every, usec_t dt __maybe_unused)
1360
+{
1361
+ static bool initialized = false;
1362
+
1363
+ if (unlikely(!initialized)) {
1364
+ initialize();
1365
+ initialized = true;
1366
+ }
1367
+
1368
+ for (LONG i = 0; asp_obj[i].fnct; i++) {
1369
+ DWORD id = RegistryFindIDByName(asp_obj[i].object);
1370
+ if (id == PERFLIB_REGISTRY_NAME_NOT_FOUND)
1371
+ continue;
1372
+
1373
+ PERF_DATA_BLOCK *pDataBlock = perflibGetPerformanceData(id);
1374
+ if (!pDataBlock)
1375
+ continue;
1376
+
1377
+ PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, asp_obj[i].object);
1378
+ if (!pObjectType)
1379
+ continue;
1380
+
1381
+ asp_obj[i].fnct(pDataBlock, pObjectType, update_every);
1382
+ }
1383
+
1384
+ return 0;
1385
+}
src/collectors/windows.plugin/windows_plugin.c
+8
-1
@@ -113,7 +113,7 @@ static struct proc_module {
113
.func = do_PerflibServices},
114
115
{.name = "PerflibExchange",
116
- .dim = "PerflibADFS",
116
+ .dim = "PerflibExchange",
117
.enabled = CONFIG_BOOLEAN_YES,
118
.update_every = UPDATE_EVERY_MIN,
119
.func = do_PerflibExchange},
@@ -125,6 +125,13 @@ static struct proc_module {
125
.func = do_PerflibNUMA},
126
127
// the terminator of this array
128
+ {.name = "PerflibASP",
129
+ .dim = "PerflibASP",
130
+ .enabled = CONFIG_BOOLEAN_YES,
131
+ .update_every = UPDATE_EVERY_MIN,
132
+ .func = do_PerflibASP},
133
+
134
+ // the terminator of this array
135
{.name = NULL, .dim = NULL, .func = NULL}};
136
137
#if WORKER_UTILIZATION_MAX_JOB_TYPES < 36
src/collectors/windows.plugin/windows_plugin.h
+34
-1
@@ -43,6 +43,7 @@ int do_PerflibHyperV(int update_every, usec_t dt);
43
int do_PerflibServices(int update_every, usec_t dt);
44
int do_PerflibExchange(int update_every, usec_t dt __maybe_unused);
45
int do_PerflibNUMA(int update_every, usec_t dt __maybe_unused);
46
+int do_PerflibASP(int update_every, usec_t dt __maybe_unused);
47
48
enum PERFLIB_PRIO {
49
PRIO_WEBSITE_IIS_REQUESTS_RATE = 21000, // PRIO selected, because APPS is using 20YYY
@@ -263,7 +264,39 @@ enum PERFLIB_PRIO {
264
PRIO_EXCHANGE_PROXY_OUTSTANDING_PROXY_REQUESTS,
265
PRIO_EXCHANGE_PROXY_PROXY_REQUESTS_TOTAL,
266
PRIO_EXCHANGE_AUTO_DISCOVER_REQUESTS,
266
- PRIO_EXCHANGE_AUTO_AVAILABILITY_SERVICES
267
+ PRIO_EXCHANGE_AUTO_AVAILABILITY_SERVICES,
268
+
269
+ PRIO_ASPNET_APPLICATION_RESTART,
270
+ PRIO_ASPNET_WORKER_PROCESS_RESTART,
271
+ PRIO_ASPNET_APP_ANONYMOUS_REQUEST,
272
+ PRIO_ASPNET_APP_COMPILATION_TOTALS,
273
+ PRIO_ASPNET_ERRORS_DURING_PREPROCESSING,
274
+ PRIO_ASPNET_ERRORS_DURING_COMPILATION,
275
+ PRIO_ASPNET_ERRORS_DURING_EXECUTION,
276
+ PRIO_ASPNET_ERRORS_UNHANDLED_EXECUTION_PER_SEC,
277
+ PRIO_ASPNET_REQUESTS_BYTES_TOTAL,
278
+ PRIO_ASPNET_REQUESTS_EXECUTING,
279
+ PRIO_ASPNET_REQUESTS_FAILED,
280
+ PRIO_ASPNET_REQUESTS_NOT_FOUND,
281
+ PRIO_ASPNET_REQUESTS_IN_APPLICATION_QUEUE,
282
+ PRIO_ASPNET_REQUESTS_NOT_AUTHORIZED,
283
+ PRIO_ASPNET_REQUESTS_TIMEOUT,
284
+ PRIO_ASPNET_REQUESTS_SUCCEEDED,
285
+ PRIO_ASPNET_SESSIONS_ACTIVE,
286
+ PRIO_ASPNET_SESSIONS_ABANDONED,
287
+ PRIO_ASPNET_SESSIONS_TIMEDOUT,
288
+ PRIO_ASPNET_TRANSACTIONS_ABORTED,
289
+ PRIO_ASPNET_TRANSACTIONS_COMMITED,
290
+ PRIO_ASPNET_TRANSACTIONS_PENDING,
291
+ PRIO_ASPNET_TRANSACTIONS_PER_SEC,
292
+ PRIO_ASPNET_EVENTS_RAISED_PER_SEC,
293
+ PRIO_ASPNET_ERROR_EVENTS_RAISED_PER_SEC,
294
+ PRIO_ASPNET_AUDIT_SUCCESS_EVENTS_RAISED,
295
+ PRIO_ASPNET_AUDIT_FAILURES_EVENTS_RAISED,
296
+ PRIO_ASPNET_MEMBERSHIP_AUTHENTICATION_SUCCESS,
297
+ PRIO_ASPNET_MEMBERSHIP_AUTHENTICATION_FAILURE,
298
+ PRIO_ASPNET_FORM_AUTHENTICATION_SUCCESS,
299
+ PRIO_ASPNET_FORM_AUTHENTICATION_FAILURE
300
};
301
302
#endif //NETDATA_WINDOWS_PLUGIN_H