libbeat/beat/beat.go (57 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package beat import ( "github.com/elastic/beats/v7/libbeat/api" "github.com/elastic/beats/v7/libbeat/common/reload" "github.com/elastic/beats/v7/libbeat/instrumentation" "github.com/elastic/beats/v7/libbeat/management" "github.com/elastic/beats/v7/libbeat/version" "github.com/elastic/elastic-agent-client/v7/pkg/proto" "github.com/elastic/elastic-agent-libs/config" "github.com/elastic/elastic-agent-libs/keystore" "github.com/elastic/elastic-agent-libs/useragent" ) // Creator initializes and configures a new Beater instance used to execute // the beat's run-loop. type Creator func(*Beat, *config.C) (Beater, error) // Beater is the interface that must be implemented by every Beat. A Beater // provides the main Run-loop and a Stop method to break the Run-loop. // Instantiation and Configuration is normally provided by a Beat-`Creator`. // // Once the beat is fully configured, the Run() method is invoked. The // Run()-method implements the beat its run-loop. Once the Run()-method returns, // the beat shuts down. // // The Stop() method is invoked the first time (and only the first time) a // shutdown signal is received. The Stop()-method normally will stop the Run()-loop, // such that the beat can gracefully shutdown. type Beater interface { // The main event loop. This method should block until signalled to stop by an // invocation of the Stop() method. Run(b *Beat) error // Stop is invoked to signal that the Run method should finish its execution. // It will be invoked at most once. Stop() } // Beat contains the basic beat data and the publisher client used to publish // events. type Beat struct { Info Info // beat metadata. Publisher Pipeline // Publisher pipeline InSetupCmd bool // this is set to true when the `setup` command is called OverwritePipelinesCallback OverwritePipelinesCallback // ingest pipeline loader callback // XXX: remove Config from public interface. // It's currently used by filebeat modules to setup the Ingest Node // pipeline and ML jobs. Config *BeatConfig // Common Beat configuration data. // OutputConfigReloader may be set by a Creator to watch for output config changes. // // This reloader is called in addition to libbeat's internal output reloader, which // is responsible for reconfiguring Publisher. OutputConfigReloader reload.Reloadable BeatConfig *config.C // The beat's own configuration section Fields []byte // Data from fields.yml Manager management.Manager // manager Keystore keystore.Keystore Instrumentation instrumentation.Instrumentation // instrumentation holds an APM agent for capturing and reporting traces API *api.Server // API server. This is nil unless the http endpoint is enabled. Registry *reload.Registry // input, & output registry for configuration manager, should be instantiated in NewBeat } // GenerateUserAgent populates the UserAgent field on the beat.Info struct func (beat *Beat) GenerateUserAgent() { // if we're in fleet mode, construct some additional elements for the UA comment field comments := []string{} if beat.Manager != nil && beat.Manager.Enabled() { info := beat.Manager.AgentInfo() if info.ManagedMode == proto.AgentManagedMode_MANAGED { comments = append(comments, "Managed") } else if info.ManagedMode == proto.AgentManagedMode_STANDALONE { comments = append(comments, "Standalone") } if info.Unprivileged { comments = append(comments, "Unprivileged") } } UserAgentProduct := beat.Info.Beat if UserAgentProduct == "" { UserAgentProduct = "Libbeat" } finalUserAgent := useragent.UserAgent(UserAgentProduct, version.GetDefaultVersion(), version.Commit(), version.BuildTime().String(), comments...) beat.Info.UserAgent = finalUserAgent } // BeatConfig struct contains the basic configuration of every beat type BeatConfig struct { // output/publishing related configurations Output config.Namespace `config:"output"` } // OverwritePipelinesCallback can be used by the Beat to register Ingest pipeline loader // for the enabled modules. type OverwritePipelinesCallback func(*config.C) error