conditional

package
v0.0.0-...-8b9bd6b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 18, 2024 License: Apache-2.0 Imports: 40 Imported by: 0

Documentation

Overview

Package conditional provides conditional gatherer which runs gatherings based on the rules and only if the provided conditions are satisfied. The rules are fetched from Insights Operator Gathering Conditions Service https://github.com/RedHatInsights/insights-operator-gathering-conditions-service . The rules are validated to check that they make sense (for example we don't allow collecting logs from non openshift namespaces).

To add a new condition, follow the steps described in conditions.go file. To add a new gathering function, follow the steps described in gathering_functions.go file.

Index

Constants

This section is empty.

Variables

View Source
var (
	InvalidReason      = "Invalid"
	AsExpectedReason   = "AsExpected"
	NotAvailableReason = "NotAvailable"
)

Functions

This section is empty.

Types

type APIRequestCount

type APIRequestCount struct {
	ResourceName        string `json:"resource"`
	RemovedInRelease    string `json:"removed_in_release"`
	TotalRequestCount   int64  `json:"total_request_count"`
	LastDayRequestCount int64  `json:"last_day_request_count"`
}

APIRequestCount defines a type used when marshaling into JSON

type AlertConditionParams

type AlertConditionParams struct {
	// Name of the alert
	Name string `json:"name"`
}

AlertConditionParams is a type holding params for alert_is_firing condition

type AlertLabels

type AlertLabels map[string]string

AlertLabels defines alert labels as a string key/value pairs

type ClusterVersionMatchesConditionParams

type ClusterVersionMatchesConditionParams struct {
	// Version is a semantic versioning expression
	Version string `json:"version"`
}

ClusterVersionMatchesConditionParams is a type holding params for cluster_version_matches condition

type ConditionType

type ConditionType string

ConditionType defines conditions to check

const AlertIsFiring ConditionType = "alert_is_firing"

AlertIsFiring is a condition to check that alert is firing the params are in the field `alert`

const ClusterVersionMatches ConditionType = "cluster_version_matches"

ClusterVersionMatches is a condition to check that the current cluster version matches the provided semantic versioning expression

type ConditionWithParams

type ConditionWithParams struct {
	Type                  ConditionType                         `json:"type"`
	Alert                 *AlertConditionParams                 `json:"alert,omitempty"`
	ClusterVersionMatches *ClusterVersionMatchesConditionParams `json:"cluster_version_matches,omitempty"`
}

ConditionWithParams is a type holding a condition with its params

type ContainerLogRequest

type ContainerLogRequest struct {
	Namespace     string
	PodName       string
	ContainerName string
	Previous      bool
	MessageRegex  *regexp.Regexp
}

ContainerLogRequest is a type representing concrete and unique container log request

type GatherAPIRequestCountsParams

type GatherAPIRequestCountsParams struct {
	AlertName string `json:"alert_name"`
}

GatherAPIRequestCountsParams defines parameters for api_request_counts gatherer

type GatherContainersLogsParams

type GatherContainersLogsParams struct {
	AlertName string `json:"alert_name"`
	Namespace string `json:"namespace,omitempty"`
	Container string `json:"container,omitempty"`
	TailLines int64  `json:"tail_lines"`
	Previous  bool   `json:"previous,omitempty"`
}

GatherContainersLogsParams defines parameters for container_logs gatherer

type GatherImageStreamsOfNamespaceParams

type GatherImageStreamsOfNamespaceParams struct {
	// Namespace from which to collect image streams
	Namespace string `json:"namespace"`
}

GatherImageStreamsOfNamespaceParams defines parameters for image streams of namespace gatherer

type GatherLogsOfNamespaceParams

type GatherLogsOfNamespaceParams struct {
	// Namespace from which to collect logs
	Namespace string `json:"namespace"`
	// A number of log lines to keep for each container
	TailLines int64 `json:"tail_lines"`
}

GatherLogsOfNamespaceParams defines parameters for logs of namespace gatherer

type GatherPodDefinitionParams

type GatherPodDefinitionParams struct {
	AlertName string `json:"alert_name"`
}

GatherPodDefinitionParams defines parameters for pod_definition gatherer

type Gatherer

type Gatherer struct {
	// contains filtered or unexported fields
}

Gatherer implements the conditional gatherer

func New

func New(
	gatherProtoKubeConfig, metricsGatherKubeConfig, gatherKubeConfig *rest.Config,
	configurator configobserver.Interface, insightsCli InsightsGetClient,
) *Gatherer

New creates a new instance of conditional gatherer with the appropriate configs

func (*Gatherer) BuildGatherAPIRequestCounts

func (g *Gatherer) BuildGatherAPIRequestCounts(paramsInterface interface{}) (gatherers.GatheringClosure, error)

BuildGatherAPIRequestCounts Collects API requests counts for the resources mentioned in the alert provided as a string parameter.

### API Reference None

### Sample data - docs/insights-archive-sample/conditional/alerts/APIRemovedInNextEUSReleaseInUse/api_request_counts.json

### Location in archive - `conditional/alerts/{alert_name}/api_request_counts.json`

### Config ID `conditional/api_request_counts_of_resource_from_alert`

### Released version - 4.10.0

### Backported versions - 4.9.6+

### Changes None

func (*Gatherer) BuildGatherImageStreamsOfNamespace

func (g *Gatherer) BuildGatherImageStreamsOfNamespace(paramsInterface interface{}) (gatherers.GatheringClosure, error)

BuildGatherImageStreamsOfNamespace Closure which collects image streams from the provided namespace

### API Reference - https://docs.openshift.com/container-platform/4.7/rest_api/image_apis/imagestream-image-openshift-io-v1.html#apisimage-openshift-iov1namespacesnamespaceimagestreams

### Sample data - docs/insights-archive-sample/conditional/namespaces/openshift-cluster-samples-operator/imagestreams/example.json

### Location in archive | Version | Path | | --------- | -------------------------------------------------------- | | >= 4.9.0 | conditional/namespaces/{namespace}/imagestreams/{name}.json |

### Config ID `conditional/image_streams_of_namespace`

### Released version - 4.9.0

### Backported versions None

### Changes None

func (*Gatherer) BuildGatherLogsOfNamespace

func (g *Gatherer) BuildGatherLogsOfNamespace(paramsInterface interface{}) (gatherers.GatheringClosure, error)

BuildGatherLogsOfNamespace Collects logs from pods in the provided namespace.

### API Reference - https://github.com/kubernetes/client-go/blob/master/kubernetes/typed/core/v1/pod_expansion.go#L48 - https://docs.openshift.com/container-platform/4.6/rest_api/workloads_apis/pod-core-v1.html#apiv1namespacesnamespacepodsnamelog

### Sample data - docs/insights-archive-sample/conditional/namespaces/openshift-cluster-samples-operator/pods/cluster-samples-operator-8ffb9b45f-49mjr/containers/cluster-samples-operator/logs/last-100-lines.log

### Location in archive - `conditional/namespaces/{namespace}/pods/{pod_name}/containers/{container_name}/logs/last-{n}-lines.log`

### Config ID `conditional/logs_of_namespace`

### Released version - 4.9.0

### Backported versions None

### Changes None

func (*Gatherer) BuildGatherPodDefinition

func (g *Gatherer) BuildGatherPodDefinition(paramsInterface interface{}) (gatherers.GatheringClosure, error)

BuildGatherPodDefinition Collects pod definition from pods that are firing one of the configured alerts.

### API Reference None

### Sample data - docs/insights-archive-sample/conditional/namespaces/openshift-monitoring/pods/alertmanager-main-0/alertmanager-main-0.json

### Location in archive - `conditional/namespaces/{namespace}/pods/{name}/{name}.json`

### Config ID `conditional/pod_definition`

### Released version - 4.11.0

### Backported versions None

### Changes None

func (*Gatherer) BuildLegacyGatherContainersLogs

func (g *Gatherer) BuildLegacyGatherContainersLogs(paramsInterface interface{}) (gatherers.GatheringClosure, error)

BuildLegacyGatherContainersLogs Collects either current or previous containers logs for pods firing one of the alerts from the conditions fetched from insights conditions service.

### API Reference None

### Sample data - docs/insights-archive-sample/conditional/namespaces/openshift-cluster-samples-operator/pods/cluster-samples-operator-8ffb9b45f-49mjr/containers/cluster-samples-operator-watch/logs/last-100-lines.log

### Location in archive - `conditional/namespaces/{namespace}/pods/{pod}/containers/{container}/{logs|logs-previous}/last-{tail-length}-lines.log`

### Config ID `conditional/containers_logs`

### Released version - 4.10.0

### Backported versions None

### Changes None

func (*Gatherer) GatherContainersLogs

func (g *Gatherer) GatherContainersLogs(rawLogRequests []RawLogRequest) (gatherers.GatheringClosure, error)

GatherContainersLogs is used for more dynamic log gathering based on the [Rapid Recommendations](https://github.com/openshift/enhancements/blob/master/enhancements/insights/rapid-recommendations.md).

The remote configuration data is fetched from the Conditional Gathering service (the endpoint is defined [here](https://github.com/openshift/insights-operator/blob/master/config/pod.yaml#L8)). If the remote endpoint is not available or the data cannot be parsed or validated (using JSON schema defined [here](https://github.com/openshift/insights-operator/blob/master/pkg/gatherers/conditional/container_log.schema.json)), the default built-in configuration (see [here](https://github.com/openshift/insights-operator/blob/master/pkg/gatherers/conditional/default_remote_configuration.json)) is used. In case of any issues, user should check the respective clusteroperator conditions (see more information [here](https://github.com/openshift/insights-operator/blob/master/docs/arch.md#how-the-insights-operator-sets-operator-status)) of the Insights Operator.

The configuration used for the data gathering is always stored in the Insights archive in the `insights-operator/remote-configuration.json` file.

The gatherer finds the Pods (and containers) that match the requested data and filters all the container logs to match the specific messages up to a maximum of 6 hours old.

func (*Gatherer) GetGatheringFunctions

func (g *Gatherer) GetGatheringFunctions(ctx context.Context) (map[string]gatherers.GatheringClosure, error)

GetGatheringFunctions returns gathering functions that should be run considering the conditions + the gathering function producing metadata for the conditional gatherer

func (*Gatherer) GetName

func (g *Gatherer) GetName() string

GetName returns the name of the gatherer

func (*Gatherer) RemoteConfigStatus

func (g *Gatherer) RemoteConfigStatus() gatherers.RemoteConfigStatus

type GathererFunctionBuilderPtr

type GathererFunctionBuilderPtr = func(*Gatherer, interface{}) (gatherers.GatheringClosure, error)

GathererFunctionBuilderPtr defines a pointer to a gatherer function builder

type GatheringFunctionName

type GatheringFunctionName string

GatheringFunctionName defines functions of conditional gatherer

const (
	// GatherLogsOfNamespace is a function collecting logs of the provided namespace.
	// See file gather_logs_of_namespace.go
	GatherLogsOfNamespace GatheringFunctionName = "logs_of_namespace"

	// GatherImageStreamsOfNamespace is a function collecting image streams of the provided namespace.
	// See file gather_image_streams_of_namespace.go
	GatherImageStreamsOfNamespace GatheringFunctionName = "image_streams_of_namespace"

	// GatherAPIRequestCounts is a function collecting api request counts for the resources read
	// from the corresponding alert
	// See file gather_api_requests_count.go
	GatherAPIRequestCounts GatheringFunctionName = "api_request_counts_of_resource_from_alert"

	// GatherContainersLogs is a function that collects logs from pod's containers
	// See file gather_containers_logs.go
	GatherContainersLogs GatheringFunctionName = "containers_logs"

	// GatherPodDefinition is a function that collects the pod definitions
	// See file gather_pod_definition.go
	GatherPodDefinition GatheringFunctionName = "pod_definition"
)

func (GatheringFunctionName) NewParams

func (name GatheringFunctionName) NewParams(jsonParams []byte) (interface{}, error)

type GatheringFunctions

type GatheringFunctions = map[GatheringFunctionName]interface{}

GatheringFunctions is a type to map gathering function name to its params

type GatheringRule

type GatheringRule struct {
	// conditions can be empty
	Conditions []ConditionWithParams `json:"conditions"`
	// gathering functions can't be empty
	GatheringFunctions GatheringFunctions `json:"gathering_functions"`
}

GatheringRule is a rule consisting of conditions and gathering functions to run if all conditions are met, gathering_rule.schema.json describes valid values for this struct. An example of it:

{
  "conditions": [
    {
      "type": "alert_is_firing",
      "alert": {
        "name": "ClusterVersionOperatorIsDown"
      }
    },
    {
      "type": "cluster_version_matches",
      "cluster_version": {
        "version": "4.8.x"
      }
    }
  ],
  "gathering_functions": {
    "gather_logs_of_namespace": {
      "namespace": "openshift-cluster-version",
      "keep_lines": 100
    }
  }
}

Which means to collect logs of all containers from all pods in namespace openshift-monitoring keeping last 100 lines per container only if cluster version is 4.8 (not implemented, just an example of possible use) and alert ClusterVersionOperatorIsDown is firing

type GatheringRuleMetadata

type GatheringRuleMetadata struct {
	Rule         GatheringRule `json:"rule"`
	Errors       []string      `json:"errors"`
	WasTriggered bool          `json:"was_triggered"`
}

GatheringRuleMetadata stores metadata about a gathering rule

type GatheringRulesMetadata

type GatheringRulesMetadata struct {
	Version  string                  `json:"version"`
	Rules    []GatheringRuleMetadata `json:"conditional_gathering_rules"`
	Endpoint string                  `json:"endpoint"`
}

GatheringRulesMetadata stores metadata about gathering rules

type InsightsGetClient

type InsightsGetClient interface {
	GetWithPathParam(ctx context.Context, endpoint string, param string, includeClusterID bool) (*http.Response, error)
}

type LogRequest

type LogRequest struct {
	Namespace              string
	PodNameRegexToMessages map[PodNameRegexPrevious]sets.Set[string]
}

LogRequest is a "sanitized" type, because there can be various requests for the same namespace and this type helps prevent duplicate Pod name regular expressions and duplicate messages

type PodNameRegexPrevious

type PodNameRegexPrevious struct {
	PodNameRegex string
	Previous     bool
}

PodNameRegexPrevious is a helper struct storing the Pod name regular expression value together with a flag saying whether it is for previous container log or not

type RawLogRequest

type RawLogRequest struct {
	Namespace    string   `json:"namespace"`
	PodNameRegex string   `json:"pod_name_regex"`
	Messages     []string `json:"messages"`
	Previous     bool     `json:"previous,omitempty"`
}

RawLogRequest is type used to unmarshal the remote configuration JSON

type RemoteConfiguration

type RemoteConfiguration struct {
	Version                   string          `json:"version"`
	ConditionalGatheringRules []GatheringRule `json:"conditional_gathering_rules"`
	ContainerLogRequests      []RawLogRequest `json:"container_logs"`
}

RemoteConfiguration is a structure to hold gathering rules with their version

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL