fix(support): add missing host collectors for ParseSupportBundle (#1656)

* fix(support): add missing host collectors for ParseSupportBundle

* update

* add host ananlyers
This commit is contained in:
Dexter Yan
2024-10-22 13:07:44 +13:00
committed by GitHub
parent b88bc8ddf7
commit 0d21eed5f8
6 changed files with 1396 additions and 1 deletions

View File

@@ -16857,6 +16857,540 @@ spec:
type: object
type: object
type: array
hostCollectors:
items:
properties:
blockDevices:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
certificate:
properties:
certificatePath:
type: string
collectorName:
type: string
exclude:
type: BoolString
keyPath:
type: string
required:
- certificatePath
- keyPath
type: object
certificatesCollection:
properties:
collectorName:
type: string
exclude:
type: BoolString
paths:
items:
type: string
type: array
required:
- paths
type: object
cgroups:
properties:
collectorName:
type: string
exclude:
type: BoolString
mountPoint:
type: string
type: object
copy:
properties:
collectorName:
type: string
exclude:
type: BoolString
path:
type: string
required:
- path
type: object
cpu:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
diskUsage:
properties:
collectorName:
type: string
exclude:
type: BoolString
path:
type: string
required:
- path
type: object
dns:
properties:
collectorName:
type: string
exclude:
type: BoolString
hostnames:
items:
type: string
type: array
required:
- hostnames
type: object
filesystemPerformance:
description: |-
FilesystemPerformance benchmarks sequential write latency on a single file.
The optional background IOPS feature attempts to mimic real-world conditions by running read and
write workloads prior to and during benchmark execution.
properties:
backgroundIOPSWarmupSeconds:
description: How long to run the background IOPS read and
write workloads prior to starting the benchmarks.
type: integer
backgroundReadIOPS:
description: |-
The target read IOPS to run while benchmarking. This is a limit and there is no guarantee
it will be reached. This is the total IOPS for all background read jobs.
type: integer
backgroundReadIOPSJobs:
description: |-
Number of threads to use for background read IOPS. This should be set high enough to reach
the target specified in BackgrounReadIOPS.
type: integer
backgroundWriteIOPS:
description: |-
The target write IOPS to run while benchmarking. This is a limit and there is no guarantee
it will be reached. This is the total IOPS for all background write jobs.
type: integer
backgroundWriteIOPSJobs:
description: |-
Number of threads to use for background write IOPS. This should be set high enough to reach
the target specified in BackgroundWriteIOPS.
Example: If BackgroundWriteIOPS is 100 and write latency is 10ms then a single job would
barely be able to reach 100 IOPS so this should be at least 2.
type: integer
collectorName:
type: string
datasync:
description: |-
Whether to call datasync on the file after each write. Skipped if Sync is also true. Does not
apply to background IOPS task.
type: boolean
directory:
description: The directory where the benchmark will create
files.
type: string
enableBackgroundIOPS:
description: Enable the background IOPS feature.
type: boolean
exclude:
type: BoolString
fileSize:
description: |-
The size of the file used in the benchmark. The number of IO operations for the benchmark
will be FileSize / OperationSizeBytes. Accepts valid Kubernetes resource units such as Mi.
type: string
operationSize:
description: |-
The size of each write operation performed while benchmarking. This does not apply to the
background IOPS feature if enabled, since those must be fixed at 4096.
format: int64
type: integer
runTime:
description: |-
Limit runtime. The test will run until it completes the configured I/O workload or until it
has run for this specified amount of time, whichever occurs first. When the unit is omitted,
the value is interpreted in seconds. Defaults to 120 seconds. Set to "0" to disable.
type: string
sync:
description: Whether to call sync on the file after each
write. Does not apply to background IOPS task.
type: boolean
timeout:
description: Total timeout, including background IOPS setup
and warmup if enabled.
type: string
required:
- backgroundIOPSWarmupSeconds
- backgroundReadIOPS
- backgroundReadIOPSJobs
- backgroundWriteIOPS
- backgroundWriteIOPSJobs
- enableBackgroundIOPS
type: object
hostOS:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
hostServices:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
http:
properties:
collectorName:
type: string
exclude:
type: BoolString
get:
properties:
headers:
additionalProperties:
type: string
type: object
insecureSkipVerify:
type: boolean
timeout:
description: |-
Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.
Missing value or empty string or means no timeout.
type: string
url:
type: string
required:
- url
type: object
post:
properties:
body:
type: string
headers:
additionalProperties:
type: string
type: object
insecureSkipVerify:
type: boolean
timeout:
description: |-
Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.
Missing value or empty string or means no timeout.
type: string
url:
type: string
required:
- url
type: object
put:
properties:
body:
type: string
headers:
additionalProperties:
type: string
type: object
insecureSkipVerify:
type: boolean
timeout:
description: |-
Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.
Missing value or empty string or means no timeout.
type: string
url:
type: string
required:
- url
type: object
type: object
httpLoadBalancer:
properties:
address:
type: string
collectorName:
type: string
exclude:
type: BoolString
path:
type: string
port:
type: integer
timeout:
type: string
required:
- address
- path
- port
type: object
ipv4Interfaces:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
journald:
properties:
collectorName:
type: string
dmesg:
type: boolean
exclude:
type: BoolString
lines:
type: integer
output:
type: string
reverse:
type: boolean
since:
type: string
system:
type: boolean
timeout:
type: string
units:
items:
type: string
type: array
until:
type: string
utc:
type: boolean
type: object
kernelConfigs:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
kernelModules:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
kubernetes:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
memory:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
run:
properties:
args:
items:
type: string
type: array
collectorName:
type: string
command:
type: string
env:
items:
type: string
type: array
exclude:
type: BoolString
ignoreParentEnvs:
type: boolean
inheritEnvs:
items:
type: string
type: array
input:
additionalProperties:
type: string
type: object
outputDir:
type: string
timeout:
type: string
required:
- args
- command
type: object
subnetAvailable:
properties:
CIDRRangeAlloc:
type: string
collectorName:
type: string
desiredCIDR:
type: integer
exclude:
type: BoolString
required:
- CIDRRangeAlloc
- desiredCIDR
type: object
systemPackages:
properties:
amzn:
items:
type: string
type: array
amzn2:
items:
type: string
type: array
centos:
items:
type: string
type: array
centos7:
items:
type: string
type: array
centos8:
items:
type: string
type: array
centos9:
items:
type: string
type: array
collectorName:
type: string
exclude:
type: BoolString
ol:
items:
type: string
type: array
ol7:
items:
type: string
type: array
ol8:
items:
type: string
type: array
ol9:
items:
type: string
type: array
rhel:
items:
type: string
type: array
rhel7:
items:
type: string
type: array
rhel8:
items:
type: string
type: array
rhel9:
items:
type: string
type: array
rocky:
items:
type: string
type: array
rocky8:
items:
type: string
type: array
rocky9:
items:
type: string
type: array
ubuntu:
items:
type: string
type: array
ubuntu16:
items:
type: string
type: array
ubuntu18:
items:
type: string
type: array
ubuntu20:
items:
type: string
type: array
type: object
tcpConnect:
properties:
address:
type: string
collectorName:
type: string
exclude:
type: BoolString
timeout:
type: string
required:
- address
type: object
tcpLoadBalancer:
properties:
address:
type: string
collectorName:
type: string
exclude:
type: BoolString
port:
type: integer
timeout:
type: string
required:
- address
- port
type: object
tcpPortStatus:
properties:
collectorName:
type: string
exclude:
type: BoolString
interface:
type: string
port:
type: integer
required:
- port
type: object
time:
properties:
collectorName:
type: string
exclude:
type: BoolString
type: object
udpPortStatus:
properties:
collectorName:
type: string
exclude:
type: BoolString
interface:
type: string
port:
type: integer
required:
- port
type: object
type: object
type: array
uri:
type: string
type: object

View File

@@ -34,6 +34,7 @@ type AfterCollection struct {
// CollectorSpec defines the desired state of Collector
type CollectorSpec struct {
Collectors []*Collect `json:"collectors,omitempty" yaml:"collectors,omitempty"`
HostCollectors []*HostCollect `json:"hostCollectors,omitempty" yaml:"hostCollectors,omitempty"`
AfterCollection []*AfterCollection `json:"afterCollection,omitempty" yaml:"afterCollection,omitempty"`
Uri string `json:"uri,omitempty" yaml:"uri,omitempty"`
}

View File

@@ -1094,6 +1094,17 @@ func (in *CollectorSpec) DeepCopyInto(out *CollectorSpec) {
}
}
}
if in.HostCollectors != nil {
in, out := &in.HostCollectors, &out.HostCollectors
*out = make([]*HostCollect, len(*in))
for i := range *in {
if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i]
*out = new(HostCollect)
(*in).DeepCopyInto(*out)
}
}
}
if in.AfterCollection != nil {
in, out := &in.AfterCollection, &out.AfterCollection
*out = make([]*AfterCollection, len(*in))

View File

@@ -38,7 +38,6 @@ func GetSupportBundleFromURI(bundleURI string) (*troubleshootv1beta2.SupportBund
}
// ParseSupportBundle parses a support bundle from a byte array into a SupportBundle object
// We will deprecate this in favour of use loader.LoadSpecs once the new API is stable
func ParseSupportBundle(doc []byte, followURI bool) (*troubleshootv1beta2.SupportBundle, error) {
doc, err := docrewrite.ConvertToV1Beta2(doc)
if err != nil {
@@ -65,7 +64,9 @@ func ParseSupportBundle(doc []byte, followURI bool) (*troubleshootv1beta2.Suppor
ObjectMeta: collector.ObjectMeta,
Spec: troubleshootv1beta2.SupportBundleSpec{
Collectors: collector.Spec.Collectors,
HostCollectors: collector.Spec.HostCollectors,
Analyzers: []*troubleshootv1beta2.Analyze{},
HostAnalyzers: []*troubleshootv1beta2.HostAnalyze{},
AfterCollection: collector.Spec.AfterCollection,
},
}

View File

@@ -0,0 +1,94 @@
package supportbundle
import (
"reflect"
"testing"
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func Test_ParseSupportBundle(t *testing.T) {
tests := []struct {
name string
doc []byte
followURI bool
want *troubleshootv1beta2.SupportBundle
wantErr bool
}{
{
name: "Parse Host Collectors",
doc: []byte(`
apiVersion: troubleshoot.sh/v1beta2
kind: SupportBundle
metadata:
name: test
spec:
hostCollectors:
- hostOS: {}
`),
followURI: false,
want: &troubleshootv1beta2.SupportBundle{
TypeMeta: metav1.TypeMeta{
APIVersion: "troubleshoot.sh/v1beta2",
Kind: "SupportBundle",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test",
},
Spec: troubleshootv1beta2.SupportBundleSpec{
HostCollectors: []*troubleshootv1beta2.HostCollect{
{
HostOS: &troubleshootv1beta2.HostOS{},
},
},
},
},
wantErr: false,
},
{
name: "Parse Collectors",
doc: []byte(`
apiVersion: troubleshoot.sh/v1beta2
kind: SupportBundle
metadata:
name: test
spec:
collectors:
- clusterInfo: {}
`),
followURI: false,
want: &troubleshootv1beta2.SupportBundle{
TypeMeta: metav1.TypeMeta{
APIVersion: "troubleshoot.sh/v1beta2",
Kind: "SupportBundle",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test",
},
Spec: troubleshootv1beta2.SupportBundleSpec{
Collectors: []*troubleshootv1beta2.Collect{
{
ClusterInfo: &troubleshootv1beta2.ClusterInfo{},
},
},
},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ParseSupportBundle(tt.doc, tt.followURI)
if (err != nil) != tt.wantErr {
t.Errorf("ParseSupportBundle() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("ParseSupportBundle() = %v, want %v", got, tt.want)
}
})
}
}

View File

@@ -14367,6 +14367,760 @@
}
}
},
"hostCollectors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"blockDevices": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"certificate": {
"type": "object",
"required": [
"certificatePath",
"keyPath"
],
"properties": {
"certificatePath": {
"type": "string"
},
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"keyPath": {
"type": "string"
}
}
},
"certificatesCollection": {
"type": "object",
"required": [
"paths"
],
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"paths": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"cgroups": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"mountPoint": {
"type": "string"
}
}
},
"copy": {
"type": "object",
"required": [
"path"
],
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"path": {
"type": "string"
}
}
},
"cpu": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"diskUsage": {
"type": "object",
"required": [
"path"
],
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"path": {
"type": "string"
}
}
},
"dns": {
"type": "object",
"required": [
"hostnames"
],
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"hostnames": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"filesystemPerformance": {
"description": "FilesystemPerformance benchmarks sequential write latency on a single file.\nThe optional background IOPS feature attempts to mimic real-world conditions by running read and\nwrite workloads prior to and during benchmark execution.",
"type": "object",
"required": [
"backgroundIOPSWarmupSeconds",
"backgroundReadIOPS",
"backgroundReadIOPSJobs",
"backgroundWriteIOPS",
"backgroundWriteIOPSJobs",
"enableBackgroundIOPS"
],
"properties": {
"backgroundIOPSWarmupSeconds": {
"description": "How long to run the background IOPS read and write workloads prior to starting the benchmarks.",
"type": "integer"
},
"backgroundReadIOPS": {
"description": "The target read IOPS to run while benchmarking. This is a limit and there is no guarantee\nit will be reached. This is the total IOPS for all background read jobs.",
"type": "integer"
},
"backgroundReadIOPSJobs": {
"description": "Number of threads to use for background read IOPS. This should be set high enough to reach\nthe target specified in BackgrounReadIOPS.",
"type": "integer"
},
"backgroundWriteIOPS": {
"description": "The target write IOPS to run while benchmarking. This is a limit and there is no guarantee\nit will be reached. This is the total IOPS for all background write jobs.",
"type": "integer"
},
"backgroundWriteIOPSJobs": {
"description": "Number of threads to use for background write IOPS. This should be set high enough to reach\nthe target specified in BackgroundWriteIOPS.\nExample: If BackgroundWriteIOPS is 100 and write latency is 10ms then a single job would\nbarely be able to reach 100 IOPS so this should be at least 2.",
"type": "integer"
},
"collectorName": {
"type": "string"
},
"datasync": {
"description": "Whether to call datasync on the file after each write. Skipped if Sync is also true. Does not\napply to background IOPS task.",
"type": "boolean"
},
"directory": {
"description": "The directory where the benchmark will create files.",
"type": "string"
},
"enableBackgroundIOPS": {
"description": "Enable the background IOPS feature.",
"type": "boolean"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"fileSize": {
"description": "The size of the file used in the benchmark. The number of IO operations for the benchmark\nwill be FileSize / OperationSizeBytes. Accepts valid Kubernetes resource units such as Mi.",
"type": "string"
},
"operationSize": {
"description": "The size of each write operation performed while benchmarking. This does not apply to the\nbackground IOPS feature if enabled, since those must be fixed at 4096.",
"type": "integer",
"format": "int64"
},
"runTime": {
"description": "Limit runtime. The test will run until it completes the configured I/O workload or until it\nhas run for this specified amount of time, whichever occurs first. When the unit is omitted,\nthe value is interpreted in seconds. Defaults to 120 seconds. Set to \"0\" to disable.",
"type": "string"
},
"sync": {
"description": "Whether to call sync on the file after each write. Does not apply to background IOPS task.",
"type": "boolean"
},
"timeout": {
"description": "Total timeout, including background IOPS setup and warmup if enabled.",
"type": "string"
}
}
},
"hostOS": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"hostServices": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"http": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"get": {
"type": "object",
"required": [
"url"
],
"properties": {
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"insecureSkipVerify": {
"type": "boolean"
},
"timeout": {
"description": "Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.\nMissing value or empty string or means no timeout.",
"type": "string"
},
"url": {
"type": "string"
}
}
},
"post": {
"type": "object",
"required": [
"url"
],
"properties": {
"body": {
"type": "string"
},
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"insecureSkipVerify": {
"type": "boolean"
},
"timeout": {
"description": "Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.\nMissing value or empty string or means no timeout.",
"type": "string"
},
"url": {
"type": "string"
}
}
},
"put": {
"type": "object",
"required": [
"url"
],
"properties": {
"body": {
"type": "string"
},
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"insecureSkipVerify": {
"type": "boolean"
},
"timeout": {
"description": "Timeout is the time to wait for a server's response. Its a duration e.g 15s, 2h30m.\nMissing value or empty string or means no timeout.",
"type": "string"
},
"url": {
"type": "string"
}
}
}
}
},
"httpLoadBalancer": {
"type": "object",
"required": [
"address",
"path",
"port"
],
"properties": {
"address": {
"type": "string"
},
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"path": {
"type": "string"
},
"port": {
"type": "integer"
},
"timeout": {
"type": "string"
}
}
},
"ipv4Interfaces": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"journald": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"dmesg": {
"type": "boolean"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"lines": {
"type": "integer"
},
"output": {
"type": "string"
},
"reverse": {
"type": "boolean"
},
"since": {
"type": "string"
},
"system": {
"type": "boolean"
},
"timeout": {
"type": "string"
},
"units": {
"type": "array",
"items": {
"type": "string"
}
},
"until": {
"type": "string"
},
"utc": {
"type": "boolean"
}
}
},
"kernelConfigs": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"kernelModules": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"kubernetes": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"memory": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"run": {
"type": "object",
"required": [
"args",
"command"
],
"properties": {
"args": {
"type": "array",
"items": {
"type": "string"
}
},
"collectorName": {
"type": "string"
},
"command": {
"type": "string"
},
"env": {
"type": "array",
"items": {
"type": "string"
}
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"ignoreParentEnvs": {
"type": "boolean"
},
"inheritEnvs": {
"type": "array",
"items": {
"type": "string"
}
},
"input": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"outputDir": {
"type": "string"
},
"timeout": {
"type": "string"
}
}
},
"subnetAvailable": {
"type": "object",
"required": [
"CIDRRangeAlloc",
"desiredCIDR"
],
"properties": {
"CIDRRangeAlloc": {
"type": "string"
},
"collectorName": {
"type": "string"
},
"desiredCIDR": {
"type": "integer"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"systemPackages": {
"type": "object",
"properties": {
"amzn": {
"type": "array",
"items": {
"type": "string"
}
},
"amzn2": {
"type": "array",
"items": {
"type": "string"
}
},
"centos": {
"type": "array",
"items": {
"type": "string"
}
},
"centos7": {
"type": "array",
"items": {
"type": "string"
}
},
"centos8": {
"type": "array",
"items": {
"type": "string"
}
},
"centos9": {
"type": "array",
"items": {
"type": "string"
}
},
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"ol": {
"type": "array",
"items": {
"type": "string"
}
},
"ol7": {
"type": "array",
"items": {
"type": "string"
}
},
"ol8": {
"type": "array",
"items": {
"type": "string"
}
},
"ol9": {
"type": "array",
"items": {
"type": "string"
}
},
"rhel": {
"type": "array",
"items": {
"type": "string"
}
},
"rhel7": {
"type": "array",
"items": {
"type": "string"
}
},
"rhel8": {
"type": "array",
"items": {
"type": "string"
}
},
"rhel9": {
"type": "array",
"items": {
"type": "string"
}
},
"rocky": {
"type": "array",
"items": {
"type": "string"
}
},
"rocky8": {
"type": "array",
"items": {
"type": "string"
}
},
"rocky9": {
"type": "array",
"items": {
"type": "string"
}
},
"ubuntu": {
"type": "array",
"items": {
"type": "string"
}
},
"ubuntu16": {
"type": "array",
"items": {
"type": "string"
}
},
"ubuntu18": {
"type": "array",
"items": {
"type": "string"
}
},
"ubuntu20": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"tcpConnect": {
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string"
},
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"timeout": {
"type": "string"
}
}
},
"tcpLoadBalancer": {
"type": "object",
"required": [
"address",
"port"
],
"properties": {
"address": {
"type": "string"
},
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"port": {
"type": "integer"
},
"timeout": {
"type": "string"
}
}
},
"tcpPortStatus": {
"type": "object",
"required": [
"port"
],
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"interface": {
"type": "string"
},
"port": {
"type": "integer"
}
}
},
"time": {
"type": "object",
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
}
}
},
"udpPortStatus": {
"type": "object",
"required": [
"port"
],
"properties": {
"collectorName": {
"type": "string"
},
"exclude": {
"oneOf": [{"type": "string"},{"type": "boolean"}]
},
"interface": {
"type": "string"
},
"port": {
"type": "integer"
}
}
}
}
}
},
"uri": {
"type": "string"
}