Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Elastic Agent] Add support for variable replacement from providers #20839

Merged
merged 15 commits into from
Sep 3, 2020

Conversation

blakerouse
Copy link
Contributor

@blakerouse blakerouse commented Aug 27, 2020

What does this PR do?

Adds support for replacing {{local_dynamic.key|local_dynamic.other|'fallback'}} inside of the Elastic Agent inputs configuration.

Why is it important?

Finishes the core support for #20781

More code is needed to help debugging effort.

Checklist

  • My code follows the style guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • [ ] I have made corresponding changes to the documentation
  • [ ] I have made corresponding change to the default configuration files
  • I have added tests that prove my fix is effective or that my feature works
  • I have added an entry in CHANGELOG.next.asciidoc or CHANGELOG-developer.next.asciidoc.

How to test this PR locally

Running the Elastic Agent in local mode, use the following configuration:

outputs:
  default:
    type: elasticsearch
    hosts: [127.0.0.1:9200]
    username: elastic
    password: changeme

providers:
  local_dynamic:
    items:
      - vars:
          key: value1
        processors:
          - add_fields:
              fields:
                custom: match1
              target: dynamic
      - vars:
          key: value2
        processors:
          - add_fields:
              fields:
                custom: match2
              target: dynamic
      - vars:
          key: value3
        processors:
          - add_fields:
              fields:
                custom: match3
              target: dynamic

inputs:
  - type: logfile
    enabled: true
    streams:
      - paths:
          - /var/log/{{local_dynamic.key}}

Then run the following to inspect the generated configuration:

$ ./elastic_agent inspect output -o default
[default] filebeat:
filebeat:
  inputs:
  - index: logs-generic-default
    paths:
    - /var/log/value1
    processors:
    - add_fields:
        fields:
          custom: match1
        target: dynamic
    - add_fields:
        fields:
          dataset: generic
          namespace: default
          type: logs
        target: data_stream
    - add_fields:
        fields:
          dataset: generic
        target: event
    type: log
  - index: logs-generic-default
    paths:
    - /var/log/value2
    processors:
    - add_fields:
        fields:
          custom: match2
        target: dynamic
    - add_fields:
        fields:
          dataset: generic
          namespace: default
          type: logs
        target: data_stream
    - add_fields:
        fields:
          dataset: generic
        target: event
    type: log
  - index: logs-generic-default
    paths:
    - /var/log/value3
    processors:
    - add_fields:
        fields:
          custom: match3
        target: dynamic
    - add_fields:
        fields:
          dataset: generic
          namespace: default
          type: logs
        target: data_stream
    - add_fields:
        fields:
          dataset: generic
        target: event
    type: log
output:
  elasticsearch:
    hosts:
    - 127.0.0.1:9200
    password: changeme
    username: elastic

---
[default] FLEET_MONITORING:
output:
  elasticsearch:
    hosts:
    - 127.0.0.1:9200
    password: changeme
    type: elasticsearch
    username: elastic
programs:
- filebeat

---

Related issues

@blakerouse blakerouse self-assigned this Aug 27, 2020
@botelastic botelastic bot added needs_team Indicates that the issue/PR needs a Team:* label and removed needs_team Indicates that the issue/PR needs a Team:* label labels Aug 27, 2020
@blakerouse blakerouse marked this pull request as ready for review August 27, 2020 20:03
@elasticmachine
Copy link
Collaborator

Pinging @elastic/ingest-management (Team:Ingest Management)

@elasticmachine
Copy link
Collaborator

elasticmachine commented Aug 27, 2020

💚 Build Succeeded

Pipeline View Test View Changes Artifacts preview

Expand to view the summary

Build stats

  • Build Cause: [Pull request #20839 updated]

  • Start Time: 2020-09-03T12:37:16.324+0000

  • Duration: 36 min 44 sec

Test stats 🧪

Test Results
Failed 0
Passed 1688
Skipped 3
Total 1691

Copy link
Member

@ruflin ruflin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Could you add a log message somewhere that this is still experimental? We probably will need it also per provider so we can decide for each provider if it is GA or not.
  • What is the current order / overwrite of variables if multiple composable providers are used?

x-pack/elastic-agent/pkg/composable/vars.go Outdated Show resolved Hide resolved
@blakerouse
Copy link
Contributor Author

  • Could you add a log message somewhere that this is still experimental? We probably will need it also per provider so we can decide for each provider if it is GA or not.

Yes I will add a log message on startup to document that dynamic inputs are experimental.

  • What is the current order / overwrite of variables if multiple composable providers are used?

What is great about this implementation is you really don't need to worry about order, there is no magic or undefined behavior in ordering.

  1. All providers are prefixed with the name of the provider. A providers name is unique, so no overriding will occur.
  2. Dynamic providers never exist in the same context. So variable replace context will not include say both docker.* and kubernetes.*.
  3. The order of precedence if needed can be determined by the input definition. So a integration package could handle the order of precedence.

Lets say that an input wants to allow a local variable override from the local provider, then a variable from the ENV, then fallback to a value from host provider.

inputs:
  - type: logfile
    streams:
      - paths: /var/log/{{local.path_name|env.PATH_NAME|host.name}}

That input defines the order of precedence and Elastic Agent doesn't need to worry about collisions or order of precedence, all because its encoded in the input definition by either the user or the integration package.

Another powerful this is the fallback from one dynamic provider to the next.

inputs:
  - type: logfile
    streams:
      - paths: /var/log/{{docker.container.id|kubernetes.container.id}}.log

This input will create both inputs for discovered docker containers and kubernetes containers. Because contexts from dynamic providers are never overlapped that means when docker.container.id exists kubernetes.container.id will never exist and vice versa.

@ruflin
Copy link
Member

ruflin commented Sep 1, 2020

I like that there is not "magic" around the order but the user can define it. We had initially that only the dynamic providers are prefixed, but it sounds like now all providers use prefixes, so also host.name can only come from the agent and not also from environment variables for example?

The part I stumbled over was - paths: /var/log/{{docker.container.id|kubernetes.container.id}}.log as I understand it is possible but I would assume users would not reuse the same input config across multiple dynamic providers. I much prefer your - paths: /var/log/{{local.path_name|env.PATH_NAME|host.name}} example.

@ruflin
Copy link
Member

ruflin commented Sep 1, 2020

@blakerouse Taking handlebars discussion here so it doesn't get lost when changes are pushed. I just realised that we potentially should not use the same syntax as in the packages for these variables as you initially suggested. We use handlebars in the package so we have if/else/loop support. But this is not something we support on the agent, it is only about variable replacements and applying conditions separately. So using handlebars might even give a false impression here. So having a different syntax like ${...|-foo} might even be helpful.

Note: I know we had a similar conversation somewhere else too but couldn't find it anymore :-(

@blakerouse
Copy link
Contributor Author

Moved back to draft while I work on updating to the newest variable syntax.

@blakerouse blakerouse marked this pull request as ready for review September 2, 2020 20:01
@blakerouse
Copy link
Contributor Author

PR moved back to "Ready for review".

Updated it to use new variable syntax ${env.host|host.name|'default'}. Prevent go-ucfg from parsing inputs from go-ucfg when loading configuration from file or when its coming from Fleet. Improved the variable parsing and replacement logic to be cleaner. Added the ability for full object replacement from variables, instead of previously only allowing strings.

//
// This must be used to load the Agent configuration, so that variables defined in the inputs are not
// parsed by go-ucfg. Variables from the inputs should be parsed by the transpiler.
func LoadConfigFromFile(path string) (*config.Config, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not official supported but it basically means someone can use ${ELASTIC_USERNAME} today in the output config because it is ucfg but in case we also support static providers like keystore in the output in the future, this might break as it needs a prefix?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes this allows the same go-ucfg that we have always allowed anywhere in the config except in the inputs. But if we change that in the future then a prefix would be required to get it from the keystore provider.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets keep it in mind if we ever there but ok for now.

}
}
}

e.lock.Lock()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I keep stumbling over these lines and the ones on 112 and asking myself if we don't hit any race conditions somewhere or if we could do it in a nicer way.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Being that its internal state to the struct that is called from 2 different go-routines, I don't really have another way of not requiring a lock.

This is also going to be important for the debugging commands to output the current state.

if err != nil {
return err
e.logger.Errorf("Failed to render configuration with latest context from composable controller: %s", err)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be an option to return the error instead of logging it here? This could make testing easier.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is actually very un-likely that an error will actually occur here, because most errors would come from invalid configuration files, like bad variable syntax or something of that nature. That is why the Update() returns the error, because that is caused when the configuration is parsed and will return an error back to the user or back to Fleet.

In the case that a provider changes a value in a variable or a context is removed it will just cause inputs to be add/update/removed. This can also happen at any time, so really logging it here is the only thing we can do.

return NewStrValWithProcessors(result+value[lastIndex:], processors), nil
}

// validBrackets returns true when all starting {{ have a matching ending }}.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// validBrackets returns true when all starting {{ have a matching ending }}.
// validBrackets returns true when all starting ${ have a matching ending }.

if err != nil {
return nil, err
}
matchIdxs := varsRegex.FindAllSubmatchIndex([]byte(value), -1)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This reminds me we need some rules on what chars are allowed in variable names. Should we restrict it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At the moment varsRegex allows any Unicode character.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we support all of them? Or reduce it to a-z and 2-3 special chars?

Processors: processers,
}

//res, err := vars.Replace("${testing.key1}")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leftover?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, fixed.

return nil, errors.New(err, "failed to unpack providers config", errors.TypeConfig)
return nil, err
}
l.Info("EXPERIMENTAL - Dynamic Inputs are currently experimental and should not be used in production")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
l.Info("EXPERIMENTAL - Dynamic Inputs are currently experimental and should not be used in production")
l.Info("EXPERIMENTAL - Inputs with variables are currently experimental and should not be used in production")

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When exactly is this logged? What kind of config needs the user to have to see this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is logged at the start of Elastic Agent when the controller is created. It is always created even without variables in the configuration, so it always logged.

Copy link
Member

@ruflin ruflin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested it locally with the inspect command and seems to work as expected.

@blakerouse blakerouse merged commit 121f23b into elastic:master Sep 3, 2020
@blakerouse blakerouse deleted the agent-ast-variable-replace branch September 3, 2020 13:18
v1v added a commit to v1v/beats that referenced this pull request Sep 3, 2020
…ne-2.0

* upstream/master:
  [Metricbeat][test] Disable ec2 flaky test (elastic#20959)
  Check if tracer is active before starting a transaction (elastic#20852)
  [Elastic Agent] Add support for variable replacement from providers (elastic#20839)
  Only request wildcard expansion for hidden indices if supported (elastic#20938)
  [Ingest Manager] New agent structure (symlinks) (elastic#20400)
  [Ingest Manager] Print a message confirming shutdown (elastic#20948)
  Skip flaky test on unix input (elastic#20942)
  [Ingest Manager] Align introspect-inspect naming in code (elastic#20952)
  [Filebeat][zeek] Map new x509 fields for ssl module (elastic#20927)
  [CI] fix regression with variable name (elastic#20930)
  [Autodiscover] Handle input-not-finished errors in config reload (elastic#20915)
  [Ingest Manager] Remove Success from fleet contract (elastic#20449)
v1v added a commit to v1v/beats that referenced this pull request Sep 3, 2020
…-faster

* upstream/master:
  [Metricbeat][test] Disable ec2 flaky test (elastic#20959)
  Check if tracer is active before starting a transaction (elastic#20852)
  [Elastic Agent] Add support for variable replacement from providers (elastic#20839)
  Only request wildcard expansion for hidden indices if supported (elastic#20938)
  [Ingest Manager] New agent structure (symlinks) (elastic#20400)
  [Ingest Manager] Print a message confirming shutdown (elastic#20948)
  Skip flaky test on unix input (elastic#20942)
  [Ingest Manager] Align introspect-inspect naming in code (elastic#20952)
  [Filebeat][zeek] Map new x509 fields for ssl module (elastic#20927)
@elasticmachine
Copy link
Collaborator

❕ Build Aborted

Either there was a build timeout or someone aborted the build.'}

Pipeline View Test View Changes Artifacts

Expand to view the summary

Build stats

  • Build Cause: [Pull request #20839 updated]

  • Start Time: 2020-09-03T13:17:02.779+0000

  • Duration: 123 min 58 sec

Test stats 🧪

Test Results
Failed 0
Passed 1128
Skipped 2
Total 1130

Steps errors

Expand to view the steps failures

  • Name: Error signal

    • Description:

    • Duration: 0 min 0 sec

    • Start Time: 2020-09-03T15:19:59.311+0000

    • log

  • Name: Cleanup

    • Description: rm source.tgz

    • Duration: 0 min 0 sec

    • Start Time: 2020-09-03T15:19:59.356+0000

    • log

Log output

Expand to view the last 100 lines of log output

[2020-09-03T14:01:33.704Z] Running in /var/lib/jenkins/workspace/Beats_beats_PR-20839/src/github.com/elastic/beats/x-pack/elastic-agent
[2020-09-03T14:01:34.497Z] + mage build unitTest
[2020-09-03T14:01:52.353Z] go version go1.14.7 darwin/amd64
[2020-09-03T14:01:52.354Z] GO111MODULE=""
[2020-09-03T14:01:52.354Z] GOARCH="amd64"
[2020-09-03T14:01:52.354Z] GOBIN=""
[2020-09-03T14:01:52.354Z] GOCACHE="/var/lib/jenkins/workspace/Beats_beats_PR-20839/Library/Caches/go-build"
[2020-09-03T14:01:52.354Z] GOENV="/var/lib/jenkins/workspace/Beats_beats_PR-20839/Library/Application Support/go/env"
[2020-09-03T14:01:52.354Z] GOEXE=""
[2020-09-03T14:01:52.354Z] GOFLAGS=""
[2020-09-03T14:01:52.354Z] GOHOSTARCH="amd64"
[2020-09-03T14:01:52.354Z] GOHOSTOS="darwin"
[2020-09-03T14:01:52.354Z] GOINSECURE=""
[2020-09-03T14:01:52.354Z] GONOPROXY=""
[2020-09-03T14:01:52.354Z] GONOSUMDB=""
[2020-09-03T14:01:52.354Z] GOOS="darwin"
[2020-09-03T14:01:52.354Z] GOPATH="/var/lib/jenkins/workspace/Beats_beats_PR-20839"
[2020-09-03T14:01:52.354Z] GOPRIVATE=""
[2020-09-03T14:01:52.354Z] GOPROXY="https://proxy.golang.org,direct"
[2020-09-03T14:01:52.354Z] GOROOT="/var/lib/jenkins/workspace/Beats_beats_PR-20839/.gvm/versions/go1.14.7.darwin.amd64"
[2020-09-03T14:01:52.354Z] GOSUMDB="sum.golang.org"
[2020-09-03T14:01:52.354Z] GOTMPDIR=""
[2020-09-03T14:01:52.354Z] GOTOOLDIR="/var/lib/jenkins/workspace/Beats_beats_PR-20839/.gvm/versions/go1.14.7.darwin.amd64/pkg/tool/darwin_amd64"
[2020-09-03T14:01:52.354Z] GCCGO="gccgo"
[2020-09-03T14:01:52.354Z] AR="ar"
[2020-09-03T14:01:52.354Z] CC="clang"
[2020-09-03T14:01:52.354Z] CXX="clang++"
[2020-09-03T14:01:52.354Z] CGO_ENABLED="1"
[2020-09-03T14:01:52.354Z] GOMOD="/private/var/lib/jenkins/workspace/Beats_beats_PR-20839/src/github.com/elastic/beats/go.mod"
[2020-09-03T14:01:52.354Z] CGO_CFLAGS="-g -O2"
[2020-09-03T14:01:52.354Z] CGO_CPPFLAGS=""
[2020-09-03T14:01:52.354Z] CGO_CXXFLAGS="-g -O2"
[2020-09-03T14:01:52.354Z] CGO_FFLAGS="-g -O2"
[2020-09-03T14:01:52.354Z] CGO_LDFLAGS="-g -O2"
[2020-09-03T14:01:52.354Z] PKG_CONFIG="pkg-config"
[2020-09-03T14:01:52.354Z] GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/pv/j9c15rpx0dv4t3zj2wmjhqsw0000md/T/go-build527479192=/tmp/go-build -gno-record-gcc-switches -fno-common"
[2020-09-03T14:01:52.354Z] >> build: Building elastic-agent
[2020-09-03T14:02:02.799Z] >> go test: Unit Testing
[2020-09-03T15:18:59.292Z] Cancelling nested steps due to timeout
[2020-09-03T15:18:59.360Z] Sending interrupt signal to process
[2020-09-03T15:18:59.888Z] Sending interrupt signal to process
[2020-09-03T15:19:15.063Z] script returned exit code 143
[2020-09-03T15:19:16.055Z] Docker machine "default" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.
[2020-09-03T15:19:16.055Z] Docker machine "default" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.
[2020-09-03T15:19:16.278Z] Client: Docker Engine - Community
[2020-09-03T15:19:16.278Z]  Version:           19.03.1
[2020-09-03T15:19:16.278Z]  API version:       1.40
[2020-09-03T15:19:16.278Z]  Go version:        go1.12.5
[2020-09-03T15:19:16.278Z]  Git commit:        74b1e89
[2020-09-03T15:19:16.278Z]  Built:             Thu Jul 25 21:18:17 2019
[2020-09-03T15:19:16.278Z]  OS/Arch:           darwin/amd64
[2020-09-03T15:19:16.278Z]  Experimental:      false
[2020-09-03T15:19:16.278Z] Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[2020-09-03T15:19:16.278Z] It requires Docker daemon to be installed and running
[2020-09-03T15:19:17.147Z] + python .ci/scripts/pre_archive_test.py
[2020-09-03T15:19:17.628Z] Copy ./x-pack/elastic-agent/build into build/x-pack/elastic-agent/build
[2020-09-03T15:19:17.804Z] Running in /var/lib/jenkins/workspace/Beats_beats_PR-20839/src/github.com/elastic/beats/build
[2020-09-03T15:19:17.895Z] Recording test results
[2020-09-03T15:19:18.055Z] None of the test reports contained any result
[2020-09-03T15:19:18.155Z] Stashed 0 file(s)
[2020-09-03T15:19:18.221Z] Archiving artifacts
[2020-09-03T15:19:19.211Z] + python .ci/scripts/search_system_tests.py
[2020-09-03T15:19:19.447Z] [INFO] system-tests=''. If no empty then let's create a tarball
[2020-09-03T15:19:20.778Z] Post stage
[2020-09-03T15:19:20.787Z] Running in /var/lib/jenkins/workspace/Beats_beats_PR-20839/src/github.com/elastic/beats
[2020-09-03T15:19:21.701Z] Starting "default"...
[2020-09-03T15:19:21.701Z] Machine "default" is already running.
[2020-09-03T15:19:23.292Z] Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.101:2376": dial tcp 192.168.99.101:2376: connect: connection refused
[2020-09-03T15:19:23.292Z] You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
[2020-09-03T15:19:23.292Z] Be advised that this will trigger a Docker daemon restart which might stop running containers.
[2020-09-03T15:19:23.292Z] 
[2020-09-03T15:19:23.292Z] Client: Docker Engine - Community
[2020-09-03T15:19:23.292Z]  Version:           19.03.1
[2020-09-03T15:19:23.292Z]  API version:       1.40
[2020-09-03T15:19:23.292Z]  Go version:        go1.12.5
[2020-09-03T15:19:23.292Z]  Git commit:        74b1e89
[2020-09-03T15:19:23.292Z]  Built:             Thu Jul 25 21:18:17 2019
[2020-09-03T15:19:23.292Z]  OS/Arch:           darwin/amd64
[2020-09-03T15:19:23.292Z]  Experimental:      false
[2020-09-03T15:19:23.292Z] Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[2020-09-03T15:19:23.292Z] It requires Docker daemon to be installed and running
[2020-09-03T15:19:35.082Z] Failed in branch Elastic Agent Mac OS X
[2020-09-03T15:19:43.999Z] [INFO] unstashV2: JOB_GCS_BUCKET is set. bucket param got precedency instead.
[2020-09-03T15:19:44.021Z] [INFO] unstashV2: JOB_GCS_CREDENTIALS is set. credentialsId param got precedency instead.
[2020-09-03T15:19:44.085Z] [Google Cloud Storage Plugin] Found 1 files to download from pattern: gs://beats-ci-temp/Beats/beats/PR-20839-9/source/source.tgz
[2020-09-03T15:19:44.102Z] [Google Cloud Storage Plugin] Downloading: Beats/beats/PR-20839-9/source/source.tgz to local path: /var/lib/jenkins/workspace/Beats_beats_PR-20839/source.tgz
[2020-09-03T15:19:53.261Z] + tar --version
[2020-09-03T15:19:53.557Z] + tar -xpf source.tgz
[2020-09-03T15:19:59.293Z] Body did not finish within grace period; terminating with extreme prejudice
[2020-09-03T15:19:59.309Z] [INFO] source.tgz was not extracted : null
[2020-09-03T15:19:59.648Z] + rm source.tgz
[2020-09-03T15:19:59.657Z] ERROR: runbld post build action failed.
[2020-09-03T15:19:59.657Z] ERROR: untar: step failed with error null
[2020-09-03T15:19:59.860Z] Running on Jenkins in /var/lib/jenkins/workspace/Beats_beats_PR-20839
[2020-09-03T15:19:59.968Z] [INFO] getVaultSecret: Getting secrets
[2020-09-03T15:20:00.040Z] Masking supported pattern matches of $VAULT_ADDR or $VAULT_ROLE_ID or $VAULT_SECRET_ID
[2020-09-03T15:20:00.915Z] + chmod 755 generate-build-data.sh
[2020-09-03T15:20:00.915Z] + ./generate-build-data.sh https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Beats/beats/PR-20839/ https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Beats/beats/PR-20839/runs/9 ABORTED 7377873
[2020-09-03T15:20:00.915Z] INFO: curl https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Beats/beats/PR-20839/runs/9/steps/?limit=10000 -o steps-info.json
[2020-09-03T15:20:01.826Z] INFO: curl https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Beats/beats/PR-20839/runs/9/tests/?status=FAILED -o tests-errors.json

blakerouse added a commit to blakerouse/beats that referenced this pull request Sep 7, 2020
…lastic#20839)

* Add ability to replace variables in the parsed AST tree.

* More vars replace improvements.

* Perform the variable replacement of the elastic-agent configuration.

* Clean-up testing and processors.

* Add changelog.

* Fix import sorting.

* Add more validation to variable substitution.

* Add log message about dynamic inputs being experimental.

* Update to new variable format. Handle replace of complete objects.

* Fix config importing to not replace vars in inputs.

* Fixes for vet.

* Fix fleet config change action to use new LoadConfig.

* Fixes from code review.

* Ensure processors are prepended to inputs.

(cherry picked from commit 121f23b)
blakerouse added a commit that referenced this pull request Sep 7, 2020
…20839) (#20964)

* Add ability to replace variables in the parsed AST tree.

* More vars replace improvements.

* Perform the variable replacement of the elastic-agent configuration.

* Clean-up testing and processors.

* Add changelog.

* Fix import sorting.

* Add more validation to variable substitution.

* Add log message about dynamic inputs being experimental.

* Update to new variable format. Handle replace of complete objects.

* Fix config importing to not replace vars in inputs.

* Fixes for vet.

* Fix fleet config change action to use new LoadConfig.

* Fixes from code review.

* Ensure processors are prepended to inputs.

(cherry picked from commit 121f23b)
melchiormoulin pushed a commit to melchiormoulin/beats that referenced this pull request Oct 14, 2020
…lastic#20839)

* Add ability to replace variables in the parsed AST tree.

* More vars replace improvements.

* Perform the variable replacement of the elastic-agent configuration.

* Clean-up testing and processors.

* Add changelog.

* Fix import sorting.

* Add more validation to variable substitution.

* Add log message about dynamic inputs being experimental.

* Update to new variable format. Handle replace of complete objects.

* Fix config importing to not replace vars in inputs.

* Fixes for vet.

* Fix fleet config change action to use new LoadConfig.

* Fixes from code review.

* Ensure processors are prepended to inputs.
@cmacknz cmacknz mentioned this pull request Jul 7, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants