@@ -11,6 +11,8 @@ import (
11
11
"reflect"
12
12
"strings"
13
13
"time"
14
+
15
+ "golang.org/x/exp/slices"
14
16
)
15
17
16
18
const (
@@ -1149,6 +1151,11 @@ func determineStreamUpdates(updatedServers []StreamUpstreamServer, nginxServers
1149
1151
1150
1152
// GetStats gets process, slab, connection, request, ssl, zone, stream zone, upstream and stream upstream related stats from the NGINX Plus API.
1151
1153
func (client * NginxClient ) GetStats () (* Stats , error ) {
1154
+ endpoints , err := client .GetAvailableEndpoints ()
1155
+ if err != nil {
1156
+ return nil , fmt .Errorf ("failed to get stats: %w" , err )
1157
+ }
1158
+
1152
1159
info , err := client .GetNginxInfo ()
1153
1160
if err != nil {
1154
1161
return nil , fmt .Errorf ("failed to get stats: %w" , err )
@@ -1194,21 +1201,6 @@ func (client *NginxClient) GetStats() (*Stats, error) {
1194
1201
return nil , fmt .Errorf ("failed to get stats: %w" , err )
1195
1202
}
1196
1203
1197
- streamZones , err := client .GetStreamServerZones ()
1198
- if err != nil {
1199
- return nil , fmt .Errorf ("failed to get stats: %w" , err )
1200
- }
1201
-
1202
- streamUpstreams , err := client .GetStreamUpstreams ()
1203
- if err != nil {
1204
- return nil , fmt .Errorf ("failed to get stats: %w" , err )
1205
- }
1206
-
1207
- streamZoneSync , err := client .GetStreamZoneSync ()
1208
- if err != nil {
1209
- return nil , fmt .Errorf ("failed to get stats: %w" , err )
1210
- }
1211
-
1212
1204
locationZones , err := client .GetLocationZones ()
1213
1205
if err != nil {
1214
1206
return nil , fmt .Errorf ("failed to get stats: %w" , err )
@@ -1229,14 +1221,49 @@ func (client *NginxClient) GetStats() (*Stats, error) {
1229
1221
return nil , fmt .Errorf ("failed to get stats: %w" , err )
1230
1222
}
1231
1223
1232
- limitConnsStream , err := client .GetStreamConnectionsLimit ()
1224
+ workers , err := client .GetWorkers ()
1233
1225
if err != nil {
1234
1226
return nil , fmt .Errorf ("failed to get stats: %w" , err )
1235
1227
}
1236
1228
1237
- workers , err := client .GetWorkers ()
1238
- if err != nil {
1239
- return nil , fmt .Errorf ("failed to get stats: %w" , err )
1229
+ streamZones := & StreamServerZones {}
1230
+ streamUpstreams := & StreamUpstreams {}
1231
+ limitConnsStream := & StreamLimitConnections {}
1232
+ streamZoneSync := & StreamZoneSync {}
1233
+
1234
+ if slices .Contains (endpoints , "stream" ) {
1235
+ streamEndpoints , err := client .GetAvailableStreamEndpoints ()
1236
+ if err != nil {
1237
+ return nil , fmt .Errorf ("failed to get stats: %w" , err )
1238
+ }
1239
+
1240
+ if slices .Contains (streamEndpoints , "server_zones" ) {
1241
+ streamZones , err = client .GetStreamServerZones ()
1242
+ if err != nil {
1243
+ return nil , fmt .Errorf ("failed to get stats: %w" , err )
1244
+ }
1245
+ }
1246
+
1247
+ if slices .Contains (streamEndpoints , "upstreams" ) {
1248
+ streamUpstreams , err = client .GetStreamUpstreams ()
1249
+ if err != nil {
1250
+ return nil , fmt .Errorf ("failed to get stats: %w" , err )
1251
+ }
1252
+ }
1253
+
1254
+ if slices .Contains (streamEndpoints , "limit_conns" ) {
1255
+ limitConnsStream , err = client .GetStreamConnectionsLimit ()
1256
+ if err != nil {
1257
+ return nil , fmt .Errorf ("failed to get stats: %w" , err )
1258
+ }
1259
+ }
1260
+
1261
+ if slices .Contains (streamEndpoints , "zone_sync" ) {
1262
+ streamZoneSync , err = client .GetStreamZoneSync ()
1263
+ if err != nil {
1264
+ return nil , fmt .Errorf ("failed to get stats: %w" , err )
1265
+ }
1266
+ }
1240
1267
}
1241
1268
1242
1269
return & Stats {
@@ -1261,6 +1288,26 @@ func (client *NginxClient) GetStats() (*Stats, error) {
1261
1288
}, nil
1262
1289
}
1263
1290
1291
+ // GetAvailableEndpoints returns available endpoints in the API.
1292
+ func (client * NginxClient ) GetAvailableEndpoints () ([]string , error ) {
1293
+ var endpoints []string
1294
+ err := client .get ("" , & endpoints )
1295
+ if err != nil {
1296
+ return nil , fmt .Errorf ("failed to get endpoints: %w" , err )
1297
+ }
1298
+ return endpoints , nil
1299
+ }
1300
+
1301
+ // GetAvailableStreamEndpoints returns available stream endpoints in the API.
1302
+ func (client * NginxClient ) GetAvailableStreamEndpoints () ([]string , error ) {
1303
+ var endpoints []string
1304
+ err := client .get ("stream" , & endpoints )
1305
+ if err != nil {
1306
+ return nil , fmt .Errorf ("failed to get endpoints: %w" , err )
1307
+ }
1308
+ return endpoints , nil
1309
+ }
1310
+
1264
1311
// GetNginxInfo returns Nginx stats.
1265
1312
func (client * NginxClient ) GetNginxInfo () (* NginxInfo , error ) {
1266
1313
var info NginxInfo
0 commit comments