From a119083d71136cc18eed23128a02ad836a22d66b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Fri, 2 Oct 2020 12:33:32 +0200 Subject: [PATCH 01/21] Add implementation of FSWatcher and FSScanner for filestream (#21444) ## What does this PR do? This PR adds the implementation for `FSWatcher` and `FSScanner` for the `filestream` input. The implementation of `FSScanner` is called `fileScanner`. It is responsible for * resolves recursive globs on creation * normalizes glob patterns on creation * finds files which match the configured paths and returns `FileInfo` for those This is the refactored version of the `log` input's scanner, globber functions. The implementation of `FSWatcher` is called `fileWatcher`. It checks the file list returned by `fileScanner` and creates events based on the result. ## Why is it important? It is required for the `filestream` input. ## Related issues Related #20243 --- filebeat/input/filestream/fswatch.go | 375 ++++++++++++++++++ filebeat/input/filestream/fswatch_test.go | 300 ++++++++++++++ .../input/filestream/testdata/excluded_file | 0 .../input/filestream/testdata/included_file | 0 .../testdata/symlink_to_included_file | 1 + 5 files changed, 676 insertions(+) create mode 100644 filebeat/input/filestream/fswatch.go create mode 100644 filebeat/input/filestream/fswatch_test.go create mode 100644 filebeat/input/filestream/testdata/excluded_file create mode 100644 filebeat/input/filestream/testdata/included_file create mode 120000 filebeat/input/filestream/testdata/symlink_to_included_file diff --git a/filebeat/input/filestream/fswatch.go b/filebeat/input/filestream/fswatch.go new file mode 100644 index 00000000000..d4bc1b5ea08 --- /dev/null +++ b/filebeat/input/filestream/fswatch.go @@ -0,0 +1,375 @@ +// 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 filestream + +import ( + "fmt" + "os" + "path/filepath" + "time" + + "github.com/elastic/beats/v7/filebeat/input/file" + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/unison" +) + +const ( + recursiveGlobDepth = 8 + scannerName = "scanner" + watcherDebugKey = "file_watcher" +) + +var ( + watcherFactories = map[string]watcherFactory{ + scannerName: newScannerWatcher, + } +) + +type watcherFactory func(paths []string, cfg *common.Config) (loginp.FSWatcher, error) + +// fileScanner looks for files which match the patterns in paths. +// It is able to exclude files and symlinks. +type fileScanner struct { + paths []string + excludedFiles []match.Matcher + symlinks bool + + log *logp.Logger +} + +type fileWatcherConfig struct { + // Interval is the time between two scans. + Interval time.Duration + // Scanner is the configuration of the scanner. + Scanner fileScannerConfig +} + +// fileWatcher gets the list of files from a FSWatcher and creates events by +// comparing the files between its last two runs. +type fileWatcher struct { + interval time.Duration + prev map[string]os.FileInfo + scanner loginp.FSScanner + log *logp.Logger + events chan loginp.FSEvent +} + +func newFileWatcher(paths []string, ns *common.ConfigNamespace) (loginp.FSWatcher, error) { + if ns == nil { + return newScannerWatcher(paths, nil) + } + + watcherType := ns.Name() + f, ok := watcherFactories[watcherType] + if !ok { + return nil, fmt.Errorf("no such file watcher: %s", watcherType) + } + + return f(paths, ns.Config()) +} + +func newScannerWatcher(paths []string, c *common.Config) (loginp.FSWatcher, error) { + config := defaultFileWatcherConfig() + err := c.Unpack(&config) + if err != nil { + return nil, err + } + scanner, err := newFileScanner(paths, config.Scanner) + if err != nil { + return nil, err + } + return &fileWatcher{ + log: logp.NewLogger(watcherDebugKey), + interval: config.Interval, + prev: make(map[string]os.FileInfo, 0), + scanner: scanner, + events: make(chan loginp.FSEvent), + }, nil +} + +func defaultFileWatcherConfig() fileWatcherConfig { + return fileWatcherConfig{ + Interval: 10 * time.Second, + Scanner: defaultFileScannerConfig(), + } +} + +func (w *fileWatcher) Run(ctx unison.Canceler) { + defer close(w.events) + + ticker := time.NewTicker(w.interval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + w.watch(ctx) + } + } +} + +func (w *fileWatcher) watch(ctx unison.Canceler) { + w.log.Info("Start next scan") + + paths := w.scanner.GetFiles() + + newFiles := make(map[string]os.FileInfo) + + for path, info := range paths { + + prevInfo, ok := w.prev[path] + if !ok { + newFiles[path] = paths[path] + continue + } + + if prevInfo.ModTime() != info.ModTime() { + select { + case <-ctx.Done(): + return + case w.events <- writeEvent(path, info): + } + } + + // delete from previous state, as we have more up to date info + delete(w.prev, path) + } + + // remaining files are in the prev map are the ones that are missing + // either because they have been deleted or renamed + for removedPath, removedInfo := range w.prev { + for newPath, newInfo := range newFiles { + if os.SameFile(removedInfo, newInfo) { + select { + case <-ctx.Done(): + return + case w.events <- renamedEvent(removedPath, newPath, newInfo): + delete(newFiles, newPath) + goto CHECK_NEXT_REMOVED + } + } + } + + select { + case <-ctx.Done(): + return + case w.events <- deleteEvent(removedPath, removedInfo): + } + CHECK_NEXT_REMOVED: + } + + // remaining files in newFiles are new + for path, info := range newFiles { + select { + case <-ctx.Done(): + return + case w.events <- createEvent(path, info): + } + + } + + w.log.Debugf("Found %d paths", len(paths)) + w.prev = paths +} + +func createEvent(path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: path, Info: fi} +} + +func writeEvent(path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpWrite, OldPath: path, NewPath: path, Info: fi} +} + +func renamedEvent(oldPath, path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpRename, OldPath: oldPath, NewPath: path, Info: fi} +} + +func deleteEvent(path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpDelete, OldPath: path, NewPath: "", Info: fi} +} + +func (w *fileWatcher) Event() loginp.FSEvent { + return <-w.events +} + +type fileScannerConfig struct { + Paths []string + ExcludedFiles []match.Matcher + Symlinks bool + RecursiveGlob bool +} + +func defaultFileScannerConfig() fileScannerConfig { + return fileScannerConfig{ + Symlinks: false, + RecursiveGlob: true, + } +} + +func newFileScanner(paths []string, cfg fileScannerConfig) (loginp.FSScanner, error) { + fs := fileScanner{ + paths: paths, + excludedFiles: cfg.ExcludedFiles, + symlinks: cfg.Symlinks, + log: logp.NewLogger(scannerName), + } + err := fs.resolveRecursiveGlobs(cfg) + if err != nil { + return nil, err + } + err = fs.normalizeGlobPatterns() + if err != nil { + return nil, err + } + + return &fs, nil +} + +// resolveRecursiveGlobs expands `**` from the globs in multiple patterns +func (s *fileScanner) resolveRecursiveGlobs(c fileScannerConfig) error { + if !c.RecursiveGlob { + s.log.Debug("recursive glob disabled") + return nil + } + + s.log.Debug("recursive glob enabled") + var paths []string + for _, path := range s.paths { + patterns, err := file.GlobPatterns(path, recursiveGlobDepth) + if err != nil { + return err + } + if len(patterns) > 1 { + s.log.Debugf("%q expanded to %#v", path, patterns) + } + paths = append(paths, patterns...) + } + s.paths = paths + return nil +} + +// normalizeGlobPatterns calls `filepath.Abs` on all the globs from config +func (s *fileScanner) normalizeGlobPatterns() error { + var paths []string + for _, path := range s.paths { + pathAbs, err := filepath.Abs(path) + if err != nil { + return fmt.Errorf("failed to get the absolute path for %s: %v", path, err) + } + paths = append(paths, pathAbs) + } + s.paths = paths + return nil +} + +// GetFiles returns a map of files and fileinfos which +// match the configured paths. +func (s *fileScanner) GetFiles() map[string]os.FileInfo { + pathInfo := map[string]os.FileInfo{} + + for _, path := range s.paths { + matches, err := filepath.Glob(path) + if err != nil { + s.log.Errorf("glob(%s) failed: %v", path, err) + continue + } + + for _, file := range matches { + if s.shouldSkipFile(file) { + continue + } + + // If symlink is enabled, it is checked that original is not part of same input + // If original is harvested by other input, states will potentially overwrite each other + if s.isOriginalAndSymlinkConfigured(file, pathInfo) { + continue + } + + fileInfo, err := os.Stat(file) + if err != nil { + s.log.Debug("stat(%s) failed: %s", file, err) + continue + } + pathInfo[file] = fileInfo + } + } + + return pathInfo +} + +func (s *fileScanner) shouldSkipFile(file string) bool { + if s.isFileExcluded(file) { + s.log.Debugf("Exclude file: %s", file) + return true + } + + fileInfo, err := os.Lstat(file) + if err != nil { + s.log.Debugf("lstat(%s) failed: %s", file, err) + return true + } + + if fileInfo.IsDir() { + s.log.Debugf("Skipping directory: %s", file) + return true + } + + isSymlink := fileInfo.Mode()&os.ModeSymlink > 0 + if isSymlink && !s.symlinks { + s.log.Debugf("File %s skipped as it is a symlink", file) + return true + } + + return false +} + +func (s *fileScanner) isOriginalAndSymlinkConfigured(file string, paths map[string]os.FileInfo) bool { + if s.symlinks { + fileInfo, err := os.Stat(file) + if err != nil { + s.log.Debugf("stat(%s) failed: %s", file, err) + return false + } + + for _, finfo := range paths { + if os.SameFile(finfo, fileInfo) { + s.log.Info("Same file found as symlink and original. Skipping file: %s (as it same as %s)", file, finfo.Name()) + return true + } + } + } + return false +} + +func (s *fileScanner) isFileExcluded(file string) bool { + return len(s.excludedFiles) > 0 && s.matchAny(s.excludedFiles, file) +} + +// matchAny checks if the text matches any of the regular expressions +func (s *fileScanner) matchAny(matchers []match.Matcher, text string) bool { + for _, m := range matchers { + if m.MatchString(text) { + return true + } + } + return false +} diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go new file mode 100644 index 00000000000..5e63987c868 --- /dev/null +++ b/filebeat/input/filestream/fswatch_test.go @@ -0,0 +1,300 @@ +// 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 filestream + +import ( + "context" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestFileScanner(t *testing.T) { + testCases := map[string]struct { + paths []string + excludedFiles []match.Matcher + symlinks bool + expectedFiles []string + }{ + "select all files": { + paths: []string{ + filepath.Join("testdata", "excluded_file"), + filepath.Join("testdata", "included_file"), + }, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "excluded_file")), + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "skip excluded files": { + paths: []string{ + filepath.Join("testdata", "excluded_file"), + filepath.Join("testdata", "included_file"), + }, + excludedFiles: []match.Matcher{ + match.MustCompile(filepath.Join("testdata", "excluded_file")), + }, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + // covers test_input.py/test_skip_symlinks + "skip symlinks": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: false, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "return a file once if symlinks are enabled": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: true, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "skip directories": { + paths: []string{ + filepath.Join("testdata", "unharvestable_dir"), + }, + expectedFiles: []string{}, + }, + } + + for name, test := range testCases { + test := test + + t.Run(name, func(t *testing.T) { + cfg := fileScannerConfig{ + ExcludedFiles: test.excludedFiles, + Symlinks: test.symlinks, + RecursiveGlob: false, + } + fs, err := newFileScanner(test.paths, cfg) + if err != nil { + t.Fatal(err) + } + files := fs.GetFiles() + paths := make([]string, 0) + for p, _ := range files { + paths = append(paths, p) + } + assert.Equal(t, test.expectedFiles, paths) + }) + } +} + +func TestFileWatchNewDeleteModified(t *testing.T) { + oldTs := time.Now() + newTs := oldTs.Add(5 * time.Second) + testCases := map[string]struct { + prevFiles map[string]os.FileInfo + nextFiles map[string]os.FileInfo + expectedEvents []loginp.FSEvent + }{ + "one new file": { + prevFiles: map[string]os.FileInfo{}, + nextFiles: map[string]os.FileInfo{ + "new_path": testFileInfo{"new_path", 5, oldTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: "new_path", Info: testFileInfo{"new_path", 5, oldTs}}, + }, + }, + "one deleted file": { + prevFiles: map[string]os.FileInfo{ + "old_path": testFileInfo{"old_path", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{}, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpDelete, OldPath: "old_path", NewPath: "", Info: testFileInfo{"old_path", 5, oldTs}}, + }, + }, + "one modified file": { + prevFiles: map[string]os.FileInfo{ + "path": testFileInfo{"path", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path": testFileInfo{"path", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path", NewPath: "path", Info: testFileInfo{"path", 10, newTs}}, + }, + }, + "two modified files": { + prevFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 5, oldTs}, + "path2": testFileInfo{"path2", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 10, newTs}, + "path2": testFileInfo{"path2", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path1", NewPath: "path1", Info: testFileInfo{"path1", 10, newTs}}, + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path2", NewPath: "path2", Info: testFileInfo{"path2", 10, newTs}}, + }, + }, + "one modified file, one new file": { + prevFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 10, newTs}, + "path2": testFileInfo{"path2", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path1", NewPath: "path1", Info: testFileInfo{"path1", 10, newTs}}, + loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: "path2", Info: testFileInfo{"path2", 10, newTs}}, + }, + }, + "one new file, one deleted file": { + prevFiles: map[string]os.FileInfo{ + "path_deleted": testFileInfo{"path_deleted", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path_new": testFileInfo{"path_new", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpDelete, OldPath: "path_deleted", NewPath: "", Info: testFileInfo{"path_deleted", 5, oldTs}}, + loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: "path_new", Info: testFileInfo{"path_new", 10, newTs}}, + }, + }, + } + + for name, test := range testCases { + test := test + + t.Run(name, func(t *testing.T) { + w := fileWatcher{ + log: logp.L(), + prev: test.prevFiles, + scanner: &mockScanner{test.nextFiles}, + events: make(chan loginp.FSEvent), + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go w.watch(ctx) + + for _, expectedEvent := range test.expectedEvents { + evt := w.Event() + assert.Equal(t, expectedEvent, evt) + } + }) + } +} + +func TestFileWatcherRenamedFile(t *testing.T) { + testPath := mustAbsPath(filepath.Join("testdata", "first_name")) + renamedPath := mustAbsPath(filepath.Join("testdata", "renamed")) + + f, err := os.Create(testPath) + if err != nil { + t.Fatal(err) + } + f.Close() + fi, err := os.Stat(testPath) + if err != nil { + t.Fatal(err) + } + + cfg := fileScannerConfig{ + ExcludedFiles: nil, + Symlinks: false, + RecursiveGlob: false, + } + scanner, err := newFileScanner([]string{testPath, renamedPath}, cfg) + if err != nil { + t.Fatal(err) + } + w := fileWatcher{ + log: logp.L(), + scanner: scanner, + events: make(chan loginp.FSEvent), + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + go w.watch(ctx) + assert.Equal(t, loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: testPath, Info: fi}, w.Event()) + + err = os.Rename(testPath, renamedPath) + if err != nil { + t.Fatal(err) + } + defer os.Remove(renamedPath) + fi, err = os.Stat(renamedPath) + if err != nil { + t.Fatal(err) + } + + go w.watch(ctx) + assert.Equal(t, loginp.FSEvent{Op: loginp.OpRename, OldPath: testPath, NewPath: renamedPath, Info: fi}, w.Event()) +} + +type mockScanner struct { + files map[string]os.FileInfo +} + +func (m *mockScanner) GetFiles() map[string]os.FileInfo { + return m.files +} + +type testFileInfo struct { + path string + size int64 + time time.Time +} + +func (t testFileInfo) Name() string { return t.path } +func (t testFileInfo) Size() int64 { return t.size } +func (t testFileInfo) Mode() os.FileMode { return 0 } +func (t testFileInfo) ModTime() time.Time { return t.time } +func (t testFileInfo) IsDir() bool { return false } +func (t testFileInfo) Sys() interface{} { return nil } + +func mustAbsPath(path string) string { + p, err := filepath.Abs(path) + if err != nil { + panic(err) + } + return p +} + +func mustDuration(durStr string) time.Duration { + dur, err := time.ParseDuration(durStr) + if err != nil { + panic(err) + } + return dur +} diff --git a/filebeat/input/filestream/testdata/excluded_file b/filebeat/input/filestream/testdata/excluded_file new file mode 100644 index 00000000000..e69de29bb2d diff --git a/filebeat/input/filestream/testdata/included_file b/filebeat/input/filestream/testdata/included_file new file mode 100644 index 00000000000..e69de29bb2d diff --git a/filebeat/input/filestream/testdata/symlink_to_included_file b/filebeat/input/filestream/testdata/symlink_to_included_file new file mode 120000 index 00000000000..40824f3f7d3 --- /dev/null +++ b/filebeat/input/filestream/testdata/symlink_to_included_file @@ -0,0 +1 @@ +filebeat/input/filestream/testdata/included_file \ No newline at end of file From b8fd5fc333d3bffc83a6590f15d7109ac83acdc8 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Fri, 2 Oct 2020 13:03:56 +0200 Subject: [PATCH 02/21] Remove duplicated sources url in dependencies report (#21462) It was added by mistake as part of the license URL. --- dev-tools/dependencies-report | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-tools/dependencies-report b/dev-tools/dependencies-report index a2662a4ab9a..928de5367ca 100755 --- a/dev-tools/dependencies-report +++ b/dev-tools/dependencies-report @@ -48,7 +48,7 @@ go list -m -json all $@ | go run go.elastic.co/go-licence-detector \ # name,url,version,revision,license ubi8url='https://catalog.redhat.com/software/containers/ubi8/ubi-minimal/5c359a62bed8bd75a2c3fba8' ubi8source='https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz' -ubilicense='Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf,https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz' +ubilicense='Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf' cat <> $outfile Red Hat Universal Base Image,$ubi8url,8,,$ubilicense,$ubi8source EOF From 79ddbbfb642eda785f5ef76206e65c5a1690f0e9 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 12:12:52 +0100 Subject: [PATCH 03/21] [CI] Send slack message with build status (#21428) --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 119cea9b3ab..317a5c781e3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,6 +24,7 @@ pipeline { PIPELINE_LOG_LEVEL = 'INFO' PYTEST_ADDOPTS = "${params.PYTEST_ADDOPTS}" RUNBLD_DISABLE_NOTIFICATIONS = 'true' + SLACK_CHANNEL = "#beats-ci-builds" TERRAFORM_VERSION = "0.12.24" XPACK_MODULE_PATTERN = '^x-pack\\/[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' } @@ -121,7 +122,7 @@ pipeline { runbld(stashedTestReports: stashedTestReports, project: env.REPO) } cleanup { - notifyBuildResult(prComment: true) + notifyBuildResult(prComment: true, slackComment: true) } } } From 19453734455cc831422d236cdadc67e71ed5caba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Fri, 2 Oct 2020 13:13:31 +0200 Subject: [PATCH 04/21] Add new log file reader for filestream input (#21450) ## What does this PR do? This PR adds the new refactored version of the previous `Log` reader of the `log` input called `logFile`. The differences between the two readers are the following: * `logFile` calls `Stat` only once to avoid too many system calls (`Log` calls `Stat` 3 times after every read) * `logFile` starts separate go routines to check if `close.after_interval` or `close.inactive` has elapsed. `Log` checks `close_inactive` after every `Read`. Thus, if the output is blocked, it cannot stop the reader. * `logFile` does not check if the file has been removed or renamed if `close_removed` or `close_renamed` are enabled. Instead it is checked separately in the prospector, so if the output blocks, the reader can be closed. This prevents Filebeat keeping too many open files if the output is blocked. (The code mentioned is not yet included in any PR.) ## Why is it important? This is the improved version of the previous `log` reader. --- filebeat/input/filestream/config.go | 147 ++++++++++++++++ filebeat/input/filestream/filestream.go | 225 ++++++++++++++++++++++++ 2 files changed, 372 insertions(+) create mode 100644 filebeat/input/filestream/config.go create mode 100644 filebeat/input/filestream/filestream.go diff --git a/filebeat/input/filestream/config.go b/filebeat/input/filestream/config.go new file mode 100644 index 00000000000..93b23232594 --- /dev/null +++ b/filebeat/input/filestream/config.go @@ -0,0 +1,147 @@ +// 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 filestream + +import ( + "fmt" + "time" + + "github.com/dustin/go-humanize" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/reader/readfile" +) + +// Config stores the options of a file stream. +type config struct { + Paths []string `config:"paths"` + Close closerConfig `config:"close"` + FileWatcher *common.ConfigNamespace `config:"file_watcher"` + Reader readerConfig `config:"readers"` + FileIdentity *common.ConfigNamespace `config:"file_identity"` + CleanInactive time.Duration `config:"clean_inactive" validate:"min=0"` + CleanRemoved bool `config:"clean_removed"` + HarvesterLimit uint32 `config:"harvester_limit" validate:"min=0"` + IgnoreOlder time.Duration `config:"ignore_older"` +} + +type closerConfig struct { + OnStateChange stateChangeCloserConfig `config:"on_state_change"` + Reader readerCloserConfig `config:"reader"` +} + +type readerCloserConfig struct { + AfterInterval time.Duration + Inactive time.Duration + OnEOF bool +} + +type stateChangeCloserConfig struct { + CheckInterval time.Duration + Removed bool + Renamed bool +} + +// TODO should this be inline? +type readerConfig struct { + Backoff backoffConfig `config:"backoff"` + BufferSize int `config:"buffer_size"` + Encoding string `config:"encoding"` + ExcludeLines []match.Matcher `config:"exclude_lines"` + IncludeLines []match.Matcher `config:"include_lines"` + LineTerminator readfile.LineTerminator `config:"line_terminator"` + MaxBytes int `config:"message_max_bytes" validate:"min=0,nonzero"` + Tail bool `config:"seek_to_tail"` + + Parsers []*common.ConfigNamespace `config:"parsers"` // TODO multiline, json, syslog? +} + +type backoffConfig struct { + Init time.Duration `config:"init" validate:"nonzero"` + Max time.Duration `config:"max" validate:"nonzero"` +} + +func defaultConfig() config { + return config{ + Paths: []string{}, + Close: defaultCloserConfig(), + Reader: defaultReaderConfig(), + CleanInactive: 0, + CleanRemoved: true, + HarvesterLimit: 0, + IgnoreOlder: 0, + } +} + +func defaultCloserConfig() closerConfig { + return closerConfig{ + OnStateChange: stateChangeCloserConfig{ + CheckInterval: 5 * time.Second, + Removed: true, // TODO check clean_removed option + Renamed: false, + }, + Reader: readerCloserConfig{ + OnEOF: false, + Inactive: 0 * time.Second, + AfterInterval: 0 * time.Second, + }, + } +} + +func defaultReaderConfig() readerConfig { + return readerConfig{ + Backoff: backoffConfig{ + Init: 1 * time.Second, + Max: 10 * time.Second, + }, + BufferSize: 16 * humanize.KiByte, + LineTerminator: readfile.AutoLineTerminator, + MaxBytes: 10 * humanize.MiByte, + Tail: false, + Parsers: nil, + } +} + +func (c *config) Validate() error { + if len(c.Paths) == 0 { + return fmt.Errorf("no path is configured") + } + // TODO + //if c.CleanInactive != 0 && c.IgnoreOlder == 0 { + // return fmt.Errorf("ignore_older must be enabled when clean_inactive is used") + //} + + // TODO + //if c.CleanInactive != 0 && c.CleanInactive <= c.IgnoreOlder+c.ScanFrequency { + // return fmt.Errorf("clean_inactive must be > ignore_older + scan_frequency to make sure only files which are not monitored anymore are removed") + //} + + // TODO + //if c.JSON != nil && len(c.JSON.MessageKey) == 0 && + // c.Multiline != nil { + // return fmt.Errorf("When using the JSON decoder and multiline together, you need to specify a message_key value") + //} + + //if c.JSON != nil && len(c.JSON.MessageKey) == 0 && + // (len(c.IncludeLines) > 0 || len(c.ExcludeLines) > 0) { + // return fmt.Errorf("When using the JSON decoder and line filtering together, you need to specify a message_key value") + //} + + return nil +} diff --git a/filebeat/input/filestream/filestream.go b/filebeat/input/filestream/filestream.go new file mode 100644 index 00000000000..59f26ccca1b --- /dev/null +++ b/filebeat/input/filestream/filestream.go @@ -0,0 +1,225 @@ +// 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 filestream + +import ( + "context" + "errors" + "io" + "os" + "time" + + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/common/backoff" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/ctxtool" + "github.com/elastic/go-concert/unison" +) + +var ( + ErrFileTruncate = errors.New("detected file being truncated") + ErrClosed = errors.New("reader closed") +) + +// logFile contains all log related data +type logFile struct { + file *os.File + log *logp.Logger + ctx context.Context + cancelReading context.CancelFunc + + closeInactive time.Duration + closeAfterInterval time.Duration + closeOnEOF bool + + offset int64 + lastTimeRead time.Time + backoff backoff.Backoff + tg unison.TaskGroup +} + +// newFileReader creates a new log instance to read log sources +func newFileReader( + log *logp.Logger, + canceler input.Canceler, + f *os.File, + config readerConfig, + closerConfig readerCloserConfig, +) (*logFile, error) { + offset, err := f.Seek(0, os.SEEK_CUR) + if err != nil { + return nil, err + } + + l := &logFile{ + file: f, + log: log, + closeInactive: closerConfig.Inactive, + closeAfterInterval: closerConfig.AfterInterval, + closeOnEOF: closerConfig.OnEOF, + offset: offset, + lastTimeRead: time.Now(), + backoff: backoff.NewExpBackoff(canceler.Done(), config.Backoff.Init, config.Backoff.Max), + tg: unison.TaskGroup{}, + } + + l.ctx, l.cancelReading = ctxtool.WithFunc(ctxtool.FromCanceller(canceler), func() { + err := l.tg.Stop() + if err != nil { + l.log.Errorf("Error while stopping filestream logFile reader: %v", err) + } + }) + + l.startFileMonitoringIfNeeded() + + return l, nil +} + +// Read reads from the reader and updates the offset +// The total number of bytes read is returned. +func (f *logFile) Read(buf []byte) (int, error) { + totalN := 0 + + for f.ctx.Err() == nil { + n, err := f.file.Read(buf) + if n > 0 { + f.offset += int64(n) + f.lastTimeRead = time.Now() + } + totalN += n + + // Read from source completed without error + // Either end reached or buffer full + if err == nil { + // reset backoff for next read + f.backoff.Reset() + return totalN, nil + } + + // Move buffer forward for next read + buf = buf[n:] + + // Checks if an error happened or buffer is full + // If buffer is full, cannot continue reading. + // Can happen if n == bufferSize + io.EOF error + err = f.errorChecks(err) + if err != nil || len(buf) == 0 { + return totalN, err + } + + f.log.Debugf("End of file reached: %s; Backoff now.", f.file.Name()) + f.backoff.Wait() + } + + return 0, ErrClosed +} + +func (f *logFile) startFileMonitoringIfNeeded() { + if f.closeInactive == 0 && f.closeAfterInterval == 0 { + return + } + + if f.closeInactive > 0 { + f.tg.Go(func(ctx unison.Canceler) error { + f.closeIfTimeout(ctx) + return nil + }) + } + + if f.closeAfterInterval > 0 { + f.tg.Go(func(ctx unison.Canceler) error { + f.closeIfInactive(ctx) + return nil + }) + } +} + +func (f *logFile) closeIfTimeout(ctx unison.Canceler) { + timer := time.NewTimer(f.closeAfterInterval) + defer timer.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-timer.C: + f.cancelReading() + return + } + } +} + +func (f *logFile) closeIfInactive(ctx unison.Canceler) { + // This can be made configureble if users need a more flexible + // cheking for inactive files. + ticker := time.NewTicker(5 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + age := time.Since(f.lastTimeRead) + if age > f.closeInactive { + f.cancelReading() + return + } + } + } +} + +// errorChecks determines the cause for EOF errors, and how the EOF event should be handled +// based on the config options. +func (f *logFile) errorChecks(err error) error { + if err != io.EOF { + f.log.Error("Unexpected state reading from %s; error: %s", f.file.Name(), err) + return err + } + + return f.handleEOF() +} + +func (f *logFile) handleEOF() error { + if f.closeOnEOF { + return io.EOF + } + + // Refetch fileinfo to check if the file was truncated. + // Errors if the file was removed/rotated after reading and before + // calling the stat function + info, statErr := f.file.Stat() + if statErr != nil { + f.log.Error("Unexpected error reading from %s; error: %s", f.file.Name(), statErr) + return statErr + } + + // check if file was truncated + if info.Size() < f.offset { + f.log.Debugf("File was truncated as offset (%d) > size (%d): %s", f.offset, info.Size(), f.file.Name()) + return ErrFileTruncate + } + + return nil +} + +// Close +func (f *logFile) Close() error { + f.cancelReading() + return f.file.Close() +} From 01dfa5e16eaccb2d650b89ddc5e724884f3e6c7f Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 14:15:28 +0100 Subject: [PATCH 05/21] [CI] changeset from #20603 was not added to CI2.0 (#21464) --- Jenkinsfile.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile.yml b/Jenkinsfile.yml index 2f720bf055b..2278ea93735 100644 --- a/Jenkinsfile.yml +++ b/Jenkinsfile.yml @@ -28,11 +28,13 @@ changeset: - "^\\.ci/scripts/.*" oss: - "^go.mod" + - "^pytest.ini" - "^dev-tools/.*" - "^libbeat/.*" - "^testing/.*" xpack: - "^go.mod" + - "^pytest.ini" - "^dev-tools/.*" - "^libbeat/.*" - "^testing/.*" From 35a76dfe2c3caa19969fde4484792355077b58e2 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 14:16:06 +0100 Subject: [PATCH 06/21] [CI] Change x-pack/auditbeat build events (comments, labels) (#21463) --- x-pack/auditbeat/Jenkinsfile.yml | 8 ++++---- x-pack/packetbeat/Jenkinsfile.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x-pack/auditbeat/Jenkinsfile.yml b/x-pack/auditbeat/Jenkinsfile.yml index fd73c10a1c5..3bb96fbbc64 100644 --- a/x-pack/auditbeat/Jenkinsfile.yml +++ b/x-pack/auditbeat/Jenkinsfile.yml @@ -5,11 +5,11 @@ when: - "@ci" ## special token regarding the changeset for the ci - "@xpack" ## special token regarding the changeset for the xpack comments: ## when PR comment contains any of those entries - - "/test auditbeat" + - "/test x-pack/auditbeat" labels: ## when PR labels matches any of those entries - - "auditbeat" + - "x-pack-auditbeat" parameters: ## when parameter was selected in the UI. - - "auditbeat" + - "x-pack-auditbeat" tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: @@ -22,7 +22,7 @@ stages: - "macosx" when: ## Override the top-level when. comments: - - "/test auditbeat for macos" + - "/test x-pack/auditbeat for macos" labels: - "macOS" parameters: diff --git a/x-pack/packetbeat/Jenkinsfile.yml b/x-pack/packetbeat/Jenkinsfile.yml index 8496265e0ac..41257081e1f 100644 --- a/x-pack/packetbeat/Jenkinsfile.yml +++ b/x-pack/packetbeat/Jenkinsfile.yml @@ -1,15 +1,15 @@ when: branches: true ## for all the branches changeset: ## when PR contains any of those entries in the changeset - - "^x-pack/winlogbeat/.*" + - "^x-pack/packetbeat/.*" - "@ci" ## special token regarding the changeset for the ci - "@xpack" ## special token regarding the changeset for the xpack comments: ## when PR comment contains any of those entries - - "/test x-pack/winlogbeat" + - "/test x-pack/packetbeat" labels: ## when PR labels matches any of those entries - - "x-pack-winlogbeat" + - "x-pack-packetbeat" parameters: ## when parameter was selected in the UI. - - "x-pack-winlogbeat" + - "x-pack-packetbeat" tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: From 39e144dd05fab2310e1c5f3a63c9cfe68e6bf2cf Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Fri, 2 Oct 2020 19:20:53 +0200 Subject: [PATCH 07/21] Fix format of debug messages in tlscommon (#21482) --- libbeat/common/transport/tlscommon/tls.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libbeat/common/transport/tlscommon/tls.go b/libbeat/common/transport/tlscommon/tls.go index 3616a9f07e4..ba44310727c 100644 --- a/libbeat/common/transport/tlscommon/tls.go +++ b/libbeat/common/transport/tlscommon/tls.go @@ -66,7 +66,7 @@ func LoadCertificate(config *CertificateConfig) (*tls.Certificate, error) { return nil, err } - log.Debugf("tls", "loading certificate: %v and key %v", certificate, key) + log.Debugf("Loading certificate: %v and key %v", certificate, key) return &cert, nil } @@ -169,7 +169,7 @@ func LoadCertificateAuthorities(CAs []string) (*x509.CertPool, []error) { errors = append(errors, fmt.Errorf("%v adding %v to the list of known CAs", ErrNotACertificate, r)) continue } - log.Debugf("tls", "successfully loaded CA certificate: %v", r) + log.Debugf("Successfully loaded CA certificate: %v", r) } return roots, errors From bcb8da063f4dfe68c6ce413a7e7494a7a429ab8e Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 18:29:22 +0100 Subject: [PATCH 08/21] Revert "Revert "[JJBB] Set shallow cloning to 10 (#21409)" (#21447)" (#21467) This reverts commit 514809a13cd078be71c0bccac03dccc0cc81f0e9. --- .ci/jobs/apm-beats-update.yml | 2 +- .ci/jobs/beats-tester.yml | 2 +- .ci/jobs/beats-windows-mbp.yml | 2 +- .ci/jobs/beats.yml | 2 +- .ci/jobs/golang-crossbuild-mbp.yml | 2 +- .ci/jobs/packaging.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.ci/jobs/apm-beats-update.yml b/.ci/jobs/apm-beats-update.yml index 8bdc322f65a..2ae688ffab7 100644 --- a/.ci/jobs/apm-beats-update.yml +++ b/.ci/jobs/apm-beats-update.yml @@ -48,7 +48,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-tester.yml b/.ci/jobs/beats-tester.yml index 522abfa5e5c..808123a225e 100644 --- a/.ci/jobs/beats-tester.yml +++ b/.ci/jobs/beats-tester.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-windows-mbp.yml b/.ci/jobs/beats-windows-mbp.yml index 64efa009979..7ea26c9ba18 100644 --- a/.ci/jobs/beats-windows-mbp.yml +++ b/.ci/jobs/beats-windows-mbp.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 4 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats.yml b/.ci/jobs/beats.yml index b075d8bbdf2..6f59a9bcdf8 100644 --- a/.ci/jobs/beats.yml +++ b/.ci/jobs/beats.yml @@ -46,7 +46,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/golang-crossbuild-mbp.yml b/.ci/jobs/golang-crossbuild-mbp.yml index 46303790610..45175d169f6 100644 --- a/.ci/jobs/golang-crossbuild-mbp.yml +++ b/.ci/jobs/golang-crossbuild-mbp.yml @@ -31,7 +31,7 @@ before: true prune: true shallow-clone: true - depth: 4 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/packaging.yml b/.ci/jobs/packaging.yml index 0dce4d4672b..fd6fb9f90c6 100644 --- a/.ci/jobs/packaging.yml +++ b/.ci/jobs/packaging.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false From b0236ee8afacb87e47a98ab075b2b189e5911ff1 Mon Sep 17 00:00:00 2001 From: Fae Charlton Date: Fri, 2 Oct 2020 16:30:06 -0400 Subject: [PATCH 09/21] [libbeat] Add configurable exponential backoff for disk queue write errors (#21493) --- libbeat/publisher/queue/diskqueue/config.go | 52 +++++++++++++++++-- .../publisher/queue/diskqueue/deleter_loop.go | 9 +++- libbeat/publisher/queue/diskqueue/segments.go | 9 +++- libbeat/publisher/queue/diskqueue/util.go | 22 ++++++-- .../publisher/queue/diskqueue/writer_loop.go | 28 ++++++++-- 5 files changed, 104 insertions(+), 16 deletions(-) diff --git a/libbeat/publisher/queue/diskqueue/config.go b/libbeat/publisher/queue/diskqueue/config.go index 6a165a665db..b8ef456d03d 100644 --- a/libbeat/publisher/queue/diskqueue/config.go +++ b/libbeat/publisher/queue/diskqueue/config.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "path/filepath" + "time" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/common/cfgtype" @@ -61,16 +62,26 @@ type Settings struct { // A listener that should be sent ACKs when an event is successfully // written to disk. WriteToDiskListener queue.ACKListener + + // RetryInterval specifies how long to wait before retrying a fatal error + // writing to disk. If MaxRetryInterval is nonzero, subsequent retries will + // use exponential backoff up to the specified limit. + RetryInterval time.Duration + MaxRetryInterval time.Duration } // userConfig holds the parameters for a disk queue that are configurable // by the end user in the beats yml file. type userConfig struct { - Path string `config:"path"` - MaxSize cfgtype.ByteSize `config:"max_size" validate:"required"` - SegmentSize *cfgtype.ByteSize `config:"segment_size"` - ReadAheadLimit *int `config:"read_ahead"` - WriteAheadLimit *int `config:"write_ahead"` + Path string `config:"path"` + MaxSize cfgtype.ByteSize `config:"max_size" validate:"required"` + SegmentSize *cfgtype.ByteSize `config:"segment_size"` + + ReadAheadLimit *int `config:"read_ahead"` + WriteAheadLimit *int `config:"write_ahead"` + + RetryInterval *time.Duration `config:"retry_interval" validate:"positive"` + MaxRetryInterval *time.Duration `config:"max_retry_interval" validate:"positive"` } func (c *userConfig) Validate() error { @@ -96,6 +107,13 @@ func (c *userConfig) Validate() error { "Disk queue segment_size (%d) cannot be less than 1MB", *c.SegmentSize) } + if c.RetryInterval != nil && c.MaxRetryInterval != nil && + *c.MaxRetryInterval < *c.RetryInterval { + return fmt.Errorf( + "Disk queue max_retry_interval (%v) can't be less than retry_interval (%v)", + *c.MaxRetryInterval, *c.RetryInterval) + } + return nil } @@ -108,6 +126,9 @@ func DefaultSettings() Settings { ReadAheadLimit: 512, WriteAheadLimit: 2048, + + RetryInterval: 1 * time.Second, + MaxRetryInterval: 30 * time.Second, } } @@ -137,6 +158,13 @@ func SettingsForUserConfig(config *common.Config) (Settings, error) { settings.WriteAheadLimit = *userConfig.WriteAheadLimit } + if userConfig.RetryInterval != nil { + settings.RetryInterval = *userConfig.RetryInterval + } + if userConfig.MaxRetryInterval != nil { + settings.MaxRetryInterval = *userConfig.RetryInterval + } + return settings, nil } @@ -164,3 +192,17 @@ func (settings Settings) segmentPath(segmentID segmentID) string { func (settings Settings) maxSegmentOffset() segmentOffset { return segmentOffset(settings.MaxSegmentSize - segmentHeaderSize) } + +// Given a retry interval, nextRetryInterval returns the next higher level +// of backoff. +func (settings Settings) nextRetryInterval( + currentInterval time.Duration, +) time.Duration { + if settings.MaxRetryInterval > 0 { + currentInterval *= 2 + if currentInterval > settings.MaxRetryInterval { + currentInterval = settings.MaxRetryInterval + } + } + return currentInterval +} diff --git a/libbeat/publisher/queue/diskqueue/deleter_loop.go b/libbeat/publisher/queue/diskqueue/deleter_loop.go index 4e685285948..3948d200cbc 100644 --- a/libbeat/publisher/queue/diskqueue/deleter_loop.go +++ b/libbeat/publisher/queue/diskqueue/deleter_loop.go @@ -57,6 +57,7 @@ func newDeleterLoop(settings Settings) *deleterLoop { } func (dl *deleterLoop) run() { + currentRetryInterval := dl.settings.RetryInterval for { request, ok := <-dl.requestChan if !ok { @@ -87,10 +88,14 @@ func (dl *deleterLoop) run() { // The delay can be interrupted if the request channel is closed, // indicating queue shutdown. select { - // TODO: make the retry interval configurable. - case <-time.After(time.Second): + case <-time.After(currentRetryInterval): case <-dl.requestChan: } + currentRetryInterval = + dl.settings.nextRetryInterval(currentRetryInterval) + } else { + // If we made progress, reset the retry interval. + currentRetryInterval = dl.settings.RetryInterval } dl.responseChan <- deleterLoopResponse{ results: results, diff --git a/libbeat/publisher/queue/diskqueue/segments.go b/libbeat/publisher/queue/diskqueue/segments.go index 5ce0dc49962..617b089110e 100644 --- a/libbeat/publisher/queue/diskqueue/segments.go +++ b/libbeat/publisher/queue/diskqueue/segments.go @@ -207,10 +207,15 @@ func (segment *queueSegment) getWriter( // retry callback returns true. This is used for timed retries when // creating a queue segment from the writer loop. func (segment *queueSegment) getWriterWithRetry( - queueSettings Settings, retry func(error) bool, + queueSettings Settings, retry func(err error, firstTime bool) bool, ) (*os.File, error) { + firstTime := true file, err := segment.getWriter(queueSettings) - for err != nil && retry(err) { + for err != nil && retry(err, firstTime) { + // Set firstTime to false so the retry callback can perform backoff + // etc if needed. + firstTime = false + // Try again file, err = segment.getWriter(queueSettings) } diff --git a/libbeat/publisher/queue/diskqueue/util.go b/libbeat/publisher/queue/diskqueue/util.go index 60c529a9992..c54a26154e8 100644 --- a/libbeat/publisher/queue/diskqueue/util.go +++ b/libbeat/publisher/queue/diskqueue/util.go @@ -69,16 +69,32 @@ func writeErrorIsRetriable(err error) bool { // "wrapped" field in-place as long as it isn't captured by the callback. type callbackRetryWriter struct { wrapped io.Writer - retry func(error) bool + + // The retry callback is called with the error that was produced and whether + // this is the first (subsequent) error arising from this particular + // write call. + retry func(err error, firstTime bool) bool } func (w callbackRetryWriter) Write(p []byte) (int, error) { + // firstTime tracks whether the current error is the first subsequent error + // being passed to the retry callback. This is so that the callback can + // reset its internal counters in case it is using exponential backoff or + // a retry limit. + firstTime := true bytesWritten := 0 writer := w.wrapped n, err := writer.Write(p) for n < len(p) { - if err != nil && !w.retry(err) { - return bytesWritten + n, err + if err != nil { + shouldRetry := w.retry(err, firstTime) + firstTime = false + if !shouldRetry { + return bytesWritten + n, err + } + } else { + // If we made progress without an error, reset firstTime. + firstTime = true } // Advance p and try again. bytesWritten += n diff --git a/libbeat/publisher/queue/diskqueue/writer_loop.go b/libbeat/publisher/queue/diskqueue/writer_loop.go index b42e4573cab..ff1ff97616a 100644 --- a/libbeat/publisher/queue/diskqueue/writer_loop.go +++ b/libbeat/publisher/queue/diskqueue/writer_loop.go @@ -82,6 +82,8 @@ type writerLoop struct { // The file handle corresponding to currentSegment. When currentSegment // changes, this handle is closed and a new one is created. outputFile *os.File + + currentRetryInterval time.Duration } func newWriterLoop(logger *logp.Logger, settings Settings) *writerLoop { @@ -91,6 +93,8 @@ func newWriterLoop(logger *logp.Logger, settings Settings) *writerLoop { requestChan: make(chan writerLoopRequest, 1), responseChan: make(chan writerLoopResponse), + + currentRetryInterval: settings.RetryInterval, } } @@ -215,14 +219,31 @@ outerLoop: return append(bytesWritten, curBytesWritten) } -// retryCallback is called (by way of retryCallbackWriter) when there is +func (wl *writerLoop) applyRetryBackoff() { + wl.currentRetryInterval = + wl.settings.nextRetryInterval(wl.currentRetryInterval) +} + +func (wl *writerLoop) resetRetryBackoff() { + wl.currentRetryInterval = wl.settings.RetryInterval +} + +// retryCallback is called (by way of callbackRetryWriter) when there is // an error writing to a segment file. It pauses for a configurable // interval and returns true if the operation should be retried (which // it always should, unless the queue is being closed). -func (wl *writerLoop) retryCallback(err error) bool { +func (wl *writerLoop) retryCallback(err error, firstTime bool) bool { + if firstTime { + // Reset any exponential backoff in the retry interval. + wl.resetRetryBackoff() + } if writeErrorIsRetriable(err) { return true } + // If this error isn't immediately retriable, increase the exponential + // backoff afterwards. + defer wl.applyRetryBackoff() + // If the error is not immediately retriable, log the error // and wait for the retry interval before trying again, but // abort if the queue is closed (indicated by the request channel @@ -230,8 +251,7 @@ func (wl *writerLoop) retryCallback(err error) bool { wl.logger.Errorf("Writing to segment %v: %v", wl.currentSegment.id, err) select { - case <-time.After(time.Second): - // TODO: use a configurable interval here + case <-time.After(wl.currentRetryInterval): return true case <-wl.requestChan: return false From 7e36f5c6b7507b4d124db561771d886dc0994b38 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Fri, 2 Oct 2020 15:08:30 -0600 Subject: [PATCH 10/21] Migrate S3 Input to Filebeat Input V2 (#20005) *moving s3 input to v2 input API Co-authored-by: urso --- CHANGELOG.next.asciidoc | 1 + .../filebeat/input/default-inputs/inputs.go | 2 + x-pack/filebeat/input/s3/collector.go | 635 +++++++++++++++ .../s3/{input_test.go => collector_test.go} | 12 +- x-pack/filebeat/input/s3/config.go | 17 +- x-pack/filebeat/input/s3/input.go | 766 ++---------------- .../filebeat/input/s3/s3_integration_test.go | 302 ++----- 7 files changed, 797 insertions(+), 938 deletions(-) create mode 100644 x-pack/filebeat/input/s3/collector.go rename x-pack/filebeat/input/s3/{input_test.go => collector_test.go} (97%) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index a96a23db9d8..fb1fae91eb0 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -603,6 +603,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Always attempt community_id processor on zeek module {pull}21155[21155] - Add related.hosts ecs field to all modules {pull}21160[21160] - Keep cursor state between httpjson input restarts {pull}20751[20751] +- Convert aws s3 to v2 input {pull}20005[20005] *Heartbeat* diff --git a/x-pack/filebeat/input/default-inputs/inputs.go b/x-pack/filebeat/input/default-inputs/inputs.go index cd8562560da..4779b452f1d 100644 --- a/x-pack/filebeat/input/default-inputs/inputs.go +++ b/x-pack/filebeat/input/default-inputs/inputs.go @@ -14,6 +14,7 @@ import ( "github.com/elastic/beats/v7/x-pack/filebeat/input/http_endpoint" "github.com/elastic/beats/v7/x-pack/filebeat/input/httpjson" "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit" + "github.com/elastic/beats/v7/x-pack/filebeat/input/s3" ) func Init(info beat.Info, log *logp.Logger, store beater.StateStore) []v2.Plugin { @@ -29,5 +30,6 @@ func xpackInputs(info beat.Info, log *logp.Logger, store beater.StateStore) []v2 http_endpoint.Plugin(), httpjson.Plugin(log, store), o365audit.Plugin(log, store), + s3.Plugin(), } } diff --git a/x-pack/filebeat/input/s3/collector.go b/x-pack/filebeat/input/s3/collector.go new file mode 100644 index 00000000000..2976dd52a5b --- /dev/null +++ b/x-pack/filebeat/input/s3/collector.go @@ -0,0 +1,635 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package s3 + +import ( + "bufio" + "compress/gzip" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "sync" + "time" + + awssdk "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/awserr" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/s3iface" + "github.com/aws/aws-sdk-go-v2/service/sqs" + "github.com/aws/aws-sdk-go-v2/service/sqs/sqsiface" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/unison" +) + +type s3Collector struct { + cancellation context.Context + logger *logp.Logger + + config *config + visibilityTimeout int64 + + sqs sqsiface.ClientAPI + s3 s3iface.ClientAPI + publisher beat.Client +} + +type s3Info struct { + name string + key string + region string + arn string + expandEventListFromField string +} + +type bucket struct { + Name string `json:"name"` + Arn string `json:"arn"` +} + +type object struct { + Key string `json:"key"` +} + +type s3BucketObject struct { + bucket `json:"bucket"` + object `json:"object"` +} + +type sqsMessage struct { + Records []struct { + EventSource string `json:"eventSource"` + AwsRegion string `json:"awsRegion"` + EventName string `json:"eventName"` + S3 s3BucketObject `json:"s3"` + } `json:"Records"` +} + +type s3Context struct { + mux sync.Mutex + refs int + err error // first error witnessed or multi error + errC chan error +} + +var ( + // The maximum number of messages to return. Amazon SQS never returns more messages + // than this value (however, fewer messages might be returned). + maxNumberOfMessage uint8 = 10 + + // The duration (in seconds) for which the call waits for a message to arrive + // in the queue before returning. If a message is available, the call returns + // sooner than WaitTimeSeconds. If no messages are available and the wait time + // expires, the call returns successfully with an empty list of messages. + waitTimeSecond uint8 = 10 +) + +func (c *s3Collector) run() { + defer c.logger.Info("s3 input worker has stopped.") + c.logger.Info("s3 input worker has started.") + for c.cancellation.Err() == nil { + // receive messages from sqs + output, err := c.receiveMessage(c.sqs, c.visibilityTimeout) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { + continue + } + c.logger.Error("SQS ReceiveMessageRequest failed: ", err) + continue + } + + if output == nil || len(output.Messages) == 0 { + c.logger.Debug("no message received from SQS") + continue + } + + // process messages received from sqs, get logs from s3 and create events + c.processor(c.config.QueueURL, output.Messages, c.visibilityTimeout, c.s3, c.sqs) + } +} + +func (c *s3Collector) processor(queueURL string, messages []sqs.Message, visibilityTimeout int64, svcS3 s3iface.ClientAPI, svcSQS sqsiface.ClientAPI) { + var grp unison.MultiErrGroup + numMessages := len(messages) + c.logger.Debugf("Processing %v messages", numMessages) + + // process messages received from sqs + for i := range messages { + i := i + errC := make(chan error) + grp.Go(func() (err error) { + return c.processMessage(svcS3, messages[i], errC) + }) + grp.Go(func() (err error) { + return c.processorKeepAlive(svcSQS, messages[i], queueURL, visibilityTimeout, errC) + }) + } + grp.Wait() +} + +func (c *s3Collector) processMessage(svcS3 s3iface.ClientAPI, message sqs.Message, errC chan error) error { + s3Infos, err := c.handleSQSMessage(message) + if err != nil { + c.logger.Error(fmt.Errorf("handleSQSMessage failed: %w", err)) + return err + } + c.logger.Debugf("handleSQSMessage succeed and returned %v sets of S3 log info", len(s3Infos)) + + // read from s3 object and create event for each log line + err = c.handleS3Objects(svcS3, s3Infos, errC) + if err != nil { + err = fmt.Errorf("handleS3Objects failed: %w", err) + c.logger.Error(err) + return err + } + c.logger.Debugf("handleS3Objects succeed") + return nil +} + +func (c *s3Collector) processorKeepAlive(svcSQS sqsiface.ClientAPI, message sqs.Message, queueURL string, visibilityTimeout int64, errC chan error) error { + for { + select { + case <-c.cancellation.Done(): + return nil + case err := <-errC: + if err != nil { + c.logger.Warn("Processing message failed, updating visibility timeout") + err := c.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) + if err != nil { + c.logger.Error(fmt.Errorf("SQS ChangeMessageVisibilityRequest failed: %w", err)) + } + c.logger.Infof("Message visibility timeout updated to %v", visibilityTimeout) + } else { + // When ACK done, message will be deleted. Or when message is + // not s3 ObjectCreated event related(handleSQSMessage function + // failed), it will be removed as well. + c.logger.Debug("Deleting message from SQS: ", *message.MessageId) + // only delete sqs message when errC is closed with no error + err := c.deleteMessage(queueURL, *message.ReceiptHandle, svcSQS) + if err != nil { + c.logger.Error(fmt.Errorf("deleteMessages failed: %w", err)) + } + } + return err + case <-time.After(time.Duration(visibilityTimeout/2) * time.Second): + c.logger.Warn("Half of the set visibilityTimeout passed, visibility timeout needs to be updated") + // If half of the set visibilityTimeout passed and this is + // still ongoing, then change visibility timeout. + err := c.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) + if err != nil { + c.logger.Error(fmt.Errorf("SQS ChangeMessageVisibilityRequest failed: %w", err)) + } + c.logger.Infof("Message visibility timeout updated to %v seconds", visibilityTimeout) + return err + } + } +} + +func (c *s3Collector) receiveMessage(svcSQS sqsiface.ClientAPI, visibilityTimeout int64) (*sqs.ReceiveMessageResponse, error) { + // receive messages from sqs + req := svcSQS.ReceiveMessageRequest( + &sqs.ReceiveMessageInput{ + QueueUrl: &c.config.QueueURL, + MessageAttributeNames: []string{"All"}, + MaxNumberOfMessages: awssdk.Int64(int64(maxNumberOfMessage)), + VisibilityTimeout: &visibilityTimeout, + WaitTimeSeconds: awssdk.Int64(int64(waitTimeSecond)), + }) + + // The Context will interrupt the request if the timeout expires. + sendCtx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + return req.Send(sendCtx) +} + +func (c *s3Collector) changeVisibilityTimeout(queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI, receiptHandle *string) error { + req := svcSQS.ChangeMessageVisibilityRequest(&sqs.ChangeMessageVisibilityInput{ + QueueUrl: &queueURL, + VisibilityTimeout: &visibilityTimeout, + ReceiptHandle: receiptHandle, + }) + + // The Context will interrupt the request if the timeout expires. + sendCtx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + _, err := req.Send(sendCtx) + return err +} + +func getRegionFromQueueURL(queueURL string) (string, error) { + // get region from queueURL + // Example: https://sqs.us-east-1.amazonaws.com/627959692251/test-s3-logs + queueURLSplit := strings.Split(queueURL, ".") + if queueURLSplit[0] == "https://sqs" && queueURLSplit[2] == "amazonaws" { + return queueURLSplit[1], nil + } + return "", fmt.Errorf("queueURL is not in format: https://sqs.{REGION_ENDPOINT}.amazonaws.com/{ACCOUNT_NUMBER}/{QUEUE_NAME}") +} + +// handle message +func (c *s3Collector) handleSQSMessage(m sqs.Message) ([]s3Info, error) { + msg := sqsMessage{} + err := json.Unmarshal([]byte(*m.Body), &msg) + if err != nil { + return nil, fmt.Errorf("json unmarshal sqs message body failed: %w", err) + } + + var s3Infos []s3Info + for _, record := range msg.Records { + if record.EventSource != "aws:s3" || !strings.HasPrefix(record.EventName, "ObjectCreated:") { + return nil, fmt.Errorf("this SQS queue should be dedicated to s3 ObjectCreated event notifications") + } + // Unescape substrings from s3 log name. For example, convert "%3D" back to "=" + filename, err := url.QueryUnescape(record.S3.object.Key) + if err != nil { + return nil, fmt.Errorf("url.QueryUnescape failed for '%s': %w", record.S3.object.Key, err) + } + + if len(c.config.FileSelectors) == 0 { + s3Infos = append(s3Infos, s3Info{ + region: record.AwsRegion, + name: record.S3.bucket.Name, + key: filename, + arn: record.S3.bucket.Arn, + expandEventListFromField: c.config.ExpandEventListFromField, + }) + continue + } + + for _, fs := range c.config.FileSelectors { + if fs.Regex == nil { + continue + } + if fs.Regex.MatchString(filename) { + s3Infos = append(s3Infos, s3Info{ + region: record.AwsRegion, + name: record.S3.bucket.Name, + key: filename, + arn: record.S3.bucket.Arn, + expandEventListFromField: fs.ExpandEventListFromField, + }) + break + } + } + } + return s3Infos, nil +} + +func (c *s3Collector) handleS3Objects(svc s3iface.ClientAPI, s3Infos []s3Info, errC chan error) error { + s3Ctx := &s3Context{ + refs: 1, + errC: errC, + } + defer s3Ctx.done() + + for _, info := range s3Infos { + c.logger.Debugf("Processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) + err := c.createEventsFromS3Info(svc, info, s3Ctx) + if err != nil { + err = fmt.Errorf("createEventsFromS3Info failed processing file from s3 bucket \"%s\" with name \"%s\": %w", info.name, info.key, err) + c.logger.Error(err) + s3Ctx.setError(err) + } + } + return nil +} + +func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, s3Ctx *s3Context) error { + objectHash := s3ObjectHash(info) + + // Download the S3 object using GetObjectRequest. + s3GetObjectInput := &s3.GetObjectInput{ + Bucket: awssdk.String(info.name), + Key: awssdk.String(info.key), + } + req := svc.GetObjectRequest(s3GetObjectInput) + + // The Context will interrupt the request if the timeout expires. + ctx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + resp, err := req.Send(ctx) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok { + // If the SDK can determine the request or retry delay was canceled + // by a context the ErrCodeRequestCanceled error will be returned. + if awsErr.Code() == awssdk.ErrCodeRequestCanceled { + err = fmt.Errorf("s3 GetObjectRequest canceled for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + c.logger.Error(err) + return err + } + + if awsErr.Code() == "NoSuchKey" { + c.logger.Warnf("Cannot find s3 file '%s' from S3 bucket '%s'", info.key, info.name) + return nil + } + } + return fmt.Errorf("s3 GetObjectRequest failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + } + + defer resp.Body.Close() + + reader := bufio.NewReader(resp.Body) + + isS3ObjGzipped, err := isStreamGzipped(reader) + if err != nil { + err = fmt.Errorf("could not determine if S3 object is gzipped: %w", err) + c.logger.Error(err) + return err + } + + if isS3ObjGzipped { + gzipReader, err := gzip.NewReader(reader) + if err != nil { + err = fmt.Errorf("gzip.NewReader failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + c.logger.Error(err) + return err + } + reader = bufio.NewReader(gzipReader) + gzipReader.Close() + } + + // Decode JSON documents when content-type is "application/json" or expand_event_list_from_field is given in config + if resp.ContentType != nil && *resp.ContentType == "application/json" || info.expandEventListFromField != "" { + decoder := json.NewDecoder(reader) + err := c.decodeJSON(decoder, objectHash, info, s3Ctx) + if err != nil { + err = fmt.Errorf("decodeJSONWithKey failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + c.logger.Error(err) + return err + } + return nil + } + + // handle s3 objects that are not json content-type + offset := 0 + for { + log, err := readStringAndTrimDelimiter(reader) + if err == io.EOF { + // create event for last line + offset += len([]byte(log)) + event := createEvent(log, offset, info, objectHash, s3Ctx) + err = c.forwardEvent(event) + if err != nil { + err = fmt.Errorf("forwardEvent failed: %w", err) + c.logger.Error(err) + return err + } + return nil + } else if err != nil { + err = fmt.Errorf("readStringAndTrimDelimiter failed: %w", err) + c.logger.Error(err) + return err + } + + if log == "" { + break + } + + // create event per log line + offset += len([]byte(log)) + event := createEvent(log, offset, info, objectHash, s3Ctx) + err = c.forwardEvent(event) + if err != nil { + err = fmt.Errorf("forwardEvent failed: %w", err) + c.logger.Error(err) + return err + } + } + return nil +} + +func (c *s3Collector) decodeJSON(decoder *json.Decoder, objectHash string, s3Info s3Info, s3Ctx *s3Context) error { + offset := 0 + for { + var jsonFields interface{} + err := decoder.Decode(&jsonFields) + if jsonFields == nil { + return nil + } + + if err == io.EOF { + offsetNew, err := c.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) + if err != nil { + return err + } + offset = offsetNew + } else if err != nil { + // decode json failed, skip this log file + err = fmt.Errorf("decode json failed for '%s' from S3 bucket '%s', skipping this file: %w", s3Info.key, s3Info.name, err) + c.logger.Warn(err) + return nil + } + + offset, err = c.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) + if err != nil { + return err + } + } +} + +func (c *s3Collector) jsonFieldsType(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { + switch f := jsonFields.(type) { + case map[string][]interface{}: + if s3Info.expandEventListFromField != "" { + textValues, ok := f[s3Info.expandEventListFromField] + if !ok { + err := fmt.Errorf("key '%s' not found", s3Info.expandEventListFromField) + c.logger.Error(err) + return offset, err + } + for _, v := range textValues { + offset, err := c.convertJSONToEvent(v, offset, objectHash, s3Info, s3Ctx) + if err != nil { + err = fmt.Errorf("convertJSONToEvent failed for '%s' from S3 bucket '%s': %w", s3Info.key, s3Info.name, err) + c.logger.Error(err) + return offset, err + } + } + return offset, nil + } + case map[string]interface{}: + if s3Info.expandEventListFromField != "" { + textValues, ok := f[s3Info.expandEventListFromField] + if !ok { + err := fmt.Errorf("key '%s' not found", s3Info.expandEventListFromField) + c.logger.Error(err) + return offset, err + } + + valuesConverted := textValues.([]interface{}) + for _, textValue := range valuesConverted { + offsetNew, err := c.convertJSONToEvent(textValue, offset, objectHash, s3Info, s3Ctx) + if err != nil { + err = fmt.Errorf("convertJSONToEvent failed for '%s' from S3 bucket '%s': %w", s3Info.key, s3Info.name, err) + c.logger.Error(err) + return offset, err + } + offset = offsetNew + } + return offset, nil + } + + offset, err := c.convertJSONToEvent(f, offset, objectHash, s3Info, s3Ctx) + if err != nil { + err = fmt.Errorf("convertJSONToEvent failed for '%s' from S3 bucket '%s': %w", s3Info.key, s3Info.name, err) + c.logger.Error(err) + return offset, err + } + return offset, nil + } + return offset, nil +} + +func (c *s3Collector) convertJSONToEvent(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { + vJSON, _ := json.Marshal(jsonFields) + logOriginal := string(vJSON) + log := trimLogDelimiter(logOriginal) + offset += len([]byte(log)) + event := createEvent(log, offset, s3Info, objectHash, s3Ctx) + + err := c.forwardEvent(event) + if err != nil { + err = fmt.Errorf("forwardEvent failed: %w", err) + c.logger.Error(err) + return offset, err + } + return offset, nil +} + +func (c *s3Collector) forwardEvent(event beat.Event) error { + c.publisher.Publish(event) + return c.cancellation.Err() +} + +func (c *s3Collector) deleteMessage(queueURL string, messagesReceiptHandle string, svcSQS sqsiface.ClientAPI) error { + deleteMessageInput := &sqs.DeleteMessageInput{ + QueueUrl: awssdk.String(queueURL), + ReceiptHandle: awssdk.String(messagesReceiptHandle), + } + + req := svcSQS.DeleteMessageRequest(deleteMessageInput) + + // The Context will interrupt the request if the timeout expires. + ctx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + _, err := req.Send(ctx) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { + return nil + } + return fmt.Errorf("SQS DeleteMessageRequest failed: %w", err) + } + return nil +} + +func trimLogDelimiter(log string) string { + return strings.TrimSuffix(log, "\n") +} + +func readStringAndTrimDelimiter(reader *bufio.Reader) (string, error) { + logOriginal, err := reader.ReadString('\n') + if err != nil { + return logOriginal, err + } + return trimLogDelimiter(logOriginal), nil +} + +func createEvent(log string, offset int, info s3Info, objectHash string, s3Ctx *s3Context) beat.Event { + s3Ctx.Inc() + + event := beat.Event{ + Timestamp: time.Now().UTC(), + Fields: common.MapStr{ + "message": log, + "log": common.MapStr{ + "offset": int64(offset), + "file.path": constructObjectURL(info), + }, + "aws": common.MapStr{ + "s3": common.MapStr{ + "bucket": common.MapStr{ + "name": info.name, + "arn": info.arn}, + "object.key": info.key, + }, + }, + "cloud": common.MapStr{ + "provider": "aws", + "region": info.region, + }, + }, + Private: s3Ctx, + } + event.SetID(objectHash + "-" + fmt.Sprintf("%012d", offset)) + + return event +} + +func constructObjectURL(info s3Info) string { + return "https://" + info.name + ".s3-" + info.region + ".amazonaws.com/" + info.key +} + +// s3ObjectHash returns a short sha256 hash of the bucket arn + object key name. +func s3ObjectHash(s3Info s3Info) string { + h := sha256.New() + h.Write([]byte(s3Info.arn + s3Info.key)) + prefix := hex.EncodeToString(h.Sum(nil)) + return prefix[:10] +} + +func (c *s3Context) setError(err error) { + // only care about the last error for now + // TODO: add "Typed" error to error for context + c.mux.Lock() + defer c.mux.Unlock() + c.err = err +} + +func (c *s3Context) done() { + c.mux.Lock() + defer c.mux.Unlock() + c.refs-- + if c.refs == 0 { + c.errC <- c.err + close(c.errC) + } +} + +func (c *s3Context) Inc() { + c.mux.Lock() + defer c.mux.Unlock() + c.refs++ +} + +// isStreamGzipped determines whether the given stream of bytes (encapsulated in a buffered reader) +// represents gzipped content or not. A buffered reader is used so the function can peek into the byte +// stream without consuming it. This makes it convenient for code executed after this function call +// to consume the stream if it wants. +func isStreamGzipped(r *bufio.Reader) (bool, error) { + // Why 512? See https://godoc.org/net/http#DetectContentType + buf, err := r.Peek(512) + if err != nil && err != io.EOF { + return false, err + } + + switch http.DetectContentType(buf) { + case "application/x-gzip", "application/zip": + return true, nil + default: + return false, nil + } +} diff --git a/x-pack/filebeat/input/s3/input_test.go b/x-pack/filebeat/input/s3/collector_test.go similarity index 97% rename from x-pack/filebeat/input/s3/input_test.go rename to x-pack/filebeat/input/s3/collector_test.go index d1fab05cb3c..510f94d40d5 100644 --- a/x-pack/filebeat/input/s3/input_test.go +++ b/x-pack/filebeat/input/s3/collector_test.go @@ -120,7 +120,7 @@ func TestHandleMessage(t *testing.T) { }, } - p := &s3Input{context: &channelContext{}} + p := &s3Collector{config: &config{}} for _, c := range casesPositive { t.Run(c.title, func(t *testing.T) { s3Info, err := p.handleSQSMessage(c.message) @@ -165,7 +165,8 @@ func TestHandleMessage(t *testing.T) { } func TestNewS3BucketReader(t *testing.T) { - p := &s3Input{context: &channelContext{}} + config := defaultConfig() + p := &s3Collector{cancellation: context.TODO(), config: &config} s3GetObjectInput := &s3.GetObjectInput{ Bucket: awssdk.String(info.name), Key: awssdk.String(info.key), @@ -174,7 +175,7 @@ func TestNewS3BucketReader(t *testing.T) { // The Context will interrupt the request if the timeout expires. var cancelFn func() - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) + ctx, cancelFn := context.WithTimeout(p.cancellation, p.config.APITimeout) defer cancelFn() resp, err := req.Send(ctx) @@ -201,7 +202,8 @@ func TestNewS3BucketReader(t *testing.T) { } func TestCreateEvent(t *testing.T) { - p := &s3Input{context: &channelContext{}} + config := defaultConfig() + p := &s3Collector{cancellation: context.TODO(), config: &config} errC := make(chan error) s3Context := &s3Context{ refs: 1, @@ -225,7 +227,7 @@ func TestCreateEvent(t *testing.T) { // The Context will interrupt the request if the timeout expires. var cancelFn func() - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) + ctx, cancelFn := context.WithTimeout(p.cancellation, p.config.APITimeout) defer cancelFn() resp, err := req.Send(ctx) diff --git a/x-pack/filebeat/input/s3/config.go b/x-pack/filebeat/input/s3/config.go index f9780d82277..5f37a436d12 100644 --- a/x-pack/filebeat/input/s3/config.go +++ b/x-pack/filebeat/input/s3/config.go @@ -9,18 +9,16 @@ import ( "regexp" "time" - "github.com/elastic/beats/v7/filebeat/harvester" awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" ) type config struct { - harvester.ForwarderConfig `config:",inline"` - QueueURL string `config:"queue_url" validate:"nonzero,required"` - VisibilityTimeout time.Duration `config:"visibility_timeout"` - AwsConfig awscommon.ConfigAWS `config:",inline"` - ExpandEventListFromField string `config:"expand_event_list_from_field"` - APITimeout time.Duration `config:"api_timeout"` - FileSelectors []FileSelectorCfg `config:"file_selectors"` + QueueURL string `config:"queue_url" validate:"nonzero,required"` + VisibilityTimeout time.Duration `config:"visibility_timeout"` + AwsConfig awscommon.ConfigAWS `config:",inline"` + ExpandEventListFromField string `config:"expand_event_list_from_field"` + APITimeout time.Duration `config:"api_timeout"` + FileSelectors []FileSelectorCfg `config:"file_selectors"` } // FileSelectorCfg defines type and configuration of FileSelectors @@ -32,9 +30,6 @@ type FileSelectorCfg struct { func defaultConfig() config { return config{ - ForwarderConfig: harvester.ForwarderConfig{ - Type: "s3", - }, VisibilityTimeout: 300 * time.Second, APITimeout: 120 * time.Second, } diff --git a/x-pack/filebeat/input/s3/input.go b/x-pack/filebeat/input/s3/input.go index 83dc48428ee..a6b56d03970 100644 --- a/x-pack/filebeat/input/s3/input.go +++ b/x-pack/filebeat/input/s3/input.go @@ -5,748 +5,120 @@ package s3 import ( - "bufio" - "compress/gzip" - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" "fmt" - "io" - "net/http" - "net/url" - "strings" - "sync" - "time" - awssdk "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/aws/awserr" "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/s3iface" "github.com/aws/aws-sdk-go-v2/service/sqs" - "github.com/aws/aws-sdk-go-v2/service/sqs/sqsiface" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/filebeat/channel" - "github.com/elastic/beats/v7/filebeat/input" + v2 "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/common/acker" - "github.com/elastic/beats/v7/libbeat/common/cfgwarn" - "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/feature" awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" + "github.com/elastic/go-concert/ctxtool" ) const inputName = "s3" -var ( - // The maximum number of messages to return. Amazon SQS never returns more messages - // than this value (however, fewer messages might be returned). - maxNumberOfMessage int64 = 10 - - // The duration (in seconds) for which the call waits for a message to arrive - // in the queue before returning. If a message is available, the call returns - // sooner than WaitTimeSeconds. If no messages are available and the wait time - // expires, the call returns successfully with an empty list of messages. - waitTimeSecond int64 = 10 - - errOutletClosed = errors.New("input outlet closed") -) - -func init() { - err := input.Register(inputName, NewInput) - if err != nil { - panic(err) +func Plugin() v2.Plugin { + return v2.Plugin{ + Name: inputName, + Stability: feature.Beta, + Deprecated: false, + Info: "Collect logs from s3", + Manager: v2.ConfigureWith(configure), } } -// s3Input is a input for s3 -type s3Input struct { - outlet channel.Outleter // Output of received s3 logs. - config config - awsConfig awssdk.Config - logger *logp.Logger - close chan struct{} - workerOnce sync.Once // Guarantees that the worker goroutine is only started once. - context *channelContext - workerWg sync.WaitGroup // Waits on s3 worker goroutine. - stopOnce sync.Once -} - -type s3Info struct { - name string - key string - region string - arn string - expandEventListFromField string -} - -type bucket struct { - Name string `json:"name"` - Arn string `json:"arn"` -} - -type object struct { - Key string `json:"key"` -} - -type s3BucketObject struct { - bucket `json:"bucket"` - object `json:"object"` -} - -type sqsMessage struct { - Records []struct { - EventSource string `json:"eventSource"` - AwsRegion string `json:"awsRegion"` - EventName string `json:"eventName"` - S3 s3BucketObject `json:"s3"` - } `json:"Records"` -} - -type s3Context struct { - mux sync.Mutex - refs int - err error // first error witnessed or multi error - errC chan error -} - -// channelContext implements context.Context by wrapping a channel -type channelContext struct { - done <-chan struct{} -} - -func (c *channelContext) Deadline() (time.Time, bool) { return time.Time{}, false } -func (c *channelContext) Done() <-chan struct{} { return c.done } -func (c *channelContext) Err() error { - select { - case <-c.done: - return context.Canceled - default: - return nil - } -} -func (c *channelContext) Value(key interface{}) interface{} { return nil } - -// NewInput creates a new s3 input -func NewInput(cfg *common.Config, connector channel.Connector, context input.Context) (input.Input, error) { - cfgwarn.Beta("s3 input type is used") - logger := logp.NewLogger(inputName) - +func configure(cfg *common.Config) (v2.Input, error) { config := defaultConfig() if err := cfg.Unpack(&config); err != nil { - return nil, errors.Wrap(err, "failed unpacking config") - } - - out, err := connector.ConnectWith(cfg, beat.ClientConfig{ - ACKHandler: acker.ConnectionOnly( - acker.EventPrivateReporter(func(_ int, privates []interface{}) { - for _, private := range privates { - if s3Context, ok := private.(*s3Context); ok { - s3Context.done() - } - } - }), - ), - }) - if err != nil { return nil, err } - awsConfig, err := awscommon.GetAWSCredentials(config.AwsConfig) - if err != nil { - return nil, errors.Wrap(err, "getAWSCredentials failed") - } - - closeChannel := make(chan struct{}) - p := &s3Input{ - outlet: out, - config: config, - awsConfig: awsConfig, - logger: logger, - close: closeChannel, - context: &channelContext{closeChannel}, - } - return p, nil -} - -// Run runs the input -func (p *s3Input) Run() { - p.workerOnce.Do(func() { - visibilityTimeout := int64(p.config.VisibilityTimeout.Seconds()) - p.logger.Infof("visibility timeout is set to %v seconds", visibilityTimeout) - p.logger.Infof("aws api timeout is set to %v", p.config.APITimeout) - - regionName, err := getRegionFromQueueURL(p.config.QueueURL) - if err != nil { - p.logger.Errorf("failed to get region name from queueURL: %v", p.config.QueueURL) - } - - awsConfig := p.awsConfig.Copy() - awsConfig.Region = regionName - - svcSQS := sqs.New(awscommon.EnrichAWSConfigWithEndpoint(p.config.AwsConfig.Endpoint, "sqs", regionName, awsConfig)) - svcS3 := s3.New(awscommon.EnrichAWSConfigWithEndpoint(p.config.AwsConfig.Endpoint, "s3", regionName, awsConfig)) - - p.workerWg.Add(1) - go p.run(svcSQS, svcS3, visibilityTimeout) - }) -} - -func (p *s3Input) run(svcSQS sqsiface.ClientAPI, svcS3 s3iface.ClientAPI, visibilityTimeout int64) { - defer p.workerWg.Done() - defer p.logger.Infof("s3 input worker for '%v' has stopped.", p.config.QueueURL) - - p.logger.Infof("s3 input worker has started. with queueURL: %v", p.config.QueueURL) - for p.context.Err() == nil { - // receive messages from sqs - output, err := p.receiveMessage(svcSQS, visibilityTimeout) - if err != nil { - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { - continue - } - p.logger.Error("SQS ReceiveMessageRequest failed: ", err) - time.Sleep(time.Duration(waitTimeSecond) * time.Second) - continue - } - - if output == nil || len(output.Messages) == 0 { - p.logger.Debug("no message received from SQS:", p.config.QueueURL) - continue - } - - // process messages received from sqs, get logs from s3 and create events - p.processor(p.config.QueueURL, output.Messages, visibilityTimeout, svcS3, svcSQS) - } -} - -// Stop stops the s3 input -func (p *s3Input) Stop() { - p.stopOnce.Do(func() { - defer p.outlet.Close() - close(p.close) - p.logger.Info("Stopping s3 input") - }) -} - -// Wait stops the s3 input. -func (p *s3Input) Wait() { - p.Stop() - p.workerWg.Wait() -} - -func (p *s3Input) processor(queueURL string, messages []sqs.Message, visibilityTimeout int64, svcS3 s3iface.ClientAPI, svcSQS sqsiface.ClientAPI) { - var wg sync.WaitGroup - numMessages := len(messages) - p.logger.Debugf("Processing %v messages", numMessages) - wg.Add(numMessages * 2) - - // process messages received from sqs - for i := range messages { - errC := make(chan error) - go p.processMessage(svcS3, messages[i], &wg, errC) - go p.processorKeepAlive(svcSQS, messages[i], queueURL, visibilityTimeout, &wg, errC) - } - wg.Wait() + return newInput(config) } -func (p *s3Input) processMessage(svcS3 s3iface.ClientAPI, message sqs.Message, wg *sync.WaitGroup, errC chan error) { - defer wg.Done() - - s3Infos, err := p.handleSQSMessage(message) - if err != nil { - p.logger.Error(errors.Wrap(err, "handleSQSMessage failed")) - return - } - p.logger.Debugf("handleSQSMessage succeed and returned %v sets of S3 log info", len(s3Infos)) - - // read from s3 object and create event for each log line - err = p.handleS3Objects(svcS3, s3Infos, errC) - if err != nil { - err = errors.Wrap(err, "handleS3Objects failed") - p.logger.Error(err) - return - } - p.logger.Debugf("handleS3Objects succeed") -} - -func (p *s3Input) processorKeepAlive(svcSQS sqsiface.ClientAPI, message sqs.Message, queueURL string, visibilityTimeout int64, wg *sync.WaitGroup, errC chan error) { - defer wg.Done() - for { - select { - case <-p.close: - return - case err := <-errC: - if err != nil { - p.logger.Warn("Processing message failed, updating visibility timeout") - err := p.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) - if err != nil { - p.logger.Error(errors.Wrap(err, "SQS ChangeMessageVisibilityRequest failed")) - } - p.logger.Infof("Message visibility timeout updated to %v", visibilityTimeout) - } else { - // When ACK done, message will be deleted. Or when message is - // not s3 ObjectCreated event related(handleSQSMessage function - // failed), it will be removed as well. - p.logger.Debug("Deleting message from SQS: ", *message.MessageId) - // only delete sqs message when errC is closed with no error - err := p.deleteMessage(queueURL, *message.ReceiptHandle, svcSQS) - if err != nil { - p.logger.Error(errors.Wrap(err, "deleteMessages failed")) - } - } - return - case <-time.After(time.Duration(visibilityTimeout/2) * time.Second): - p.logger.Warn("Half of the set visibilityTimeout passed, visibility timeout needs to be updated") - // If half of the set visibilityTimeout passed and this is - // still ongoing, then change visibility timeout. - err := p.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) - if err != nil { - p.logger.Error(errors.Wrap(err, "SQS ChangeMessageVisibilityRequest failed")) - } - p.logger.Infof("Message visibility timeout updated to %v seconds", visibilityTimeout) - } - } -} - -func (p *s3Input) receiveMessage(svcSQS sqsiface.ClientAPI, visibilityTimeout int64) (*sqs.ReceiveMessageResponse, error) { - // receive messages from sqs - req := svcSQS.ReceiveMessageRequest( - &sqs.ReceiveMessageInput{ - QueueUrl: &p.config.QueueURL, - MessageAttributeNames: []string{"All"}, - MaxNumberOfMessages: &maxNumberOfMessage, - VisibilityTimeout: &visibilityTimeout, - WaitTimeSeconds: &waitTimeSecond, - }) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - return req.Send(ctx) +// s3Input is a input for s3 +type s3Input struct { + config config } -func (p *s3Input) changeVisibilityTimeout(queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI, receiptHandle *string) error { - req := svcSQS.ChangeMessageVisibilityRequest(&sqs.ChangeMessageVisibilityInput{ - QueueUrl: &queueURL, - VisibilityTimeout: &visibilityTimeout, - ReceiptHandle: receiptHandle, - }) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - _, err := req.Send(ctx) - return err +func newInput(config config) (*s3Input, error) { + return &s3Input{config: config}, nil } -func getRegionFromQueueURL(queueURL string) (string, error) { - // get region from queueURL - // Example: https://sqs.us-east-1.amazonaws.com/627959692251/test-s3-logs - queueURLSplit := strings.Split(queueURL, ".") - if queueURLSplit[0] == "https://sqs" && queueURLSplit[2] == "amazonaws" { - return queueURLSplit[1], nil - } - return "", errors.New("queueURL is not in format: https://sqs.{REGION_ENDPOINT}.amazonaws.com/{ACCOUNT_NUMBER}/{QUEUE_NAME}") -} +func (in *s3Input) Name() string { return inputName } -// handle message -func (p *s3Input) handleSQSMessage(m sqs.Message) ([]s3Info, error) { - msg := sqsMessage{} - err := json.Unmarshal([]byte(*m.Body), &msg) +func (in *s3Input) Test(ctx v2.TestContext) error { + _, err := awscommon.GetAWSCredentials(in.config.AwsConfig) if err != nil { - return nil, errors.Wrap(err, "json unmarshal sqs message body failed") - } - - var s3Infos []s3Info - for _, record := range msg.Records { - if record.EventSource != "aws:s3" || !strings.HasPrefix(record.EventName, "ObjectCreated:") { - return nil, errors.New("this SQS queue should be dedicated to s3 ObjectCreated event notifications") - } - // Unescape substrings from s3 log name. For example, convert "%3D" back to "=" - filename, err := url.QueryUnescape(record.S3.object.Key) - if err != nil { - return nil, errors.Wrapf(err, "url.QueryUnescape failed for '%s'", record.S3.object.Key) - } - - if len(p.config.FileSelectors) == 0 { - s3Infos = append(s3Infos, s3Info{ - region: record.AwsRegion, - name: record.S3.bucket.Name, - key: filename, - arn: record.S3.bucket.Arn, - expandEventListFromField: p.config.ExpandEventListFromField, - }) - continue - } - - for _, fs := range p.config.FileSelectors { - if fs.Regex == nil { - continue - } - if fs.Regex.MatchString(filename) { - s3Infos = append(s3Infos, s3Info{ - region: record.AwsRegion, - name: record.S3.bucket.Name, - key: filename, - arn: record.S3.bucket.Arn, - expandEventListFromField: fs.ExpandEventListFromField, - }) - break - } - } - } - return s3Infos, nil -} - -func (p *s3Input) handleS3Objects(svc s3iface.ClientAPI, s3Infos []s3Info, errC chan error) error { - s3Ctx := &s3Context{ - refs: 1, - errC: errC, - } - defer s3Ctx.done() - - for _, info := range s3Infos { - p.logger.Debugf("Processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) - err := p.createEventsFromS3Info(svc, info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "createEventsFromS3Info failed processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) - p.logger.Error(err) - s3Ctx.setError(err) - } + return fmt.Errorf("getAWSCredentials failed: %w", err) } return nil } -func (p *s3Input) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, s3Ctx *s3Context) error { - objectHash := s3ObjectHash(info) - - // Download the S3 object using GetObjectRequest. - s3GetObjectInput := &s3.GetObjectInput{ - Bucket: awssdk.String(info.name), - Key: awssdk.String(info.key), - } - req := svc.GetObjectRequest(s3GetObjectInput) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - resp, err := req.Send(ctx) +func (in *s3Input) Run(ctx v2.Context, pipeline beat.Pipeline) error { + collector, err := in.createCollector(ctx, pipeline) if err != nil { - if awsErr, ok := err.(awserr.Error); ok { - // If the SDK can determine the request or retry delay was canceled - // by a context the ErrCodeRequestCanceled error will be returned. - if awsErr.Code() == awssdk.ErrCodeRequestCanceled { - err = errors.Wrapf(err, "S3 GetObjectRequest canceled for '%s' from S3 bucket '%s'", info.key, info.name) - p.logger.Error(err) - return err - } - - if awsErr.Code() == "NoSuchKey" { - p.logger.Warnf("Cannot find s3 file '%s' from S3 bucket '%s'", info.key, info.name) - return nil - } - } - return errors.Wrapf(err, "S3 GetObjectRequest failed for '%s' from S3 bucket '%s'", info.key, info.name) - } - - defer resp.Body.Close() - - reader := bufio.NewReader(resp.Body) - - isS3ObjGzipped, err := isStreamGzipped(reader) - if err != nil { - err = errors.Wrap(err, "could not determine if S3 object is gzipped") - p.logger.Error(err) return err } - if isS3ObjGzipped { - gzipReader, err := gzip.NewReader(reader) - if err != nil { - err = errors.Wrapf(err, "gzip.NewReader failed for '%s' from S3 bucket '%s'", info.key, info.name) - p.logger.Error(err) - return err - } - reader = bufio.NewReader(gzipReader) - gzipReader.Close() - } - - // Decode JSON documents when content-type is "application/json" or expand_event_list_from_field is given in config - if resp.ContentType != nil && *resp.ContentType == "application/json" || info.expandEventListFromField != "" { - decoder := json.NewDecoder(reader) - err := p.decodeJSON(decoder, objectHash, info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "decodeJSONWithKey failed for '%s' from S3 bucket '%s'", info.key, info.name) - p.logger.Error(err) - return err - } - return nil - } - - // handle s3 objects that are not json content-type - offset := 0 - for { - log, err := readStringAndTrimDelimiter(reader) - if err == io.EOF { - // create event for last line - offset += len([]byte(log)) - event := createEvent(log, offset, info, objectHash, s3Ctx) - err = p.forwardEvent(event) - if err != nil { - err = errors.Wrap(err, "forwardEvent failed") - p.logger.Error(err) - return err - } - return nil - } else if err != nil { - err = errors.Wrap(err, "readStringAndTrimDelimiter failed") - p.logger.Error(err) - return err - } - - if log == "" { - break - } - - // create event per log line - offset += len([]byte(log)) - event := createEvent(log, offset, info, objectHash, s3Ctx) - err = p.forwardEvent(event) - if err != nil { - err = errors.Wrap(err, "forwardEvent failed") - p.logger.Error(err) - return err - } - } - return nil -} - -func (p *s3Input) decodeJSON(decoder *json.Decoder, objectHash string, s3Info s3Info, s3Ctx *s3Context) error { - offset := 0 - for { - var jsonFields interface{} - err := decoder.Decode(&jsonFields) - if jsonFields == nil { - return nil - } - - if err == io.EOF { - offset, err = p.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) - if err != nil { - return err - } - } else if err != nil { - // decode json failed, skip this log file - err = errors.Wrapf(err, "decode json failed for '%s' from S3 bucket '%s', skipping this file", s3Info.key, s3Info.name) - p.logger.Warn(err) - return nil - } - - offsetNew, err := p.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) - if err != nil { - return err - } - offset = offsetNew - } -} - -func (p *s3Input) jsonFieldsType(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { - switch f := jsonFields.(type) { - case map[string][]interface{}: - if s3Info.expandEventListFromField != "" { - textValues, ok := f[s3Info.expandEventListFromField] - if !ok { - err := errors.Errorf("key '%s' not found", s3Info.expandEventListFromField) - p.logger.Error(err) - return offset, err - } - for _, v := range textValues { - offset, err := p.convertJSONToEvent(v, offset, objectHash, s3Info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "convertJSONToEvent failed for '%s' from S3 bucket '%s'", s3Info.key, s3Info.name) - p.logger.Error(err) - return offset, err - } - } - return offset, nil - } - case map[string]interface{}: - if s3Info.expandEventListFromField != "" { - textValues, ok := f[s3Info.expandEventListFromField] - if !ok { - err := errors.Errorf("key '%s' not found", s3Info.expandEventListFromField) - p.logger.Error(err) - return offset, err - } - - valuesConverted := textValues.([]interface{}) - for _, textValue := range valuesConverted { - offsetNew, err := p.convertJSONToEvent(textValue, offset, objectHash, s3Info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "convertJSONToEvent failed for '%s' from S3 bucket '%s'", s3Info.key, s3Info.name) - p.logger.Error(err) - return offset, err - } - offset = offsetNew - } - return offset, nil - } - - offset, err := p.convertJSONToEvent(f, offset, objectHash, s3Info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "convertJSONToEvent failed for '%s' from S3 bucket '%s'", s3Info.key, s3Info.name) - p.logger.Error(err) - return offset, err - } - return offset, nil - } - return offset, nil + defer collector.publisher.Close() + collector.run() + return ctx.Cancelation.Err() } -func (p *s3Input) convertJSONToEvent(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { - vJSON, err := json.Marshal(jsonFields) - logOriginal := string(vJSON) - log := trimLogDelimiter(logOriginal) - offset += len([]byte(log)) - event := createEvent(log, offset, s3Info, objectHash, s3Ctx) +func (in *s3Input) createCollector(ctx v2.Context, pipeline beat.Pipeline) (*s3Collector, error) { + log := ctx.Logger.With("queue_url", in.config.QueueURL) - err = p.forwardEvent(event) + client, err := pipeline.ConnectWith(beat.ClientConfig{ + CloseRef: ctx.Cancelation, + ACKHandler: newACKHandler(), + }) if err != nil { - err = errors.Wrap(err, "forwardEvent failed") - p.logger.Error(err) - return offset, err - } - return offset, nil -} - -func (p *s3Input) forwardEvent(event beat.Event) error { - ok := p.outlet.OnEvent(event) - if !ok { - return errOutletClosed - } - return nil -} - -func (p *s3Input) deleteMessage(queueURL string, messagesReceiptHandle string, svcSQS sqsiface.ClientAPI) error { - deleteMessageInput := &sqs.DeleteMessageInput{ - QueueUrl: awssdk.String(queueURL), - ReceiptHandle: awssdk.String(messagesReceiptHandle), + return nil, err } - req := svcSQS.DeleteMessageRequest(deleteMessageInput) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - _, err := req.Send(ctx) + regionName, err := getRegionFromQueueURL(in.config.QueueURL) if err != nil { - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { - return nil - } - return errors.Wrapf(err, "SQS DeleteMessageRequest failed in queue %s", queueURL) + err := fmt.Errorf("getRegionFromQueueURL failed: %w", err) + log.Error(err) + return nil, err + } else { + log = log.With("region", regionName) } - return nil -} -func trimLogDelimiter(log string) string { - return strings.TrimSuffix(log, "\n") -} - -func readStringAndTrimDelimiter(reader *bufio.Reader) (string, error) { - logOriginal, err := reader.ReadString('\n') + awsConfig, err := awscommon.GetAWSCredentials(in.config.AwsConfig) if err != nil { - return logOriginal, err - } - return trimLogDelimiter(logOriginal), nil -} - -func createEvent(log string, offset int, info s3Info, objectHash string, s3Ctx *s3Context) beat.Event { - s3Ctx.Inc() - - event := beat.Event{ - Timestamp: time.Now().UTC(), - Fields: common.MapStr{ - "message": log, - "log": common.MapStr{ - "offset": int64(offset), - "file.path": constructObjectURL(info), - }, - "aws": common.MapStr{ - "s3": common.MapStr{ - "bucket": common.MapStr{ - "name": info.name, - "arn": info.arn}, - "object.key": info.key, - }, - }, - "cloud": common.MapStr{ - "provider": "aws", - "region": info.region, - }, - }, - Private: s3Ctx, - } - event.SetID(objectHash + "-" + fmt.Sprintf("%012d", offset)) - - return event -} - -func constructObjectURL(info s3Info) string { - return "https://" + info.name + ".s3-" + info.region + ".amazonaws.com/" + info.key -} - -// s3ObjectHash returns a short sha256 hash of the bucket arn + object key name. -func s3ObjectHash(s3Info s3Info) string { - h := sha256.New() - h.Write([]byte(s3Info.arn + s3Info.key)) - prefix := hex.EncodeToString(h.Sum(nil)) - return prefix[:10] -} - -func (c *s3Context) setError(err error) { - // only care about the last error for now - // TODO: add "Typed" error to error for context - c.mux.Lock() - defer c.mux.Unlock() - c.err = err -} - -func (c *s3Context) done() { - c.mux.Lock() - defer c.mux.Unlock() - c.refs-- - if c.refs == 0 { - c.errC <- c.err - close(c.errC) - } -} - -func (c *s3Context) Inc() { - c.mux.Lock() - defer c.mux.Unlock() - c.refs++ -} - -// isStreamGzipped determines whether the given stream of bytes (encapsulated in a buffered reader) -// represents gzipped content or not. A buffered reader is used so the function can peek into the byte -// stream without consuming it. This makes it convenient for code executed after this function call -// to consume the stream if it wants. -func isStreamGzipped(r *bufio.Reader) (bool, error) { - // Why 512? See https://godoc.org/net/http#DetectContentType - buf, err := r.Peek(512) - if err != nil && err != io.EOF { - return false, err - } - - switch http.DetectContentType(buf) { - case "application/x-gzip", "application/zip": - return true, nil - default: - return false, nil - } + return nil, fmt.Errorf("getAWSCredentials failed: %w", err) + } + awsConfig.Region = regionName + + visibilityTimeout := int64(in.config.VisibilityTimeout.Seconds()) + log.Infof("visibility timeout is set to %v seconds", visibilityTimeout) + log.Infof("aws api timeout is set to %v", in.config.APITimeout) + + return &s3Collector{ + cancellation: ctxtool.FromCanceller(ctx.Cancelation), + logger: log, + config: &in.config, + publisher: client, + visibilityTimeout: visibilityTimeout, + sqs: sqs.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, "sqs", regionName, awsConfig)), + s3: s3.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, "s3", regionName, awsConfig)), + }, nil +} + +func newACKHandler() beat.ACKer { + return acker.ConnectionOnly( + acker.EventPrivateReporter(func(_ int, privates []interface{}) { + for _, private := range privates { + if s3Context, ok := private.(*s3Context); ok { + s3Context.done() + } + } + }), + ) } diff --git a/x-pack/filebeat/input/s3/s3_integration_test.go b/x-pack/filebeat/input/s3/s3_integration_test.go index 1d6a400a7f1..cadb5da035b 100644 --- a/x-pack/filebeat/input/s3/s3_integration_test.go +++ b/x-pack/filebeat/input/s3/s3_integration_test.go @@ -16,21 +16,20 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - - "github.com/aws/aws-sdk-go-v2/aws" awssdk "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/s3iface" "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/aws/aws-sdk-go-v2/service/sqs/sqsiface" + "github.com/stretchr/testify/assert" - "github.com/elastic/beats/v7/filebeat/channel" - "github.com/elastic/beats/v7/filebeat/input" + v2 "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/logp" + pubtest "github.com/elastic/beats/v7/libbeat/publisher/testing" "github.com/elastic/beats/v7/libbeat/tests/resources" awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" + "github.com/elastic/go-concert/unison" ) const ( @@ -77,228 +76,99 @@ func getConfigForTest(t *testing.T) config { return config } -func uploadSampleLogFile(t *testing.T, bucketName string, svcS3 s3iface.ClientAPI) { - t.Helper() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - file, err := os.Open(filePath) - if err != nil { - t.Fatalf("Failed to open file %v", filePath) - } - defer file.Close() - - s3PutObjectInput := s3.PutObjectInput{ - Bucket: aws.String(bucketName), - Key: aws.String(filepath.Base(filePath)), - Body: file, - } - req := svcS3.PutObjectRequest(&s3PutObjectInput) - output, err := req.Send(ctx) - if err != nil { - t.Fatalf("failed to put object into s3 bucket: %v", output) - } -} - -func collectOldMessages(t *testing.T, queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI) []string { - t.Helper() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // receive messages from sqs - req := svcSQS.ReceiveMessageRequest( - &sqs.ReceiveMessageInput{ - QueueUrl: &queueURL, - MessageAttributeNames: []string{"All"}, - MaxNumberOfMessages: &maxNumberOfMessage, - VisibilityTimeout: &visibilityTimeout, - WaitTimeSeconds: &waitTimeSecond, - }) - - output, err := req.Send(ctx) - if err != nil { - t.Fatalf("failed to receive message from SQS: %v", output) - } - - var oldMessageHandles []string - for _, message := range output.Messages { - oldMessageHandles = append(oldMessageHandles, *message.ReceiptHandle) - } - - return oldMessageHandles -} - -func (input *s3Input) deleteAllMessages(t *testing.T, awsConfig awssdk.Config, queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI) error { - var messageReceiptHandles []string - init := true - for init || len(messageReceiptHandles) > 0 { - init = false - messageReceiptHandles = collectOldMessages(t, queueURL, visibilityTimeout, svcSQS) - for _, receiptHandle := range messageReceiptHandles { - err := input.deleteMessage(queueURL, receiptHandle, svcSQS) - if err != nil { - return err - } - } - } - return nil -} - func defaultTestConfig() *common.Config { return common.MustNewConfigFrom(map[string]interface{}{ "queue_url": os.Getenv("QUEUE_URL"), }) } -func runTest(t *testing.T, cfg *common.Config, run func(t *testing.T, input *s3Input, out *stubOutleter)) { - // Simulate input.Context from Filebeat input runner. - inputCtx := newInputContext() - defer close(inputCtx.Done) - - // Stub outlet for receiving events generated by the input. - eventOutlet := newStubOutlet() - defer eventOutlet.Close() - - connector := channel.ConnectorFunc(func(_ *common.Config, _ beat.ClientConfig) (channel.Outleter, error) { - return eventOutlet, nil - }) +func newV2Context() (v2.Context, func()) { + ctx, cancel := context.WithCancel(context.Background()) + return v2.Context{ + Logger: logp.NewLogger("s3_test"), + ID: "test_id", + Cancelation: ctx, + }, cancel +} - in, err := NewInput(cfg, connector, inputCtx) +func setupInput(t *testing.T, cfg *common.Config) (*s3Collector, chan beat.Event) { + inp, err := Plugin().Manager.Create(cfg) if err != nil { t.Fatal(err) } - s3Input := in.(*s3Input) - defer s3Input.Stop() - run(t, s3Input, eventOutlet) -} + ctx, cancel := newV2Context() + t.Cleanup(cancel) -func newInputContext() input.Context { - return input.Context{ - Done: make(chan struct{}), + client := pubtest.NewChanClient(0) + pipeline := pubtest.ConstClient(client) + collector, err := inp.(*s3Input).createCollector(ctx, pipeline) + if err != nil { + t.Fatal(err) } + return collector, client.Channel } -type stubOutleter struct { - sync.Mutex - cond *sync.Cond - done bool - Events []beat.Event -} - -func newStubOutlet() *stubOutleter { - o := &stubOutleter{} - o.cond = sync.NewCond(o) - return o -} - -func (o *stubOutleter) waitForEvents(numEvents int) ([]beat.Event, bool) { - o.Lock() - defer o.Unlock() - - for len(o.Events) < numEvents && !o.done { - o.cond.Wait() +func setupCollector(t *testing.T, cfg *common.Config, mock bool) (*s3Collector, chan beat.Event) { + collector, receiver := setupInput(t, cfg) + if mock { + svcS3 := &MockS3Client{} + svcSQS := &MockSQSClient{} + collector.sqs = svcSQS + collector.s3 = svcS3 + return collector, receiver } - size := numEvents - if size >= len(o.Events) { - size = len(o.Events) + config := getConfigForTest(t) + awsConfig, err := awscommon.GetAWSCredentials(config.AwsConfig) + if err != nil { + t.Fatal("failed GetAWSCredentials with AWS Config: ", err) } - out := make([]beat.Event, size) - copy(out, o.Events) - return out, len(out) == numEvents + s3BucketRegion := os.Getenv("S3_BUCKET_REGION") + if s3BucketRegion == "" { + t.Log("S3_BUCKET_REGION is not set, default to us-west-1") + s3BucketRegion = "us-west-1" + } + awsConfig.Region = s3BucketRegion + awsConfig = awsConfig.Copy() + collector.sqs = sqs.New(awsConfig) + collector.s3 = s3.New(awsConfig) + return collector, receiver } -func (o *stubOutleter) Close() error { - o.Lock() - defer o.Unlock() - o.done = true - return nil -} - -func (o *stubOutleter) Done() <-chan struct{} { return nil } - -func (o *stubOutleter) OnEvent(event beat.Event) bool { - o.Lock() - defer o.Unlock() - o.Events = append(o.Events, event) - o.cond.Broadcast() - return !o.done +func runTest(t *testing.T, cfg *common.Config, mock bool, run func(t *testing.T, collector *s3Collector, receiver chan beat.Event)) { + collector, receiver := setupCollector(t, cfg, mock) + run(t, collector, receiver) } func TestS3Input(t *testing.T) { - inputConfig := defaultTestConfig() - config := getConfigForTest(t) - - runTest(t, inputConfig, func(t *testing.T, input *s3Input, out *stubOutleter) { - awsConfig, err := awscommon.GetAWSCredentials(config.AwsConfig) - if err != nil { - - } - s3BucketRegion := os.Getenv("S3_BUCKET_REGION") - if s3BucketRegion == "" { - t.Log("S3_BUCKET_REGION is not set, default to us-west-1") - s3BucketRegion = "us-west-1" - } - awsConfig.Region = s3BucketRegion - input.awsConfig = awsConfig.Copy() - svcSQS := sqs.New(awsConfig) - - // remove old messages from SQS - err = input.deleteAllMessages(t, awsConfig, config.QueueURL, int64(config.VisibilityTimeout.Seconds()), svcSQS) - if err != nil { - t.Fatalf("failed to delete message: %v", err.Error()) - } - + runTest(t, defaultTestConfig(), false, func(t *testing.T, collector *s3Collector, receiver chan beat.Event) { // upload a sample log file for testing s3BucketNameEnv := os.Getenv("S3_BUCKET_NAME") if s3BucketNameEnv == "" { t.Fatal("failed to get S3_BUCKET_NAME") } - svcS3 := s3.New(awsConfig) - uploadSampleLogFile(t, s3BucketNameEnv, svcS3) - time.Sleep(30 * time.Second) - wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() - input.run(svcSQS, svcS3, 300) + collector.run() }() - events, ok := out.waitForEvents(2) - if !ok { - t.Fatalf("Expected 2 events, but got %d.", len(events)) - } - input.Stop() - - // check events - for i, event := range events { - bucketName, err := event.GetValue("aws.s3.bucket.name") - assert.NoError(t, err) - assert.Equal(t, s3BucketNameEnv, bucketName) - - objectKey, err := event.GetValue("aws.s3.object.key") - assert.NoError(t, err) - assert.Equal(t, fileName, objectKey) - - message, err := event.GetValue("message") - assert.NoError(t, err) - switch i { - case 0: - assert.Equal(t, "logline1\n", message) - case 1: - assert.Equal(t, "logline2\n", message) - } - } + event := <-receiver + bucketName, err := event.GetValue("aws.s3.bucket.name") + assert.NoError(t, err) + assert.Equal(t, s3BucketNameEnv, bucketName) - // delete messages from the queue - err = input.deleteAllMessages(t, awsConfig, config.QueueURL, int64(config.VisibilityTimeout.Seconds()), svcSQS) - if err != nil { - t.Fatalf("failed to delete message: %v", err.Error()) - } + objectKey, err := event.GetValue("aws.s3.object.key") + assert.NoError(t, err) + assert.Equal(t, fileName, objectKey) + + message, err := event.GetValue("message") + assert.NoError(t, err) + assert.Equal(t, "logline1\n", message) }) } @@ -354,41 +224,23 @@ func TestMockS3Input(t *testing.T) { "queue_url": "https://sqs.ap-southeast-1.amazonaws.com/123456/test", }) - runTest(t, cfg, func(t *testing.T, input *s3Input, out *stubOutleter) { - svcS3 := &MockS3Client{} - svcSQS := &MockSQSClient{} + runTest(t, cfg, true, func(t *testing.T, collector *s3Collector, receiver chan beat.Event) { + defer collector.cancellation.Done() + defer collector.publisher.Close() - wg := sync.WaitGroup{} - wg.Add(1) - go func() { - defer wg.Done() - input.run(svcSQS, svcS3, 300) - }() + output, err := collector.receiveMessage(collector.sqs, collector.visibilityTimeout) + assert.NoError(t, err) - events, ok := out.waitForEvents(2) - if !ok { - t.Fatalf("Expected 2 events, but got %d.", len(events)) - } - input.Wait() - - // check events - for i, event := range events { - bucketName, err := event.GetValue("aws.s3.bucket.name") - assert.NoError(t, err) - assert.Equal(t, "test-s3-ks-2", bucketName) - - objectKey, err := event.GetValue("aws.s3.object.key") - assert.NoError(t, err) - assert.Equal(t, "server-access-logging2019-06-21-16-16-54", objectKey) - - message, err := event.GetValue("message") - assert.NoError(t, err) - switch i { - case 0: - assert.Equal(t, s3LogString1, message) - case 1: - assert.Equal(t, s3LogString2, message) - } - } + var grp unison.MultiErrGroup + errC := make(chan error) + defer close(errC) + grp.Go(func() (err error) { + return collector.processMessage(collector.s3, output.Messages[0], errC) + }) + + event := <-receiver + bucketName, err := event.GetValue("aws.s3.bucket.name") + assert.NoError(t, err) + assert.Equal(t, "test-s3-ks-2", bucketName) }) } From 30a141519911c933372624c9aaf4b7fc9d0ce8d5 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Fri, 2 Oct 2020 23:12:59 +0200 Subject: [PATCH 11/21] Increase index pattern size check to 10MiB (#21487) --- libbeat/tests/system/beat/common_tests.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libbeat/tests/system/beat/common_tests.py b/libbeat/tests/system/beat/common_tests.py index c9cdbc52cc0..920ee35e72e 100644 --- a/libbeat/tests/system/beat/common_tests.py +++ b/libbeat/tests/system/beat/common_tests.py @@ -4,6 +4,12 @@ from beat.beat import INTEGRATION_TESTS +# Fail if the exported index pattern is larger than 10MiB +# This is to avoid problems with Kibana when the payload +# of the request to install the index pattern exceeds the +# default limit. +index_pattern_size_limit = 10 * 1024 * 1024 + class TestExportsMixin: @@ -56,7 +62,7 @@ def test_export_index_pattern(self): js = json.loads(output) assert "objects" in js size = len(output.encode('utf-8')) - assert size < 1024 * 1024, "Kibana index pattern must be less than 1MiB " \ + assert size < index_pattern_size_limit, "Kibana index pattern must be less than 10MiB " \ "to keep the Beat setup request size below " \ "Kibana's server.maxPayloadBytes." @@ -68,7 +74,7 @@ def test_export_index_pattern_migration(self): js = json.loads(output) assert "objects" in js size = len(output.encode('utf-8')) - assert size < 1024 * 1024, "Kibana index pattern must be less than 1MiB " \ + assert size < index_pattern_size_limit, "Kibana index pattern must be less than 10MiB " \ "to keep the Beat setup request size below " \ "Kibana's server.maxPayloadBytes." From e50c9b3929fdab157000e01adcd07a9d92b05b37 Mon Sep 17 00:00:00 2001 From: Pius Date: Fri, 2 Oct 2020 19:40:29 -0700 Subject: [PATCH 12/21] Clarify input type configuration options (#19284) Clarify that all input type configuration options must be specified within the external configuration file: https://github.com/elastic/beats/issues/19148 --- filebeat/docs/reload-configuration.asciidoc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/filebeat/docs/reload-configuration.asciidoc b/filebeat/docs/reload-configuration.asciidoc index 10a706d4020..14c4826b6d8 100644 --- a/filebeat/docs/reload-configuration.asciidoc +++ b/filebeat/docs/reload-configuration.asciidoc @@ -33,9 +33,11 @@ definitions. TIP: The first line of each external configuration file must be an input definition that starts with `- type`. Make sure you omit the line -+{beatname_lc}.config.inputs+ from this file. - -For example: ++{beatname_lc}.config.inputs+ from this file. All <> +must be specified within each external configuration file. Specifying these +configuration options at the global `filebeat.config.inputs` level is not supported. + +Example external configuration file: [source,yaml] ------------------------------------------------------------------------------ From e9cb70f8805fe84889f27391314281f2a39514cc Mon Sep 17 00:00:00 2001 From: Andrew Kroh Date: Sun, 4 Oct 2020 09:43:06 -0400 Subject: [PATCH 13/21] Bump version to ECS 1.6 in modules without ECS updates (#21455) For the Filebeat modules that required no changes to move to ECS 1.6 this updates the ecs.version field from 1.5.0 to 1.6.0. And update the ecs.version for Auditbeat, Packetbeat, and Winlogbeat. Relates #19472 --- auditbeat/cmd/root.go | 2 +- filebeat/module/apache/access/config/access.yml | 2 +- filebeat/module/apache/error/config/error.yml | 2 +- filebeat/module/auditd/log/config/log.yml | 2 +- filebeat/module/elasticsearch/audit/config/audit.yml | 2 +- filebeat/module/elasticsearch/deprecation/config/log.yml | 2 +- filebeat/module/elasticsearch/gc/config/gc.yml | 2 +- filebeat/module/elasticsearch/server/config/log.yml | 2 +- filebeat/module/elasticsearch/slowlog/config/slowlog.yml | 2 +- filebeat/module/haproxy/log/config/file.yml | 2 +- filebeat/module/haproxy/log/config/syslog.yml | 2 +- filebeat/module/icinga/debug/config/debug.yml | 2 +- filebeat/module/icinga/main/config/main.yml | 2 +- filebeat/module/icinga/startup/config/startup.yml | 2 +- filebeat/module/iis/access/config/iis-access.yml | 2 +- filebeat/module/iis/error/config/iis-error.yml | 2 +- filebeat/module/kafka/log/config/log.yml | 2 +- filebeat/module/kibana/log/config/log.yml | 2 +- filebeat/module/logstash/log/config/log.yml | 2 +- filebeat/module/logstash/slowlog/config/slowlog.yml | 2 +- filebeat/module/mongodb/log/config/log.yml | 2 +- filebeat/module/mysql/error/config/error.yml | 2 +- filebeat/module/mysql/slowlog/config/slowlog.yml | 2 +- filebeat/module/nats/log/config/log.yml | 2 +- filebeat/module/nginx/access/config/nginx-access.yml | 2 +- filebeat/module/nginx/error/config/nginx-error.yml | 2 +- .../nginx/ingress_controller/config/ingress_controller.yml | 2 +- filebeat/module/postgresql/log/config/log.yml | 2 +- filebeat/module/redis/log/config/log.yml | 2 +- filebeat/module/traefik/access/config/traefik-access.yml | 2 +- packetbeat/cmd/root.go | 2 +- winlogbeat/cmd/root.go | 2 +- x-pack/filebeat/module/activemq/audit/config/audit.yml | 2 +- x-pack/filebeat/module/activemq/log/config/log.yml | 2 +- x-pack/filebeat/module/aws/cloudtrail/config/file.yml | 2 +- x-pack/filebeat/module/aws/cloudtrail/config/s3.yml | 2 +- x-pack/filebeat/module/aws/cloudwatch/config/file.yml | 2 +- x-pack/filebeat/module/aws/cloudwatch/config/s3.yml | 2 +- x-pack/filebeat/module/aws/ec2/config/file.yml | 2 +- x-pack/filebeat/module/aws/ec2/config/s3.yml | 2 +- x-pack/filebeat/module/aws/elb/config/file.yml | 2 +- x-pack/filebeat/module/aws/elb/config/s3.yml | 2 +- x-pack/filebeat/module/aws/s3access/config/file.yml | 2 +- x-pack/filebeat/module/aws/s3access/config/s3.yml | 2 +- x-pack/filebeat/module/aws/vpcflow/config/input.yml | 2 +- .../module/azure/activitylogs/config/azure-eventhub.yml | 2 +- x-pack/filebeat/module/azure/activitylogs/config/file.yml | 2 +- .../filebeat/module/azure/auditlogs/config/azure-eventhub.yml | 2 +- x-pack/filebeat/module/azure/auditlogs/config/file.yml | 2 +- .../filebeat/module/azure/signinlogs/config/azure-eventhub.yml | 2 +- x-pack/filebeat/module/azure/signinlogs/config/file.yml | 2 +- x-pack/filebeat/module/cef/log/config/input.yml | 2 +- x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml | 2 +- x-pack/filebeat/module/coredns/log/config/coredns.yml | 2 +- x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml | 2 +- x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml | 2 +- x-pack/filebeat/module/googlecloud/audit/config/input.yml | 2 +- x-pack/filebeat/module/googlecloud/firewall/config/input.yml | 2 +- x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml | 2 +- x-pack/filebeat/module/gsuite/admin/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/drive/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/groups/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/login/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/saml/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/user_accounts/config/config.yml | 2 +- x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml | 2 +- x-pack/filebeat/module/iptables/log/config/input.yml | 2 +- x-pack/filebeat/module/misp/threat/config/input.yml | 2 +- x-pack/filebeat/module/mssql/log/config/config.yml | 2 +- x-pack/filebeat/module/netflow/log/config/netflow.yml | 2 +- x-pack/filebeat/module/o365/audit/config/input.yml | 2 +- x-pack/filebeat/module/okta/system/config/input.yml | 2 +- x-pack/filebeat/module/rabbitmq/log/config/log.yml | 2 +- x-pack/filebeat/module/sophos/xg/config/config.yml | 2 +- .../filebeat/module/zeek/capture_loss/config/capture_loss.yml | 2 +- x-pack/filebeat/module/zeek/connection/config/connection.yml | 2 +- x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml | 2 +- x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml | 2 +- x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml | 2 +- x-pack/filebeat/module/zeek/dns/config/dns.yml | 2 +- x-pack/filebeat/module/zeek/dpd/config/dpd.yml | 2 +- x-pack/filebeat/module/zeek/files/config/files.yml | 2 +- x-pack/filebeat/module/zeek/ftp/config/ftp.yml | 2 +- x-pack/filebeat/module/zeek/http/config/http.yml | 2 +- x-pack/filebeat/module/zeek/intel/config/intel.yml | 2 +- x-pack/filebeat/module/zeek/irc/config/irc.yml | 2 +- x-pack/filebeat/module/zeek/modbus/config/modbus.yml | 2 +- x-pack/filebeat/module/zeek/mysql/config/mysql.yml | 2 +- x-pack/filebeat/module/zeek/notice/config/notice.yml | 2 +- x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml | 2 +- x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml | 2 +- x-pack/filebeat/module/zeek/pe/config/pe.yml | 2 +- x-pack/filebeat/module/zeek/radius/config/radius.yml | 2 +- x-pack/filebeat/module/zeek/rdp/config/rdp.yml | 2 +- x-pack/filebeat/module/zeek/rfb/config/rfb.yml | 2 +- x-pack/filebeat/module/zeek/sip/config/sip.yml | 2 +- x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml | 2 +- x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml | 2 +- x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml | 2 +- x-pack/filebeat/module/zeek/smtp/config/smtp.yml | 2 +- x-pack/filebeat/module/zeek/snmp/config/snmp.yml | 2 +- x-pack/filebeat/module/zeek/socks/config/socks.yml | 2 +- x-pack/filebeat/module/zeek/ssh/config/ssh.yml | 2 +- x-pack/filebeat/module/zeek/stats/config/stats.yml | 2 +- x-pack/filebeat/module/zeek/syslog/config/syslog.yml | 2 +- x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml | 2 +- x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml | 2 +- x-pack/filebeat/module/zeek/weird/config/weird.yml | 2 +- x-pack/filebeat/module/zoom/webhook/config/webhook.yml | 2 +- 109 files changed, 109 insertions(+), 109 deletions(-) diff --git a/auditbeat/cmd/root.go b/auditbeat/cmd/root.go index 89d0bfd20ca..bf3167e7106 100644 --- a/auditbeat/cmd/root.go +++ b/auditbeat/cmd/root.go @@ -35,7 +35,7 @@ const ( Name = "auditbeat" // ecsVersion specifies the version of ECS that Auditbeat is implementing. - ecsVersion = "1.5.0" + ecsVersion = "1.6.0" ) // RootCmd for running auditbeat. diff --git a/filebeat/module/apache/access/config/access.yml b/filebeat/module/apache/access/config/access.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/apache/access/config/access.yml +++ b/filebeat/module/apache/access/config/access.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/apache/error/config/error.yml b/filebeat/module/apache/error/config/error.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/apache/error/config/error.yml +++ b/filebeat/module/apache/error/config/error.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/auditd/log/config/log.yml b/filebeat/module/auditd/log/config/log.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/auditd/log/config/log.yml +++ b/filebeat/module/auditd/log/config/log.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/audit/config/audit.yml b/filebeat/module/elasticsearch/audit/config/audit.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/elasticsearch/audit/config/audit.yml +++ b/filebeat/module/elasticsearch/audit/config/audit.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/deprecation/config/log.yml b/filebeat/module/elasticsearch/deprecation/config/log.yml index f6c37b9e426..aa6f7d220f0 100644 --- a/filebeat/module/elasticsearch/deprecation/config/log.yml +++ b/filebeat/module/elasticsearch/deprecation/config/log.yml @@ -15,4 +15,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/gc/config/gc.yml b/filebeat/module/elasticsearch/gc/config/gc.yml index 5f62e00c54c..12b9a0f874d 100644 --- a/filebeat/module/elasticsearch/gc/config/gc.yml +++ b/filebeat/module/elasticsearch/gc/config/gc.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/server/config/log.yml b/filebeat/module/elasticsearch/server/config/log.yml index b0b9e3f55d0..45a7f84018d 100644 --- a/filebeat/module/elasticsearch/server/config/log.yml +++ b/filebeat/module/elasticsearch/server/config/log.yml @@ -15,4 +15,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/slowlog/config/slowlog.yml b/filebeat/module/elasticsearch/slowlog/config/slowlog.yml index 2d98286de6d..4c861ea7dc7 100644 --- a/filebeat/module/elasticsearch/slowlog/config/slowlog.yml +++ b/filebeat/module/elasticsearch/slowlog/config/slowlog.yml @@ -16,4 +16,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/haproxy/log/config/file.yml b/filebeat/module/haproxy/log/config/file.yml index c3e104f56d4..ac3846087c3 100644 --- a/filebeat/module/haproxy/log/config/file.yml +++ b/filebeat/module/haproxy/log/config/file.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/haproxy/log/config/syslog.yml b/filebeat/module/haproxy/log/config/syslog.yml index 6fa56f8fe3c..e919d732e74 100644 --- a/filebeat/module/haproxy/log/config/syslog.yml +++ b/filebeat/module/haproxy/log/config/syslog.yml @@ -6,4 +6,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/icinga/debug/config/debug.yml b/filebeat/module/icinga/debug/config/debug.yml index 33c47850878..8b5c2ae7422 100644 --- a/filebeat/module/icinga/debug/config/debug.yml +++ b/filebeat/module/icinga/debug/config/debug.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/icinga/main/config/main.yml b/filebeat/module/icinga/main/config/main.yml index 33c47850878..8b5c2ae7422 100644 --- a/filebeat/module/icinga/main/config/main.yml +++ b/filebeat/module/icinga/main/config/main.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/icinga/startup/config/startup.yml b/filebeat/module/icinga/startup/config/startup.yml index a69343bd796..acc8bd2b782 100644 --- a/filebeat/module/icinga/startup/config/startup.yml +++ b/filebeat/module/icinga/startup/config/startup.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/iis/access/config/iis-access.yml b/filebeat/module/iis/access/config/iis-access.yml index b4797039397..2c845646a4e 100644 --- a/filebeat/module/iis/access/config/iis-access.yml +++ b/filebeat/module/iis/access/config/iis-access.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/iis/error/config/iis-error.yml b/filebeat/module/iis/error/config/iis-error.yml index b4797039397..2c845646a4e 100644 --- a/filebeat/module/iis/error/config/iis-error.yml +++ b/filebeat/module/iis/error/config/iis-error.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/kafka/log/config/log.yml b/filebeat/module/kafka/log/config/log.yml index a745c79562c..f3cfc687526 100644 --- a/filebeat/module/kafka/log/config/log.yml +++ b/filebeat/module/kafka/log/config/log.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/kibana/log/config/log.yml b/filebeat/module/kibana/log/config/log.yml index 1ad204c62fe..93daa116791 100644 --- a/filebeat/module/kibana/log/config/log.yml +++ b/filebeat/module/kibana/log/config/log.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/logstash/log/config/log.yml b/filebeat/module/logstash/log/config/log.yml index af0e4c33735..407078dc115 100644 --- a/filebeat/module/logstash/log/config/log.yml +++ b/filebeat/module/logstash/log/config/log.yml @@ -16,4 +16,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/logstash/slowlog/config/slowlog.yml b/filebeat/module/logstash/slowlog/config/slowlog.yml index 080a2c4310d..4c6abc278c6 100644 --- a/filebeat/module/logstash/slowlog/config/slowlog.yml +++ b/filebeat/module/logstash/slowlog/config/slowlog.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/mongodb/log/config/log.yml b/filebeat/module/mongodb/log/config/log.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/mongodb/log/config/log.yml +++ b/filebeat/module/mongodb/log/config/log.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/mysql/error/config/error.yml b/filebeat/module/mysql/error/config/error.yml index 818cbab297d..8ceba377810 100644 --- a/filebeat/module/mysql/error/config/error.yml +++ b/filebeat/module/mysql/error/config/error.yml @@ -16,4 +16,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/mysql/slowlog/config/slowlog.yml b/filebeat/module/mysql/slowlog/config/slowlog.yml index 7b1a3bc28fd..6893491d869 100644 --- a/filebeat/module/mysql/slowlog/config/slowlog.yml +++ b/filebeat/module/mysql/slowlog/config/slowlog.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nats/log/config/log.yml b/filebeat/module/nats/log/config/log.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/nats/log/config/log.yml +++ b/filebeat/module/nats/log/config/log.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nginx/access/config/nginx-access.yml b/filebeat/module/nginx/access/config/nginx-access.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/nginx/access/config/nginx-access.yml +++ b/filebeat/module/nginx/access/config/nginx-access.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nginx/error/config/nginx-error.yml b/filebeat/module/nginx/error/config/nginx-error.yml index 797c45f6c38..173a43c5a1e 100644 --- a/filebeat/module/nginx/error/config/nginx-error.yml +++ b/filebeat/module/nginx/error/config/nginx-error.yml @@ -14,4 +14,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml b/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml +++ b/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/postgresql/log/config/log.yml b/filebeat/module/postgresql/log/config/log.yml index f69d3e4d387..eeac43780bf 100644 --- a/filebeat/module/postgresql/log/config/log.yml +++ b/filebeat/module/postgresql/log/config/log.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/redis/log/config/log.yml b/filebeat/module/redis/log/config/log.yml index 9d6cae46b38..1c6b6d6c084 100644 --- a/filebeat/module/redis/log/config/log.yml +++ b/filebeat/module/redis/log/config/log.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/traefik/access/config/traefik-access.yml b/filebeat/module/traefik/access/config/traefik-access.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/traefik/access/config/traefik-access.yml +++ b/filebeat/module/traefik/access/config/traefik-access.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/packetbeat/cmd/root.go b/packetbeat/cmd/root.go index 82ab41da374..0a22e98a1a0 100644 --- a/packetbeat/cmd/root.go +++ b/packetbeat/cmd/root.go @@ -37,7 +37,7 @@ const ( Name = "packetbeat" // ecsVersion specifies the version of ECS that Packetbeat is implementing. - ecsVersion = "1.5.0" + ecsVersion = "1.6.0" ) // withECSVersion is a modifier that adds ecs.version to events. diff --git a/winlogbeat/cmd/root.go b/winlogbeat/cmd/root.go index 2cd26a9fe8e..988ac6f9f6c 100644 --- a/winlogbeat/cmd/root.go +++ b/winlogbeat/cmd/root.go @@ -37,7 +37,7 @@ const ( Name = "winlogbeat" // ecsVersion specifies the version of ECS that Winlogbeat is implementing. - ecsVersion = "1.5.0" + ecsVersion = "1.6.0" ) // withECSVersion is a modifier that adds ecs.version to events. diff --git a/x-pack/filebeat/module/activemq/audit/config/audit.yml b/x-pack/filebeat/module/activemq/audit/config/audit.yml index 3e0ec415541..f40bf16116f 100644 --- a/x-pack/filebeat/module/activemq/audit/config/audit.yml +++ b/x-pack/filebeat/module/activemq/audit/config/audit.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/activemq/log/config/log.yml b/x-pack/filebeat/module/activemq/log/config/log.yml index 17f6bd869f2..55449d359f1 100644 --- a/x-pack/filebeat/module/activemq/log/config/log.yml +++ b/x-pack/filebeat/module/activemq/log/config/log.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudtrail/config/file.yml b/x-pack/filebeat/module/aws/cloudtrail/config/file.yml index 5a56f210c79..c4436629e21 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/config/file.yml +++ b/x-pack/filebeat/module/aws/cloudtrail/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml b/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml index 2094f77c712..7c455f64f26 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml +++ b/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml @@ -58,4 +58,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudwatch/config/file.yml b/x-pack/filebeat/module/aws/cloudwatch/config/file.yml index 5a56f210c79..c4436629e21 100644 --- a/x-pack/filebeat/module/aws/cloudwatch/config/file.yml +++ b/x-pack/filebeat/module/aws/cloudwatch/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml b/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml +++ b/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/ec2/config/file.yml b/x-pack/filebeat/module/aws/ec2/config/file.yml index 5a56f210c79..c4436629e21 100644 --- a/x-pack/filebeat/module/aws/ec2/config/file.yml +++ b/x-pack/filebeat/module/aws/ec2/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/ec2/config/s3.yml b/x-pack/filebeat/module/aws/ec2/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/ec2/config/s3.yml +++ b/x-pack/filebeat/module/aws/ec2/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/elb/config/file.yml b/x-pack/filebeat/module/aws/elb/config/file.yml index 498a7906457..e9470671e07 100644 --- a/x-pack/filebeat/module/aws/elb/config/file.yml +++ b/x-pack/filebeat/module/aws/elb/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/elb/config/s3.yml b/x-pack/filebeat/module/aws/elb/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/elb/config/s3.yml +++ b/x-pack/filebeat/module/aws/elb/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/s3access/config/file.yml b/x-pack/filebeat/module/aws/s3access/config/file.yml index 498a7906457..e9470671e07 100644 --- a/x-pack/filebeat/module/aws/s3access/config/file.yml +++ b/x-pack/filebeat/module/aws/s3access/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/s3access/config/s3.yml b/x-pack/filebeat/module/aws/s3access/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/s3access/config/s3.yml +++ b/x-pack/filebeat/module/aws/s3access/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/vpcflow/config/input.yml b/x-pack/filebeat/module/aws/vpcflow/config/input.yml index c9e88b6a743..d0c18047ca4 100644 --- a/x-pack/filebeat/module/aws/vpcflow/config/input.yml +++ b/x-pack/filebeat/module/aws/vpcflow/config/input.yml @@ -173,4 +173,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml b/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml index a4567959194..77c7ea3f5d0 100644 --- a/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml +++ b/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/activitylogs/config/file.yml b/x-pack/filebeat/module/azure/activitylogs/config/file.yml index 498a7906457..e9470671e07 100644 --- a/x-pack/filebeat/module/azure/activitylogs/config/file.yml +++ b/x-pack/filebeat/module/azure/activitylogs/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml b/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml index 3633cc4e5de..43a051f8dd3 100644 --- a/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml +++ b/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/auditlogs/config/file.yml b/x-pack/filebeat/module/azure/auditlogs/config/file.yml index 937446eb523..8e77b860e99 100644 --- a/x-pack/filebeat/module/azure/auditlogs/config/file.yml +++ b/x-pack/filebeat/module/azure/auditlogs/config/file.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml b/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml index dd8e1473a68..b971be2783c 100644 --- a/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml +++ b/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/signinlogs/config/file.yml b/x-pack/filebeat/module/azure/signinlogs/config/file.yml index 937446eb523..8e77b860e99 100644 --- a/x-pack/filebeat/module/azure/signinlogs/config/file.yml +++ b/x-pack/filebeat/module/azure/signinlogs/config/file.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/cef/log/config/input.yml b/x-pack/filebeat/module/cef/log/config/input.yml index 49a2b1829be..cc911a8611f 100644 --- a/x-pack/filebeat/module/cef/log/config/input.yml +++ b/x-pack/filebeat/module/cef/log/config/input.yml @@ -28,4 +28,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml b/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml index 12440f8fffe..f447d2aacdf 100644 --- a/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml +++ b/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml @@ -23,4 +23,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/coredns/log/config/coredns.yml b/x-pack/filebeat/module/coredns/log/config/coredns.yml index be7f27f551f..4f9992ae2d4 100644 --- a/x-pack/filebeat/module/coredns/log/config/coredns.yml +++ b/x-pack/filebeat/module/coredns/log/config/coredns.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml b/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml index 689bd725530..2af0eeca092 100644 --- a/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml +++ b/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml @@ -23,4 +23,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml b/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml index be7f27f551f..4f9992ae2d4 100644 --- a/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml +++ b/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/googlecloud/audit/config/input.yml b/x-pack/filebeat/module/googlecloud/audit/config/input.yml index 4c30e23b5e3..b5e392ee0b6 100644 --- a/x-pack/filebeat/module/googlecloud/audit/config/input.yml +++ b/x-pack/filebeat/module/googlecloud/audit/config/input.yml @@ -34,4 +34,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/googlecloud/firewall/config/input.yml b/x-pack/filebeat/module/googlecloud/firewall/config/input.yml index d6579aa9f47..39648636c59 100644 --- a/x-pack/filebeat/module/googlecloud/firewall/config/input.yml +++ b/x-pack/filebeat/module/googlecloud/firewall/config/input.yml @@ -35,4 +35,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml b/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml index cf89526bbe5..f1976195687 100644 --- a/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml +++ b/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml @@ -34,4 +34,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/gsuite/admin/config/config.yml b/x-pack/filebeat/module/gsuite/admin/config/config.yml index b5c62d3657f..9ec19a83615 100644 --- a/x-pack/filebeat/module/gsuite/admin/config/config.yml +++ b/x-pack/filebeat/module/gsuite/admin/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/drive/config/config.yml b/x-pack/filebeat/module/gsuite/drive/config/config.yml index 5f1bd6ecbf3..92e464164b0 100644 --- a/x-pack/filebeat/module/gsuite/drive/config/config.yml +++ b/x-pack/filebeat/module/gsuite/drive/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/groups/config/config.yml b/x-pack/filebeat/module/gsuite/groups/config/config.yml index 46a3ed338d9..ba6890c80e4 100644 --- a/x-pack/filebeat/module/gsuite/groups/config/config.yml +++ b/x-pack/filebeat/module/gsuite/groups/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/login/config/config.yml b/x-pack/filebeat/module/gsuite/login/config/config.yml index b501012b3d2..95ccc04ed2c 100644 --- a/x-pack/filebeat/module/gsuite/login/config/config.yml +++ b/x-pack/filebeat/module/gsuite/login/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/saml/config/config.yml b/x-pack/filebeat/module/gsuite/saml/config/config.yml index 1e703737e0d..8d1c7645fda 100644 --- a/x-pack/filebeat/module/gsuite/saml/config/config.yml +++ b/x-pack/filebeat/module/gsuite/saml/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml b/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml index 773ab620173..dc9e3d353e6 100644 --- a/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml +++ b/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml b/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml index 2130bb419d2..bca14ecccaa 100644 --- a/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml +++ b/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/iptables/log/config/input.yml b/x-pack/filebeat/module/iptables/log/config/input.yml index 6183661122a..bcfde17c3c5 100644 --- a/x-pack/filebeat/module/iptables/log/config/input.yml +++ b/x-pack/filebeat/module/iptables/log/config/input.yml @@ -55,4 +55,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/misp/threat/config/input.yml b/x-pack/filebeat/module/misp/threat/config/input.yml index 3ff985b07f3..26010fc478a 100644 --- a/x-pack/filebeat/module/misp/threat/config/input.yml +++ b/x-pack/filebeat/module/misp/threat/config/input.yml @@ -37,4 +37,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/mssql/log/config/config.yml b/x-pack/filebeat/module/mssql/log/config/config.yml index 31990fb32c3..0ac3d9da2c2 100644 --- a/x-pack/filebeat/module/mssql/log/config/config.yml +++ b/x-pack/filebeat/module/mssql/log/config/config.yml @@ -14,4 +14,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/netflow/log/config/netflow.yml b/x-pack/filebeat/module/netflow/log/config/netflow.yml index b34160bd6b9..f56ffeed226 100644 --- a/x-pack/filebeat/module/netflow/log/config/netflow.yml +++ b/x-pack/filebeat/module/netflow/log/config/netflow.yml @@ -31,4 +31,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/o365/audit/config/input.yml b/x-pack/filebeat/module/o365/audit/config/input.yml index d41a5bb9aab..ec30daef127 100644 --- a/x-pack/filebeat/module/o365/audit/config/input.yml +++ b/x-pack/filebeat/module/o365/audit/config/input.yml @@ -62,4 +62,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/okta/system/config/input.yml b/x-pack/filebeat/module/okta/system/config/input.yml index a544ab8dc65..487dfdf165e 100644 --- a/x-pack/filebeat/module/okta/system/config/input.yml +++ b/x-pack/filebeat/module/okta/system/config/input.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/rabbitmq/log/config/log.yml b/x-pack/filebeat/module/rabbitmq/log/config/log.yml index bc46f2458c8..1f32bbf71cf 100644 --- a/x-pack/filebeat/module/rabbitmq/log/config/log.yml +++ b/x-pack/filebeat/module/rabbitmq/log/config/log.yml @@ -18,4 +18,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/sophos/xg/config/config.yml b/x-pack/filebeat/module/sophos/xg/config/config.yml index 86c12e9ec08..8585ff4a19c 100644 --- a/x-pack/filebeat/module/sophos/xg/config/config.yml +++ b/x-pack/filebeat/module/sophos/xg/config/config.yml @@ -27,7 +27,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - add_fields: target: '_conf' fields: diff --git a/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml b/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml index 6b6fcf216f2..5794bd0ca6f 100644 --- a/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml +++ b/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml @@ -22,4 +22,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/connection/config/connection.yml b/x-pack/filebeat/module/zeek/connection/config/connection.yml index 8a79295724f..f6caa143689 100644 --- a/x-pack/filebeat/module/zeek/connection/config/connection.yml +++ b/x-pack/filebeat/module/zeek/connection/config/connection.yml @@ -102,4 +102,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml b/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml index 45010e08973..7d7f0c87353 100644 --- a/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml +++ b/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml @@ -58,4 +58,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml b/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml index f1a2f0ced3a..b049d571c14 100644 --- a/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml +++ b/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml @@ -120,4 +120,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml b/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml index 7730d2b6d85..67033a42cf2 100644 --- a/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml +++ b/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml @@ -68,4 +68,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dns/config/dns.yml b/x-pack/filebeat/module/zeek/dns/config/dns.yml index 86a2022d695..9e0f7e952e2 100644 --- a/x-pack/filebeat/module/zeek/dns/config/dns.yml +++ b/x-pack/filebeat/module/zeek/dns/config/dns.yml @@ -203,4 +203,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dpd/config/dpd.yml b/x-pack/filebeat/module/zeek/dpd/config/dpd.yml index acc6defd4df..67565ef21ab 100644 --- a/x-pack/filebeat/module/zeek/dpd/config/dpd.yml +++ b/x-pack/filebeat/module/zeek/dpd/config/dpd.yml @@ -57,4 +57,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/files/config/files.yml b/x-pack/filebeat/module/zeek/files/config/files.yml index 65c067609c9..0e0ce22e2bf 100644 --- a/x-pack/filebeat/module/zeek/files/config/files.yml +++ b/x-pack/filebeat/module/zeek/files/config/files.yml @@ -42,4 +42,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ftp/config/ftp.yml b/x-pack/filebeat/module/zeek/ftp/config/ftp.yml index 51a3c053576..671a1162c66 100644 --- a/x-pack/filebeat/module/zeek/ftp/config/ftp.yml +++ b/x-pack/filebeat/module/zeek/ftp/config/ftp.yml @@ -86,4 +86,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/http/config/http.yml b/x-pack/filebeat/module/zeek/http/config/http.yml index 4c7c812d0cc..8a43f07f0dd 100644 --- a/x-pack/filebeat/module/zeek/http/config/http.yml +++ b/x-pack/filebeat/module/zeek/http/config/http.yml @@ -93,4 +93,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/intel/config/intel.yml b/x-pack/filebeat/module/zeek/intel/config/intel.yml index 5b73833ea35..80d565745f1 100644 --- a/x-pack/filebeat/module/zeek/intel/config/intel.yml +++ b/x-pack/filebeat/module/zeek/intel/config/intel.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/irc/config/irc.yml b/x-pack/filebeat/module/zeek/irc/config/irc.yml index 54aaa9d4f4b..7e09f9fe376 100644 --- a/x-pack/filebeat/module/zeek/irc/config/irc.yml +++ b/x-pack/filebeat/module/zeek/irc/config/irc.yml @@ -72,4 +72,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/modbus/config/modbus.yml b/x-pack/filebeat/module/zeek/modbus/config/modbus.yml index d656ad0ab6a..a65bb88c0d0 100644 --- a/x-pack/filebeat/module/zeek/modbus/config/modbus.yml +++ b/x-pack/filebeat/module/zeek/modbus/config/modbus.yml @@ -73,4 +73,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/mysql/config/mysql.yml b/x-pack/filebeat/module/zeek/mysql/config/mysql.yml index 4c6e70d9f1c..963c8469fe1 100644 --- a/x-pack/filebeat/module/zeek/mysql/config/mysql.yml +++ b/x-pack/filebeat/module/zeek/mysql/config/mysql.yml @@ -72,4 +72,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/notice/config/notice.yml b/x-pack/filebeat/module/zeek/notice/config/notice.yml index 649d3f3ba97..07ccbfb76b4 100644 --- a/x-pack/filebeat/module/zeek/notice/config/notice.yml +++ b/x-pack/filebeat/module/zeek/notice/config/notice.yml @@ -104,4 +104,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml b/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml index c67f66b54b9..135086e19f9 100644 --- a/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml +++ b/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml @@ -86,4 +86,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml b/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml index 874a0fde6d9..933f829b747 100644 --- a/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml +++ b/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml @@ -64,4 +64,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/pe/config/pe.yml b/x-pack/filebeat/module/zeek/pe/config/pe.yml index 3df430d7dc9..cfb8ea8c4b0 100644 --- a/x-pack/filebeat/module/zeek/pe/config/pe.yml +++ b/x-pack/filebeat/module/zeek/pe/config/pe.yml @@ -33,4 +33,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/radius/config/radius.yml b/x-pack/filebeat/module/zeek/radius/config/radius.yml index 66fccaa3f5c..471275d5ece 100644 --- a/x-pack/filebeat/module/zeek/radius/config/radius.yml +++ b/x-pack/filebeat/module/zeek/radius/config/radius.yml @@ -58,4 +58,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/rdp/config/rdp.yml b/x-pack/filebeat/module/zeek/rdp/config/rdp.yml index de71448fb1b..071cc59fab9 100644 --- a/x-pack/filebeat/module/zeek/rdp/config/rdp.yml +++ b/x-pack/filebeat/module/zeek/rdp/config/rdp.yml @@ -88,4 +88,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/rfb/config/rfb.yml b/x-pack/filebeat/module/zeek/rfb/config/rfb.yml index 3adb14c55bf..417e9ab4dcd 100644 --- a/x-pack/filebeat/module/zeek/rfb/config/rfb.yml +++ b/x-pack/filebeat/module/zeek/rfb/config/rfb.yml @@ -73,4 +73,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/sip/config/sip.yml b/x-pack/filebeat/module/zeek/sip/config/sip.yml index 7aa30034de2..97885a1e2dc 100644 --- a/x-pack/filebeat/module/zeek/sip/config/sip.yml +++ b/x-pack/filebeat/module/zeek/sip/config/sip.yml @@ -95,4 +95,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml b/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml index 763379a7d88..885669e4c9c 100644 --- a/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml +++ b/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml @@ -101,4 +101,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml b/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml index c5f7c2e53e7..a3f02a7558f 100644 --- a/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml +++ b/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml @@ -61,4 +61,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml b/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml index 624454ed171..59a68e2054b 100644 --- a/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml +++ b/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml @@ -57,4 +57,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smtp/config/smtp.yml b/x-pack/filebeat/module/zeek/smtp/config/smtp.yml index 5b2f6595df2..0af383a7187 100644 --- a/x-pack/filebeat/module/zeek/smtp/config/smtp.yml +++ b/x-pack/filebeat/module/zeek/smtp/config/smtp.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/snmp/config/snmp.yml b/x-pack/filebeat/module/zeek/snmp/config/snmp.yml index 0c7e05ce6db..1fa024742be 100644 --- a/x-pack/filebeat/module/zeek/snmp/config/snmp.yml +++ b/x-pack/filebeat/module/zeek/snmp/config/snmp.yml @@ -69,4 +69,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/socks/config/socks.yml b/x-pack/filebeat/module/zeek/socks/config/socks.yml index f834e5d1bcc..99613e4bfe3 100644 --- a/x-pack/filebeat/module/zeek/socks/config/socks.yml +++ b/x-pack/filebeat/module/zeek/socks/config/socks.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ssh/config/ssh.yml b/x-pack/filebeat/module/zeek/ssh/config/ssh.yml index c855d49dff2..45f160cd99d 100644 --- a/x-pack/filebeat/module/zeek/ssh/config/ssh.yml +++ b/x-pack/filebeat/module/zeek/ssh/config/ssh.yml @@ -76,4 +76,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/stats/config/stats.yml b/x-pack/filebeat/module/zeek/stats/config/stats.yml index cdf243f7a45..45c22b6b3d2 100644 --- a/x-pack/filebeat/module/zeek/stats/config/stats.yml +++ b/x-pack/filebeat/module/zeek/stats/config/stats.yml @@ -97,4 +97,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/syslog/config/syslog.yml b/x-pack/filebeat/module/zeek/syslog/config/syslog.yml index a89601cb717..0d1b8fc05e5 100644 --- a/x-pack/filebeat/module/zeek/syslog/config/syslog.yml +++ b/x-pack/filebeat/module/zeek/syslog/config/syslog.yml @@ -57,4 +57,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml b/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml index 13a2a37cc69..741a0d7e454 100644 --- a/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml +++ b/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml @@ -45,4 +45,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml b/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml index ac636e9e7c0..243f83de760 100644 --- a/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml +++ b/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml @@ -56,4 +56,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/weird/config/weird.yml b/x-pack/filebeat/module/zeek/weird/config/weird.yml index 5807f95927b..4a4bab4dc33 100644 --- a/x-pack/filebeat/module/zeek/weird/config/weird.yml +++ b/x-pack/filebeat/module/zeek/weird/config/weird.yml @@ -56,4 +56,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zoom/webhook/config/webhook.yml b/x-pack/filebeat/module/zoom/webhook/config/webhook.yml index 207da5447e1..ac04136779c 100644 --- a/x-pack/filebeat/module/zoom/webhook/config/webhook.yml +++ b/x-pack/filebeat/module/zoom/webhook/config/webhook.yml @@ -33,4 +33,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 From 92b34600fcb54985bb4b9ee35aa96c07086645ea Mon Sep 17 00:00:00 2001 From: Chris Mark Date: Mon, 5 Oct 2020 10:33:06 +0300 Subject: [PATCH 14/21] Fix leftover delpoyment example (#21474) Signed-off-by: chrismark --- metricbeat/docs/running-on-kubernetes.asciidoc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/metricbeat/docs/running-on-kubernetes.asciidoc b/metricbeat/docs/running-on-kubernetes.asciidoc index 786977cb294..f852c153e5e 100644 --- a/metricbeat/docs/running-on-kubernetes.asciidoc +++ b/metricbeat/docs/running-on-kubernetes.asciidoc @@ -192,11 +192,6 @@ $ kubectl --namespace=kube-system get ds/metricbeat NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE-SELECTOR AGE metricbeat 32 32 0 32 0 1m - -$ kubectl --namespace=kube-system get deploy/metricbeat - -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -metricbeat 1 1 1 1 1m ------------------------------------------------ Metrics should start flowing to Elasticsearch. From b9569ff7e7c4d6901e19bcdaf08bde084908de01 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Mon, 5 Oct 2020 09:38:22 +0200 Subject: [PATCH 15/21] Prompt only when agent is already enrolled (#21473) Prompt only when agent is already enrolled (#21473) --- x-pack/elastic-agent/pkg/agent/cmd/enroll.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go index 6a604554136..a92766b9c07 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go @@ -119,7 +119,9 @@ func enroll(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args if fromInstall { force = true } - if !force { + + // prompt only when it is not forced and is already enrolled + if !force && (cfg.Fleet != nil && cfg.Fleet.Enabled == true) { confirm, err := c.Confirm("This will replace your current settings. Do you want to continue?", true) if err != nil { return errors.New(err, "problem reading prompt response") From 3d8e7dd6fe114905610500ffdd0d8921ced759df Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Mon, 5 Oct 2020 10:51:51 +0200 Subject: [PATCH 16/21] Include original error when metricbeat fails to connect with Kafka (#21484) --- metricbeat/module/kafka/broker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metricbeat/module/kafka/broker.go b/metricbeat/module/kafka/broker.go index b9e78c7dacc..2e558d7944a 100644 --- a/metricbeat/module/kafka/broker.go +++ b/metricbeat/module/kafka/broker.go @@ -119,7 +119,7 @@ func (b *Broker) Connect() error { c, err := getClusterWideClient(b.Addr(), b.cfg) if err != nil { closeBroker(b.broker) - return fmt.Errorf("Could not get cluster client for advertised broker with address %v", b.Addr()) + return fmt.Errorf("getting cluster client for advertised broker with address %v: %w", b.Addr(), err) } b.client = c From 67a2d38203dbf04fc1ae8a186253a1e61917eb28 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Mon, 5 Oct 2020 10:52:49 +0200 Subject: [PATCH 17/21] Add support for app_state metricset (#20639) * mofidy doc * add metricset * chnagelog * config * work on app_state * remove extra * fix changelog * mage fmt update * work on mapping fields * work on tests * fix vis name * no default * fix tests * add headers --- CHANGELOG.next.asciidoc | 1 + metricbeat/docs/fields.asciidoc | 223 ++- .../metricbeat-azure-app-state-overview.png | Bin 0 -> 453884 bytes metricbeat/docs/modules/azure.asciidoc | 20 + .../docs/modules/azure/app_state.asciidoc | 24 + metricbeat/docs/modules_list.asciidoc | 3 +- x-pack/metricbeat/metricbeat.reference.yml | 8 + .../module/azure/_meta/config.reference.yml | 8 + .../metricbeat/module/azure/_meta/config.yml | 8 + .../module/azure/_meta/docs.asciidoc | 8 + .../metricbeat/module/azure/_meta/fields.yml | 4 + .../Metricbeat-azure-app-state-overview.json | 1509 +++++++++++++++++ .../module/azure/app_insights/_meta/data.json | 21 +- .../azure/app_insights/_meta/fields.yml | 4 - .../module/azure/app_insights/app_insights.go | 3 +- .../app_insights_integration_test.go | 10 + .../module/azure/app_insights/client.go | 3 - .../module/azure/app_insights/data.go | 229 ++- .../module/azure/app_insights/data_test.go | 20 +- .../module/azure/app_state/_meta/data.json | 32 + .../azure/app_state/_meta/docs.asciidoc | 12 + .../module/azure/app_state/_meta/fields.yml | 86 + .../app_state/app_state_integration_test.go | 38 + .../module/azure/app_state/app_state_test.go | 17 + .../module/azure/app_state/manifest.yml | 29 + x-pack/metricbeat/module/azure/data.go | 6 +- x-pack/metricbeat/module/azure/data_test.go | 4 +- x-pack/metricbeat/module/azure/fields.go | 2 +- x-pack/metricbeat/module/azure/module.yml | 1 + .../module/azure/test/integration.go | 20 + .../metricbeat/modules.d/azure.yml.disabled | 8 + 31 files changed, 2275 insertions(+), 86 deletions(-) create mode 100644 metricbeat/docs/images/metricbeat-azure-app-state-overview.png create mode 100644 metricbeat/docs/modules/azure/app_state.asciidoc create mode 100644 x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json create mode 100644 x-pack/metricbeat/module/azure/app_state/_meta/data.json create mode 100644 x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc create mode 100644 x-pack/metricbeat/module/azure/app_state/_meta/fields.yml create mode 100644 x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go create mode 100644 x-pack/metricbeat/module/azure/app_state/app_state_test.go create mode 100644 x-pack/metricbeat/module/azure/app_state/manifest.yml diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index fb1fae91eb0..68b77a46037 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -349,6 +349,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add missing info about the rest of the azure metricsets in the documentation. {pull}19601[19601] - Fix k8s scheduler compatibility issue. {pull}19699[19699] - Fix SQL module mapping NULL values as string {pull}18955[18955] {issue}18898[18898 +- Add support for azure light metricset app_stats. {pull}20639[20639] - Fix ec2 disk and network metrics to use Sum statistic method. {pull}20680[20680] - Fill cloud.account.name with accountID if account alias doesn't exist. {pull}20736[20736] - The Kibana collector applies backoff when errored at getting usage stats {pull}20772[20772] diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index ae34419db2e..26e83c19050 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -4665,6 +4665,16 @@ type: keyword The subscription ID +type: keyword + +-- + +*`azure.application_id`*:: ++ +-- +The application ID + + type: keyword -- @@ -4696,17 +4706,44 @@ application insights -*`azure.app_insights.application_id`*:: +*`azure.app_insights.start_date`*:: + -- -The application ID +The start date -type: keyword +type: date -- -*`azure.app_insights.start_date`*:: +*`azure.app_insights.end_date`*:: ++ +-- +The end date + + +type: date + +-- + +*`azure.app_insights.metrics.*.*`*:: ++ +-- +The metrics + + +type: object + +-- + +[float] +=== app_state + +application state + + + +*`azure.app_state.start_date`*:: + -- The start date @@ -4716,7 +4753,7 @@ type: date -- -*`azure.app_insights.end_date`*:: +*`azure.app_state.end_date`*:: + -- The end date @@ -4726,13 +4763,183 @@ type: date -- -*`azure.app_insights.metrics.*.*`*:: +*`azure.app_state.requests_count.sum`*:: + -- -The metrics +Request count -type: object +type: float + +-- + +*`azure.app_state.requests_failed.sum`*:: ++ +-- +Request failed count + + +type: float + +-- + +*`azure.app_state.users_count.unique`*:: ++ +-- +User count + + +type: float + +-- + +*`azure.app_state.sessions_count.unique`*:: ++ +-- +Session count + + +type: float + +-- + +*`azure.app_state.users_authenticated.unique`*:: ++ +-- +Authenticated users count + + +type: float + +-- + +*`azure.app_state.browser_timings_network_duration.avg`*:: ++ +-- +Browser timings network duration + + +type: float + +-- + +*`azure.app_state.browser_timings_send_duration.avg`*:: ++ +-- +Browser timings send duration + + +type: float + +-- + +*`azure.app_state.browser_timings_receive_uration.avg`*:: ++ +-- +Browser timings receive duration + + +type: float + +-- + +*`azure.app_state.browser_timings_processing_duration.avg`*:: ++ +-- +Browser timings processing duration + + +type: float + +-- + +*`azure.app_state.browser_timings_total_duration.avg`*:: ++ +-- +Browser timings total duration + + +type: float + +-- + +*`azure.app_state.exceptions_count.sum`*:: ++ +-- +Exception count + + +type: float + +-- + +*`azure.app_state.exceptions_browser.sum`*:: ++ +-- +Exception count at browser level + + +type: float + +-- + +*`azure.app_state.exceptions_server.sum`*:: ++ +-- +Exception count at server level + + +type: float + +-- + +*`azure.app_state.performance_counters_memory_available_bytes.avg`*:: ++ +-- +Performance counters memory available bytes + + +type: float + +-- + +*`azure.app_state.performance_counters_process_private_bytes.avg`*:: ++ +-- +Performance counters process private bytes + + +type: float + +-- + +*`azure.app_state.performance_counters_process_cpu_percentage_total.avg`*:: ++ +-- +Performance counters process cpu percentage total + + +type: float + +-- + +*`azure.app_state.performance_counters_process_cpu_percentage.avg`*:: ++ +-- +Performance counters process cpu percentage + + +type: float + +-- + +*`azure.app_state.performance_counters_processiobytes_per_second.avg`*:: ++ +-- +Performance counters process IO bytes per second + + +type: float -- diff --git a/metricbeat/docs/images/metricbeat-azure-app-state-overview.png b/metricbeat/docs/images/metricbeat-azure-app-state-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..cffc6e4ef038e0e7132b0bc87b68b27df29b80b0 GIT binary patch literal 453884 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%0AlJ7SDs1Ac;N`uk%eRdkh3)QVhrgGqy56Eiy#} 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

NZ$rkfL$ZX6D|3%7mUYj2%63%n!xT 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%0D5+yQ&!cGP6X1JBSxsspPX^!vJYS+@ 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Ξ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 Hd$IoquqCNB literal 0 HcmV?d00001 diff --git a/metricbeat/docs/modules/azure.asciidoc b/metricbeat/docs/modules/azure.asciidoc index 4db38120041..42d4d619c02 100644 --- a/metricbeat/docs/modules/azure.asciidoc +++ b/metricbeat/docs/modules/azure.asciidoc @@ -45,6 +45,10 @@ The Azure billing dashboards show relevant usage and forecast information: image::./images/metricbeat-azure-billing-overview.png[] +The Azure app_state dashboard shows relevant application insights information: + +image::./images/metricbeat-azure-app-state-overview.png[] + [float] === Module-specific configuration notes @@ -120,6 +124,10 @@ so the `period` for `billing` metricset should be `24h` or multiples of `24h`. === `app_insights` This metricset will collect application insights metrics, the `period` (interval) for the `app-insights` metricset is set by default at `300s`. +[float] +=== `app_state` +This metricset concentrate on the most relevant application insights metrics and provides a dashboard for visualization, the `period` (interval) for the `app_state` metricset is set by default at `300s`. + [float] [[azure-api-cost]] == Additional notes about metrics and costs @@ -242,6 +250,14 @@ metricbeat.modules: api_key: '' metrics: - id: ["requests/count", "requests/duration"] + +- module: azure + metricsets: + - app_state + enabled: true + period: 300s + application_id: '' + api_key: '' ---- [float] @@ -251,6 +267,8 @@ The following metricsets are available: * <> +* <> + * <> * <> @@ -271,6 +289,8 @@ The following metricsets are available: include::azure/app_insights.asciidoc[] +include::azure/app_state.asciidoc[] + include::azure/billing.asciidoc[] include::azure/compute_vm.asciidoc[] diff --git a/metricbeat/docs/modules/azure/app_state.asciidoc b/metricbeat/docs/modules/azure/app_state.asciidoc new file mode 100644 index 00000000000..10485dc818e --- /dev/null +++ b/metricbeat/docs/modules/azure/app_state.asciidoc @@ -0,0 +1,24 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// + +[[metricbeat-metricset-azure-app_state]] +[role="xpack"] +=== Azure app_state metricset + +beta[] + +include::../../../../x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc[] + + +==== Fields + +For a description of each field in the metricset, see the +<> section. + +Here is an example document generated by this metricset: + +[source,json] +---- +include::../../../../x-pack/metricbeat/module/azure/app_state/_meta/data.json[] +---- diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index 2232cf3b070..949657459db 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -33,7 +33,8 @@ This file is generated! See scripts/mage/docs_collector.go |<> beta[] |<> beta[] |<> |image:./images/icon-yes.png[Prebuilt dashboards are available] | -.10+| .10+| |<> beta[] +.11+| .11+| |<> beta[] +|<> beta[] |<> beta[] |<> |<> diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index ff9bffda33e..17c9234ea9f 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -343,6 +343,14 @@ metricbeat.modules: metrics: - id: ["requests/count", "requests/duration"] +- module: azure + metricsets: + - app_state + enabled: true + period: 300s + application_id: '' + api_key: '' + #--------------------------------- Beat Module --------------------------------- - module: beat metricsets: diff --git a/x-pack/metricbeat/module/azure/_meta/config.reference.yml b/x-pack/metricbeat/module/azure/_meta/config.reference.yml index 1f9ac04529e..b06e466a01f 100644 --- a/x-pack/metricbeat/module/azure/_meta/config.reference.yml +++ b/x-pack/metricbeat/module/azure/_meta/config.reference.yml @@ -102,3 +102,11 @@ api_key: '' metrics: - id: ["requests/count", "requests/duration"] + +- module: azure + metricsets: + - app_state + enabled: true + period: 300s + application_id: '' + api_key: '' diff --git a/x-pack/metricbeat/module/azure/_meta/config.yml b/x-pack/metricbeat/module/azure/_meta/config.yml index 0f497af6fb4..f7215d4f991 100644 --- a/x-pack/metricbeat/module/azure/_meta/config.yml +++ b/x-pack/metricbeat/module/azure/_meta/config.yml @@ -111,3 +111,11 @@ # api_key: '' # metrics: # - id: ["requests/count", "requests/duration"] + +#- module: azure +# metricsets: +# - app_state +# enabled: true +# period: 300s +# application_id: '' +# api_key: '' diff --git a/x-pack/metricbeat/module/azure/_meta/docs.asciidoc b/x-pack/metricbeat/module/azure/_meta/docs.asciidoc index b0f76ecb623..01f6389ab93 100644 --- a/x-pack/metricbeat/module/azure/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/azure/_meta/docs.asciidoc @@ -37,6 +37,10 @@ The Azure billing dashboards show relevant usage and forecast information: image::./images/metricbeat-azure-billing-overview.png[] +The Azure app_state dashboard shows relevant application insights information: + +image::./images/metricbeat-azure-app-state-overview.png[] + [float] === Module-specific configuration notes @@ -112,6 +116,10 @@ so the `period` for `billing` metricset should be `24h` or multiples of `24h`. === `app_insights` This metricset will collect application insights metrics, the `period` (interval) for the `app-insights` metricset is set by default at `300s`. +[float] +=== `app_state` +This metricset concentrate on the most relevant application insights metrics and provides a dashboard for visualization, the `period` (interval) for the `app_state` metricset is set by default at `300s`. + [float] [[azure-api-cost]] == Additional notes about metrics and costs diff --git a/x-pack/metricbeat/module/azure/_meta/fields.yml b/x-pack/metricbeat/module/azure/_meta/fields.yml index c6471dc108d..a6476fcc957 100644 --- a/x-pack/metricbeat/module/azure/_meta/fields.yml +++ b/x-pack/metricbeat/module/azure/_meta/fields.yml @@ -39,6 +39,10 @@ type: keyword description: > The subscription ID + - name: application_id + type: keyword + description: > + The application ID - name: dimensions.* type: object object_type: keyword diff --git a/x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json b/x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json new file mode 100644 index 00000000000..b447a6b276e --- /dev/null +++ b/x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json @@ -0,0 +1,1509 @@ +{ + "objects": [ + { + "attributes": { + "description": "Provides relevant app insights metrics for web applications", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [ + { + "$state": { + "store": "appState" + }, + "meta": { + "alias": null, + "controlledBy": "1532342651170", + "disabled": false, + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "key": "azure.app_state.application_id", + "negate": false, + "params": { + "query": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + }, + "type": "phrase" + }, + "query": { + "match_phrase": { + "azure.app_state.application_id": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + } + } + } + ], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "optionsJSON": { + "hidePanelTitles": false, + "useMargins": true + }, + "panelsJSON": [ + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "307a1ecd-284c-4f35-9a3c-d5b77c9a9c82", + "w": 7, + "x": 0, + "y": 0 + }, + "panelIndex": "307a1ecd-284c-4f35-9a3c-d5b77c9a9c82", + "panelRefName": "panel_0", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Exceptions" + }, + "gridData": { + "h": 15, + "i": "654e745f-360d-4898-89b6-57f788c5f540", + "w": 20, + "x": 7, + "y": 0 + }, + "panelIndex": "654e745f-360d-4898-89b6-57f788c5f540", + "panelRefName": "panel_1", + "title": "Exceptions", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Available Memory" + }, + "gridData": { + "h": 15, + "i": "5adca737-559d-4b4f-9fa7-58841daa99c5", + "w": 21, + "x": 27, + "y": 0 + }, + "panelIndex": "5adca737-559d-4b4f-9fa7-58841daa99c5", + "panelRefName": "panel_2", + "title": "Available Memory", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "531cf244-45e0-43c3-9920-8f32397bd973", + "w": 8, + "x": 0, + "y": 15 + }, + "panelIndex": "531cf244-45e0-43c3-9920-8f32397bd973", + "panelRefName": "panel_3", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "b9242495-babc-48a7-9ad7-56c62b1dc117", + "w": 8, + "x": 8, + "y": 15 + }, + "panelIndex": "b9242495-babc-48a7-9ad7-56c62b1dc117", + "panelRefName": "panel_4", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "d311025a-f5c5-4e48-9f1c-710f59264c43", + "w": 8, + "x": 16, + "y": 15 + }, + "panelIndex": "d311025a-f5c5-4e48-9f1c-710f59264c43", + "panelRefName": "panel_5", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Requests" + }, + "gridData": { + "h": 15, + "i": "48974418-b1f7-4050-921e-a83771e125ae", + "w": 24, + "x": 24, + "y": 15 + }, + "panelIndex": "48974418-b1f7-4050-921e-a83771e125ae", + "panelRefName": "panel_6", + "title": "Requests", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Browser Send/Receive Duration" + }, + "gridData": { + "h": 15, + "i": "39d20db1-316a-4ff3-811a-5571cb4497c3", + "w": 24, + "x": 0, + "y": 30 + }, + "panelIndex": "39d20db1-316a-4ff3-811a-5571cb4497c3", + "panelRefName": "panel_7", + "title": "Browser Send/Receive Duration", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Browser Networking/Processing Duration" + }, + "gridData": { + "h": 15, + "i": "bc810208-0395-4c70-9057-d7307e064e43", + "w": 24, + "x": 24, + "y": 30 + }, + "panelIndex": "bc810208-0395-4c70-9057-d7307e064e43", + "panelRefName": "panel_8", + "title": "Browser Networking/Processing Duration", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Process CPU Usage" + }, + "gridData": { + "h": 15, + "i": "ecf6fbfa-ba65-481e-af85-07fd9d5feb5f", + "w": 24, + "x": 0, + "y": 45 + }, + "panelIndex": "ecf6fbfa-ba65-481e-af85-07fd9d5feb5f", + "panelRefName": "panel_9", + "title": "Process CPU Usage", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Process Private Bytes" + }, + "gridData": { + "h": 15, + "i": "40a1b80b-cd62-446d-91aa-a971bb3769e7", + "w": 24, + "x": 24, + "y": 45 + }, + "panelIndex": "40a1b80b-cd62-446d-91aa-a971bb3769e7", + "panelRefName": "panel_10", + "title": "Process Private Bytes", + "version": "7.9.2" + } + ], + "timeRestore": false, + "title": "[Metricbeat Azure] App State Overview", + "version": 1 + }, + "id": "d5fbd610-03d9-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "dashboard": "7.3.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + }, + { + "id": "2e5183a0-03da-11eb-8034-63f2039e9d3f", + "name": "panel_0", + "type": "visualization" + }, + { + "id": "1064f9a0-04a5-11eb-8034-63f2039e9d3f", + "name": "panel_1", + "type": "lens" + }, + { + "id": "76cc1d70-04a7-11eb-8034-63f2039e9d3f", + "name": "panel_2", + "type": "lens" + }, + { + "id": "a89c8fd0-03ec-11eb-8034-63f2039e9d3f", + "name": "panel_3", + "type": "lens" + }, + { + "id": "cb5ec410-03ed-11eb-8034-63f2039e9d3f", + "name": "panel_4", + "type": "lens" + }, + { + "id": "0df175c0-03ee-11eb-8034-63f2039e9d3f", + "name": "panel_5", + "type": "lens" + }, + { + "id": "f0678020-04a2-11eb-8034-63f2039e9d3f", + "name": "panel_6", + "type": "lens" + }, + { + "id": "e2704140-04a3-11eb-8034-63f2039e9d3f", + "name": "panel_7", + "type": "lens" + }, + { + "id": "0e74dee0-04a4-11eb-8034-63f2039e9d3f", + "name": "panel_8", + "type": "lens" + }, + { + "id": "cfa361a0-04a8-11eb-8034-63f2039e9d3f", + "name": "panel_9", + "type": "lens" + }, + { + "id": "2b54b2c0-04a8-11eb-8034-63f2039e9d3f", + "name": "panel_10", + "type": "lens" + } + ], + "type": "dashboard", + "updated_at": "2020-10-02T12:22:06.090Z", + "version": "WzMzMDEsMl0=" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [ + { + "$state": { + "store": "appState" + }, + "meta": { + "alias": null, + "controlledBy": "1532342651170", + "disabled": false, + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "key": "azure.application_id", + "negate": false, + "params": { + "query": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + }, + "type": "phrase" + }, + "query": { + "match_phrase": { + "azure.application_id": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + } + } + } + ], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "App State Filters [Metricbeat Azure]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "controls": [ + { + "fieldName": "azure.application_id", + "id": "1532342651170", + "indexPatternRefName": "control_0_index_pattern", + "label": "Application ID", + "options": { + "multiselect": true, + "order": "desc", + "size": 10, + "type": "terms" + }, + "parent": "", + "type": "list" + }, + { + "fieldName": "azure.dimensions.request_url_host", + "id": "1601559750853", + "indexPatternRefName": "control_1_index_pattern", + "label": "Host URL", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "1532342651170", + "type": "list" + }, + { + "fieldName": "azure.dimensions.cloud_role_name", + "id": "1601640368472", + "indexPatternRefName": "control_2_index_pattern", + "label": "Name", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "1532342651170", + "type": "list" + }, + { + "fieldName": "azure.dimensions.browser_timing_url_host", + "id": "1601640439434", + "indexPatternRefName": "control_3_index_pattern", + "label": "Browser URL Host", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "1532342651170", + "type": "list" + } + ], + "pinFilters": false, + "updateFiltersOnChange": true, + "useTimeFilter": false + }, + "title": "App State Filters [Metricbeat Azure]", + "type": "input_control_vis" + } + }, + "id": "2e5183a0-03da-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_0_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_1_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_2_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_3_index_pattern", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-02T12:22:51.232Z", + "version": "WzMzMTIsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"5788331a-267d-426a-a68e-94a5310af644\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.exception_type\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.exceptions_count.sum\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.exceptions_server.sum\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"9e183a5e-3dba-4929-b07e-2a3321f7926b\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.exceptions_browser.sum\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-4-5788331a-267d-426a-a68e-94a5310af644\\\":{\\\"label\\\":\\\"Type\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.exception_type\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"5788331a-267d-426a-a68e-94a5310af644\\\"},\\\"col-5-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Total\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.exceptions_count.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"col-6-e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\":{\\\"label\\\":\\\"Server \\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.exceptions_server.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\"},\\\"col-7-9e183a5e-3dba-4929-b07e-2a3321f7926b\\\":{\\\"label\\\":\\\"Browser\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.exceptions_browser.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"9e183a5e-3dba-4929-b07e-2a3321f7926b\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Total\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"5788331a-267d-426a-a68e-94a5310af644\" seriesType=\"area_stacked\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" accessors=\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\" accessors=\"9e183a5e-3dba-4929-b07e-2a3321f7926b\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Total\\\",\\\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\":\\\"Server \\\",\\\"9e183a5e-3dba-4929-b07e-2a3321f7926b\\\":\\\"Browser\\\",\\\"5788331a-267d-426a-a68e-94a5310af644\\\":\\\"Type\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "5788331a-267d-426a-a68e-94a5310af644", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "e5c93c50-bb0a-4609-a7ce-7003f2f9a20e", + "9e183a5e-3dba-4929-b07e-2a3321f7926b" + ], + "columns": { + "5788331a-267d-426a-a68e-94a5310af644": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Type", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.exception_type" + }, + "9e183a5e-3dba-4929-b07e-2a3321f7926b": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Browser", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.exceptions_browser.sum" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.exceptions_count.sum" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + }, + "e5c93c50-bb0a-4609-a7ce-7003f2f9a20e": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Server ", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.exceptions_server.sum" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "e5c93c50-bb0a-4609-a7ce-7003f2f9a20e", + "9e183a5e-3dba-4929-b07e-2a3321f7926b" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area_stacked", + "showGridlines": false, + "splitAccessor": "5788331a-267d-426a-a68e-94a5310af644", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area_stacked" + } + }, + "title": "App state Exceptions [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "1064f9a0-04a5-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:53:16.483Z", + "version": "WzI5NjMsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_memory_available_bytes.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-2-a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":{\\\"label\\\":\\\"Instance\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\"},\\\"col-3-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Available memory\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_memory_available_bytes.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" decimals=2}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Available memory\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\" seriesType=\"area\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Available memory\\\",\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":\\\"Instance\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "columns": { + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Instance", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.cloud_role_instance" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Available memory", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_memory_available_bytes.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Memory [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "76cc1d70-04a7-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T12:04:46.406Z", + "version": "WzMwNTcsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"82e648a8-6d9a-4ae0-9449-b802ce1ac723\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true aggConfigs=\"[{\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.users_count.unique\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\":{\\\"label\\\":\\\"Unique users\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.users_count.unique\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\"}}\"}\n| lens_metric_chart title=\"Unique users\" accessor=\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\" mode=\"full\"", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "82e648a8-6d9a-4ae0-9449-b802ce1ac723": { + "columnOrder": [ + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1" + ], + "columns": { + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Unique users", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.users_count.unique" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "accessor": "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1", + "layerId": "82e648a8-6d9a-4ae0-9449-b802ce1ac723" + } + }, + "title": "App state Unique users [Metricbeat Azure]", + "visualizationType": "lnsMetric" + }, + "id": "a89c8fd0-03ec-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-01T13:47:34.093Z", + "version": "WzEzMzAsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"82e648a8-6d9a-4ae0-9449-b802ce1ac723\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true aggConfigs=\"[{\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.users_authenticated.unique\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\":{\\\"label\\\":\\\"Unique authenticated users\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.users_authenticated.unique\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\"}}\"}\n| lens_metric_chart title=\"Unique authenticated users\" accessor=\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\" mode=\"full\"", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "82e648a8-6d9a-4ae0-9449-b802ce1ac723": { + "columnOrder": [ + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1" + ], + "columns": { + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Unique authenticated users", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.users_authenticated.unique" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "accessor": "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1", + "layerId": "82e648a8-6d9a-4ae0-9449-b802ce1ac723" + } + }, + "title": "App state Unique authenticated users [Metricbeat Azure]", + "visualizationType": "lnsMetric" + }, + "id": "cb5ec410-03ed-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-01T13:55:41.904Z", + "version": "WzE0MjAsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"82e648a8-6d9a-4ae0-9449-b802ce1ac723\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true aggConfigs=\"[{\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.sessions_count.unique\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\":{\\\"label\\\":\\\"Unique sessions\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.sessions_count.unique\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\"}}\"}\n| lens_metric_chart title=\"Unique sessions\" accessor=\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\" mode=\"full\"", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "82e648a8-6d9a-4ae0-9449-b802ce1ac723": { + "columnOrder": [ + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1" + ], + "columns": { + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Unique sessions", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.sessions_count.unique" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "accessor": "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1", + "layerId": "82e648a8-6d9a-4ae0-9449-b802ce1ac723" + } + }, + "title": "App state Unique sessions [Metricbeat Azure]", + "visualizationType": "lnsMetric" + }, + "id": "0df175c0-03ee-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-01T13:57:33.596Z", + "version": "WzE0NjAsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"8864c98b-413a-484f-a61d-336a63ef3f13\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.request_url_host\\\",\\\"orderBy\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.requests_count.sum\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.requests_failed.sum\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-3-8864c98b-413a-484f-a61d-336a63ef3f13\\\":{\\\"label\\\":\\\"Host URL\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.request_url_host\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"8864c98b-413a-484f-a61d-336a63ef3f13\\\"},\\\"col-4-9ec4d260-e302-46c4-ac09-50ef54627894\\\":{\\\"label\\\":\\\"Total requests\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.requests_count.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\"},\\\"col-5-a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\":{\\\"label\\\":\\\"Failed requests\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.requests_failed.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Total requests\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"8864c98b-413a-484f-a61d-336a63ef3f13\" seriesType=\"area\" accessors=\"9ec4d260-e302-46c4-ac09-50ef54627894\" accessors=\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\" columnToLabel=\"{\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\":\\\"Total requests\\\",\\\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\":\\\"Failed requests\\\",\\\"8864c98b-413a-484f-a61d-336a63ef3f13\\\":\\\"Host URL\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "8864c98b-413a-484f-a61d-336a63ef3f13", + "9ec4d260-e302-46c4-ac09-50ef54627894", + "a47e59dc-fb62-42f8-90e1-236c7c5a073d" + ], + "columns": { + "8864c98b-413a-484f-a61d-336a63ef3f13": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Host URL", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "9ec4d260-e302-46c4-ac09-50ef54627894", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.request_url_host" + }, + "9ec4d260-e302-46c4-ac09-50ef54627894": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total requests", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.requests_count.sum" + }, + "a47e59dc-fb62-42f8-90e1-236c7c5a073d": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Failed requests", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.requests_failed.sum" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "9ec4d260-e302-46c4-ac09-50ef54627894", + "a47e59dc-fb62-42f8-90e1-236c7c5a073d" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "8864c98b-413a-484f-a61d-336a63ef3f13", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Requests [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "f0678020-04a2-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:32:22.946Z", + "version": "WzI0MzUsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"orderBy\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_send_duration.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_total_duration.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"988e9976-3471-478c-89f6-11fd46458d7f\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_receive_duration.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-4-4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":{\\\"label\\\":\\\"Url Path\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\"},\\\"col-5-be6a3d8b-9428-480b-a7b3-071127726093\\\":{\\\"label\\\":\\\"Send duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_send_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"params\\\":{},\\\"customLabel\\\":true,\\\"id\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\"},\\\"col-6-6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\":{\\\"label\\\":\\\"Total duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_total_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\"},\\\"col-7-988e9976-3471-478c-89f6-11fd46458d7f\\\":{\\\"label\\\":\\\"Receive duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_receive_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"988e9976-3471-478c-89f6-11fd46458d7f\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Send duration\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"4d4c068a-0194-4d54-a1fa-3863c3df9331\" seriesType=\"bar\" accessors=\"be6a3d8b-9428-480b-a7b3-071127726093\" accessors=\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\" accessors=\"988e9976-3471-478c-89f6-11fd46458d7f\" columnToLabel=\"{\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\":\\\"Send duration\\\",\\\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\":\\\"Total duration\\\",\\\"988e9976-3471-478c-89f6-11fd46458d7f\\\":\\\"Receive duration\\\",\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":\\\"Url Path\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "be6a3d8b-9428-480b-a7b3-071127726093", + "6bc1fd35-168d-42d5-b9c8-7078896d8ce4", + "988e9976-3471-478c-89f6-11fd46458d7f" + ], + "columns": { + "4d4c068a-0194-4d54-a1fa-3863c3df9331": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Url Path", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "be6a3d8b-9428-480b-a7b3-071127726093", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.browser_timing_url_path" + }, + "6bc1fd35-168d-42d5-b9c8-7078896d8ce4": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_total_duration.avg" + }, + "988e9976-3471-478c-89f6-11fd46458d7f": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Receive duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_receive_duration.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + }, + "be6a3d8b-9428-480b-a7b3-071127726093": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Send duration", + "operationType": "avg", + "params": {}, + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_send_duration.avg" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "be6a3d8b-9428-480b-a7b3-071127726093", + "6bc1fd35-168d-42d5-b9c8-7078896d8ce4", + "988e9976-3471-478c-89f6-11fd46458d7f" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "bar", + "showGridlines": false, + "splitAccessor": "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "bar" + } + }, + "title": "App state Browser Send/Receive Duration [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "e2704140-04a3-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:39:09.012Z", + "version": "WzI2MzQsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"orderBy\\\":\\\"_key\\\",\\\"order\\\":\\\"asc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_network_duration.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"ab158cba-532f-47f8-8450-db883504dc0f\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_processing_duration.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-3-4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":{\\\"label\\\":\\\"Url Path\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"alphabetical\\\"},\\\"orderDirection\\\":\\\"asc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\"},\\\"col-4-b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\":{\\\"label\\\":\\\"Networking duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_network_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\"},\\\"col-5-ab158cba-532f-47f8-8450-db883504dc0f\\\":{\\\"label\\\":\\\"Processing duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_processing_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"ab158cba-532f-47f8-8450-db883504dc0f\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Networking duration\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"4d4c068a-0194-4d54-a1fa-3863c3df9331\" seriesType=\"bar\" accessors=\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\" accessors=\"ab158cba-532f-47f8-8450-db883504dc0f\" columnToLabel=\"{\\\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\":\\\"Networking duration\\\",\\\"ab158cba-532f-47f8-8450-db883504dc0f\\\":\\\"Processing duration\\\",\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":\\\"Url Path\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "b5a75764-e98b-434b-a0f0-5658a4aa1cf6", + "ab158cba-532f-47f8-8450-db883504dc0f" + ], + "columns": { + "4d4c068a-0194-4d54-a1fa-3863c3df9331": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Url Path", + "operationType": "terms", + "params": { + "orderBy": { + "type": "alphabetical" + }, + "orderDirection": "asc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.browser_timing_url_path" + }, + "ab158cba-532f-47f8-8450-db883504dc0f": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Processing duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_processing_duration.avg" + }, + "b5a75764-e98b-434b-a0f0-5658a4aa1cf6": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Networking duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_network_duration.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b5a75764-e98b-434b-a0f0-5658a4aa1cf6", + "ab158cba-532f-47f8-8450-db883504dc0f" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "bar", + "showGridlines": false, + "splitAccessor": "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "bar" + } + }, + "title": "App state Browser Networking/Processing Duration [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "0e74dee0-04a4-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:40:22.862Z", + "version": "WzI2ODQsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage_total.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"252dfd5f-26bd-4861-bb01-4b3530cadd95\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-3-a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":{\\\"label\\\":\\\"Instance\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\"},\\\"col-4-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Total CPU percentage \\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage_total.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"percent\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"col-5-252dfd5f-26bd-4861-bb01-4b3530cadd95\\\":{\\\"label\\\":\\\"CPU percentage\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"percent\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"customLabel\\\":true,\\\"id\\\":\\\"252dfd5f-26bd-4861-bb01-4b3530cadd95\\\"}}\" | lens_format_column format=\"percent\" columnId=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" decimals=2 | lens_format_column format=\"percent\" columnId=\"252dfd5f-26bd-4861-bb01-4b3530cadd95\" decimals=2}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Total CPU percentage \" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\" seriesType=\"area\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" accessors=\"252dfd5f-26bd-4861-bb01-4b3530cadd95\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Total CPU percentage \\\",\\\"252dfd5f-26bd-4861-bb01-4b3530cadd95\\\":\\\"CPU percentage\\\",\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":\\\"Instance\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "252dfd5f-26bd-4861-bb01-4b3530cadd95" + ], + "columns": { + "252dfd5f-26bd-4861-bb01-4b3530cadd95": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "CPU percentage", + "operationType": "avg", + "params": { + "format": { + "id": "percent", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_process_cpu_percentage.avg" + }, + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Instance", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.cloud_role_instance" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total CPU percentage ", + "operationType": "avg", + "params": { + "format": { + "id": "percent", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_process_cpu_percentage_total.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "252dfd5f-26bd-4861-bb01-4b3530cadd95" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Process CPU usage [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "cfa361a0-04a8-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T12:14:24.954Z", + "version": "WzMyNTMsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_process_private_bytes.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-2-a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":{\\\"label\\\":\\\"Instance\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\"},\\\"col-3-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Process private bytes\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_process_private_bytes.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" decimals=2}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Process private bytes\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\" seriesType=\"area\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Process private bytes\\\",\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":\\\"Instance\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "columns": { + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Instance", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.cloud_role_instance" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Process private bytes", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_process_private_bytes.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Process Private Bytes [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "2b54b2c0-04a8-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T12:09:49.291Z", + "version": "WzMxMjMsMl0=" + } + ], + "version": "7.9.2" +} diff --git a/x-pack/metricbeat/module/azure/app_insights/_meta/data.json b/x-pack/metricbeat/module/azure/app_insights/_meta/data.json index 3d1f07c1ac1..c9b35f39923 100644 --- a/x-pack/metricbeat/module/azure/app_insights/_meta/data.json +++ b/x-pack/metricbeat/module/azure/app_insights/_meta/data.json @@ -1,16 +1,15 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", - "azure" : { - "app_insights" : { - "metrics" : { - "requests_failed" : { - "sum" : 182 - }, - "request_name" : "GET /favicon.ico" - }, - "start_date" : "2020-07-12T10:52:11.831Z", - "end_date" : "2020-07-12T12:52:11.831Z", - "application_id" : "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + "azure": { + "app_insights": { + "end_date": "2020-10-02T13:17:45.691Z", + "start_date": "2020-10-02T13:12:45.691Z" + }, + "application_id": "42cb59a9-d5be-400b-a5c4-69b0a00434fdf4", + "metrics": { + "requests_count": { + "sum": 0 + } } }, "cloud": { diff --git a/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml b/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml index 40ab8560827..4e8fa91edbd 100644 --- a/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml +++ b/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml @@ -4,10 +4,6 @@ description: > application insights fields: - - name: application_id - type: keyword - description: > - The application ID - name: start_date type: date description: > diff --git a/x-pack/metricbeat/module/azure/app_insights/app_insights.go b/x-pack/metricbeat/module/azure/app_insights/app_insights.go index 8ffe02eb860..091a72f465e 100644 --- a/x-pack/metricbeat/module/azure/app_insights/app_insights.go +++ b/x-pack/metricbeat/module/azure/app_insights/app_insights.go @@ -23,6 +23,7 @@ type Config struct { ApiKey string `config:"api_key" validate:"required"` Period time.Duration `config:"period" validate:"nonzero,required"` Metrics []Metric `config:"metrics" validate:"required"` + Namespace string `config:"namespace"` } // Metric struct used for configuration options @@ -70,7 +71,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { if err != nil { return errors.Wrap(err, "error retrieving metric values") } - events := EventsMapping(results, m.client.Config.ApplicationId) + events := EventsMapping(results, m.client.Config.ApplicationId, m.client.Config.Namespace) for _, event := range events { isOpen := report.Event(event) if !isOpen { diff --git a/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go b/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go index 3cb93663007..c33f05c2de6 100644 --- a/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go +++ b/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go @@ -10,12 +10,20 @@ package app_insights import ( "testing" + "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/test" + "github.com/stretchr/testify/assert" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" ) +var metrics = []map[string]interface{}{{ + "id": "requests/count", +}} + func TestFetchMetricset(t *testing.T) { + config := test.GetConfigForInsights(t, "app_insights") + config["metrics"] = metrics metricSet := mbtest.NewReportingMetricSetV2Error(t, config) events, errs := mbtest.ReportingFetchV2Error(metricSet) if len(errs) > 0 { @@ -26,6 +34,8 @@ func TestFetchMetricset(t *testing.T) { } func TestData(t *testing.T) { + config := test.GetConfigForInsights(t, "app_insights") + config["metrics"] = metrics metricSet := mbtest.NewFetcher(t, config) metricSet.WriteEvents(t, "/") } diff --git a/x-pack/metricbeat/module/azure/app_insights/client.go b/x-pack/metricbeat/module/azure/app_insights/client.go index b78f2257d3f..49794da4d3f 100644 --- a/x-pack/metricbeat/module/azure/app_insights/client.go +++ b/x-pack/metricbeat/module/azure/app_insights/client.go @@ -23,9 +23,6 @@ type Client struct { Log *logp.Logger } -type MetricValue struct { -} - // NewClient instantiates the an Azure monitoring client func NewClient(config Config) (*Client, error) { service, err := NewService(config) diff --git a/x-pack/metricbeat/module/azure/app_insights/data.go b/x-pack/metricbeat/module/azure/app_insights/data.go index df7efdbeaba..1cd661cc3a0 100644 --- a/x-pack/metricbeat/module/azure/app_insights/data.go +++ b/x-pack/metricbeat/module/azure/app_insights/data.go @@ -6,98 +6,217 @@ package app_insights import ( "fmt" + "regexp" "strings" + "github.com/Azure/azure-sdk-for-go/services/preview/appinsights/v1/insights" "github.com/Azure/go-autorest/autorest/date" - "github.com/Azure/azure-sdk-for-go/services/preview/appinsights/v1/insights" + "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/metricbeat/mb" ) -func EventsMapping(metricValues insights.ListMetricsResultsItem, applicationId string) []mb.Event { - var events []mb.Event - if metricValues.Value == nil { - return events - } - groupedAddProp := make(map[string][]insights.MetricsResultInfo) +const aggsRegex = "_(?:sum|count|unique|avg|min|max)$" + +// segmentNames list is used to filter out the dimension from the api response. Based on the body format it is not possible to detect what was the segment selected +var segmentNames = []string{ + "request_source", "request_name", "request_url_host", "request_url_path", "request_success", "request_result_code", "request_performance_bucket", "operation_name", "operation_synthetic", "operation_synthetic_source", "user_authenticated", "application_version", "client_type", "client_model", + "client_os", "client_city", "client_state_or_province", "client_country_or_region", "client_browser", "cloud_role_name", "cloud_role_instance", "custom_dimensions__ms_processedb_by_metric_extractors", "custom_dimensions_developer_mode", + "page_view_name", "page_view_url_path", "page_view_url_host", "page_view_performance_bucket", "custom_dimensions_ibiza_session_id", "custom_dimensions_part_instance", "browser_timing_name", "browser_timing_url_host", "browser_timing_url_path", "browser_timing_performance_bucket", + "trace_severity_level", "type", "custom_dimensions_agent_session", "custom_dimensions_agent_version", "custom_dimensions_machine_name", "custom_dimensions_running_mode", "custom_dimensions_source", "custom_dimensions_agent_assembly_version", "custom_dimensions_agent_process_session", + "custom_dimensions_hashed_machine_name", + "custom_dimensions_data_cube", "dependency_target", "dependency_type", "dependency_name", "dependency_success", "dependency_result_code", "dependency_performance_bucket", "custom_dimensions_container", "custom_dimensions_blob", "custom_dimensions_error_message", + "custom_event_name", "custom_dimensions_event_name", "custom_dimensions_page_title", "custom_dimensions_service_profiler_content", "custom_dimensions_executing_assembly_file_version", "custom_dimensions_service_profiler_version", "custom_dimensions_process_id", "custom_dimensions_request_id", + "custom_dimensions_running_session", "custom_dimensions_problem_id", "custom_dimensions_snapshot_context", "custom_dimensions_snapshot_version", "custom_dimensions_duration", "custom_dimensions_snapshot_id", "custom_dimensions_stamp_id", "custom_dimensions_de_optimization_id", + "custom_dimensions_method", "custom_dimensions_parent_process_id", "custom_dimensions_section", "custom_dimensions_configuration", "custom_dimensions_dump_folder", "custom_dimensions_reason", "custom_dimensions_extension_version", "custom_dimensions_site_name", + "availability_result_name", "availability_result_location", "availability_result_success", "custom_dimensions_full_test_result_available", "exception_problem_id", "exception_handled_at", "exception_type", "exception_assembly", "exception_method", "custom_dimensions_custom_perf_counter", + "exception_severity_level", "custom_dimensions_url", "custom_dimensions_ai.snapshot_stampid", "custom_dimensions_ai.snapshot_id", "custom_dimensions_ai.snapshot_version", "custom_dimensions_ai.snapshot_planid", "custom_dimensions__ms_example", "custom_dimensions_sa_origin_app_id", + "custom_dimensions_base_sdk_target_framework", "custom_dimensions_runtime_framework", "custom_dimensions__ms_aggregation_interval_ms", "custom_dimensions_problem_id", "custom_dimensions_operation_name", "custom_dimensions_request_success", "custom_dimensions__ms_metric_id", + "custom_dimensions_dependency_success", "custom_dimensions__ms_is_autocollected", "custom_dimensions_dependency_type", "performance_counter_name", "performance_counter_category", "performance_counter_counter", "performance_counter_instance", "custom_dimensions_counter_instance_name", +} + +type MetricValue struct { + SegmentName map[string]string + Value map[string]interface{} + Segments []MetricValue + Interval string + Start *date.Time + End *date.Time +} + +func mapMetricValues(metricValues insights.ListMetricsResultsItem) []MetricValue { + var mapped []MetricValue for _, item := range *metricValues.Value { + metricValue := MetricValue{ + Start: item.Body.Value.Start, + End: item.Body.Value.End, + Value: map[string]interface{}{}, + SegmentName: map[string]string{}, + } + metricValue.Interval = fmt.Sprintf("%sTO%s", item.Body.Value.Start, item.Body.Value.End) if item.Body != nil && item.Body.Value != nil { if item.Body.Value.AdditionalProperties != nil { - groupedAddProp[fmt.Sprintf("%sTO%s", item.Body.Value.Start, item.Body.Value.End)] = - append(groupedAddProp[fmt.Sprintf("%sTO%s", item.Body.Value.Start, item.Body.Value.End)], *item.Body.Value) - } else if item.Body.Value.Segments != nil { - for _, segment := range *item.Body.Value.Segments { - event, ok := createSegmentEvent(*item.Body.Value.Start, *item.Body.Value.End, segment, applicationId) - if ok { - events = append(events, event) + metrics := getAdditionalPropMetric(item.Body.Value.AdditionalProperties) + for key, metric := range metrics { + if isSegment(key) { + metricValue.SegmentName[key] = metric.(string) + } else { + metricValue.Value[key] = metric } } } + if item.Body.Value.Segments != nil { + for _, segment := range *item.Body.Value.Segments { + metVal := mapSegment(segment, metricValue.SegmentName) + metricValue.Segments = append(metricValue.Segments, metVal) + } + } + mapped = append(mapped, metricValue) } + } - if len(groupedAddProp) > 0 { - for _, val := range groupedAddProp { - event, ok := createEvent(val, applicationId) - if ok { - events = append(events, event) + return mapped +} + +func mapSegment(segment insights.MetricsSegmentInfo, parentSeg map[string]string) MetricValue { + metricValue := MetricValue{Value: map[string]interface{}{}, SegmentName: map[string]string{}} + if segment.AdditionalProperties != nil { + metrics := getAdditionalPropMetric(segment.AdditionalProperties) + for key, metric := range metrics { + if isSegment(key) { + metricValue.SegmentName[key] = metric.(string) + } else { + metricValue.Value[key] = metric + } + } + } + if len(parentSeg) > 0 { + for key, val := range parentSeg { + metricValue.SegmentName[key] = val + } + } + if segment.Segments != nil { + for _, segment := range *segment.Segments { + metVal := mapSegment(segment, metricValue.SegmentName) + metricValue.Segments = append(metricValue.Segments, metVal) + } + } + + return metricValue +} + +func isSegment(metric string) bool { + for _, seg := range segmentNames { + if metric == seg { + return true + } + } + return false +} + +func EventsMapping(metricValues insights.ListMetricsResultsItem, applicationId string, namespace string) []mb.Event { + var events []mb.Event + if metricValues.Value == nil { + return events + } + groupedAddProp := make(map[string][]MetricValue) + mValues := mapMetricValues(metricValues) + + var segValues []MetricValue + for _, mv := range mValues { + if len(mv.Segments) == 0 { + groupedAddProp[mv.Interval] = append(groupedAddProp[mv.Interval], mv) + } else { + segValues = append(segValues, mv) + } + } + + for _, val := range groupedAddProp { + event := createNoSegEvent(val, applicationId, namespace) + if len(event.MetricSetFields) > 0 { + events = append(events, event) + } + } + for _, val := range segValues { + for _, seg := range val.Segments { + lastSeg := getValue(seg) + for _, ls := range lastSeg { + events = append(events, createSegEvent(val, ls, applicationId, namespace)) } } } return events } -func createSegmentEvent(start date.Time, end date.Time, segment insights.MetricsSegmentInfo, applicationId string) (mb.Event, bool) { - metricList := common.MapStr{} - metrics := getMetric(segment.AdditionalProperties) - if len(metrics) == 0 { - return mb.Event{}, false +func getValue(metric MetricValue) []MetricValue { + var values []MetricValue + if metric.Segments == nil { + return []MetricValue{metric} + } + for _, met := range metric.Segments { + values = append(values, getValue(met)...) } - for key, metric := range metrics { + return values +} + +func createSegEvent(parentMetricValue MetricValue, metricValue MetricValue, applicationId string, namespace string) mb.Event { + metricList := common.MapStr{} + for key, metric := range metricValue.Value { metricList.Put(key, metric) } + if len(metricList) == 0 { + return mb.Event{} + } + event := createEvent(parentMetricValue.Start, parentMetricValue.End, applicationId, namespace, metricList) + if len(parentMetricValue.SegmentName) > 0 { + event.ModuleFields.Put("dimensions", parentMetricValue.SegmentName) + } + if len(metricValue.SegmentName) > 0 { + event.ModuleFields.Put("dimensions", metricValue.SegmentName) + } + return event +} + +func createEvent(start *date.Time, end *date.Time, applicationId string, namespace string, metricList common.MapStr) mb.Event { event := mb.Event{ - MetricSetFields: common.MapStr{ - "start_date": start, - "end_date": end, + ModuleFields: common.MapStr{ "application_id": applicationId, }, + MetricSetFields: common.MapStr{ + "start_date": start, + "end_date": end, + }, Timestamp: end.Time, } event.RootFields = common.MapStr{} event.RootFields.Put("cloud.provider", "azure") - event.MetricSetFields.Put("metrics", metricList) - return event, true + if namespace == "" { + event.ModuleFields.Put("metrics", metricList) + } else { + for key, metric := range metricList { + event.MetricSetFields.Put(key, metric) + } + } + return event } -func createEvent(values []insights.MetricsResultInfo, applicationId string) (mb.Event, bool) { +func createNoSegEvent(values []MetricValue, applicationId string, namespace string) mb.Event { metricList := common.MapStr{} for _, value := range values { - metrics := getMetric(value.AdditionalProperties) - for key, metric := range metrics { + for key, metric := range value.Value { metricList.Put(key, metric) } } if len(metricList) == 0 { - return mb.Event{}, false + return mb.Event{} } + return createEvent(values[0].Start, values[0].End, applicationId, namespace, metricList) - event := mb.Event{ - MetricSetFields: common.MapStr{ - "start_date": values[0].Start, - "end_date": values[0].End, - "application_id": applicationId, - }, - Timestamp: values[0].End.Time, - } - event.RootFields = common.MapStr{} - event.RootFields.Put("cloud.provider", "azure") - event.MetricSetFields.Put("metrics", metricList) - return event, true } -func getMetric(addProp map[string]interface{}) map[string]interface{} { +func getAdditionalPropMetric(addProp map[string]interface{}) map[string]interface{} { metricNames := make(map[string]interface{}) for key, val := range addProp { switch val.(type) { @@ -115,5 +234,19 @@ func getMetric(addProp map[string]interface{}) map[string]interface{} { } func cleanMetricNames(metric string) string { - return strings.Replace(metric, "/", "_", -1) + metric = strings.Replace(metric, "/", "_", -1) + metric = strings.Replace(metric, " ", "_", -1) + metric = azure.ReplaceUpperCase(metric) + obj := strings.Split(metric, ".") + for index := range obj { + // in some cases a trailing "_" is found + obj[index] = strings.TrimPrefix(obj[index], "_") + obj[index] = strings.TrimSuffix(obj[index], "_") + } + metric = strings.ToLower(strings.Join(obj, "_")) + aggsRegex := regexp.MustCompile(aggsRegex) + metric = aggsRegex.ReplaceAllStringFunc(metric, func(str string) string { + return strings.Replace(str, "_", ".", -1) + }) + return metric } diff --git a/x-pack/metricbeat/module/azure/app_insights/data_test.go b/x-pack/metricbeat/module/azure/app_insights/data_test.go index ebe4e7d98aa..f65f9f84b1d 100644 --- a/x-pack/metricbeat/module/azure/app_insights/data_test.go +++ b/x-pack/metricbeat/module/azure/app_insights/data_test.go @@ -39,20 +39,32 @@ func TestEventMapping(t *testing.T) { Value: &metrics, } applicationId := "abc" - events := EventsMapping(result, applicationId) + events := EventsMapping(result, applicationId, "") assert.Equal(t, len(events), 1) for _, event := range events { val1, _ := event.MetricSetFields.GetValue("start_date") assert.Equal(t, val1, &startDate) val2, _ := event.MetricSetFields.GetValue("end_date") assert.Equal(t, val2, &startDate) - val3, _ := event.MetricSetFields.GetValue("metrics.requests_count") + val3, _ := event.ModuleFields.GetValue("metrics.requests_count") assert.Equal(t, val3, common.MapStr{"sum": 12}) - val5, _ := event.MetricSetFields.GetValue("metrics.requests_failed") + val5, _ := event.ModuleFields.GetValue("metrics.requests_failed") assert.Equal(t, val5, common.MapStr{"sum": 10}) - val4, _ := event.MetricSetFields.GetValue("application_id") + val4, _ := event.ModuleFields.GetValue("application_id") assert.Equal(t, val4, applicationId) } } + +func TestCleanMetricNames(t *testing.T) { + ex := "customDimensions/ExecutingAssemblyFileVersion" + result := cleanMetricNames(ex) + assert.Equal(t, result, "custom_dimensions_executing_assembly_file_version") + ex = "customDimensions/_MS.AggregationIntervalMs" + result = cleanMetricNames(ex) + assert.Equal(t, result, "custom_dimensions__ms_aggregation_interval_ms") + ex = "customDimensions/_MS.IsAutocollected" + result = cleanMetricNames(ex) + assert.Equal(t, result, "custom_dimensions__ms_is_autocollected") +} diff --git a/x-pack/metricbeat/module/azure/app_state/_meta/data.json b/x-pack/metricbeat/module/azure/app_state/_meta/data.json new file mode 100644 index 00000000000..c4744db7f60 --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/_meta/data.json @@ -0,0 +1,32 @@ +{ + "@timestamp": "2017-10-12T08:05:34.853Z", + "azure": { + "app_state": { + "end_date": "2020-10-02T13:23:11.221Z", + "requests_count": { + "sum": 16 + }, + "start_date": "2020-10-01T13:23:11.221Z" + }, + "application_id": "42cb59a9-d5be-400b-a5c4-69b0a00434fdf4", + "dimensions": { + "request_name": "GET /auth", + "request_url_host": "demoapplogobs.azurewebsites.net" + } + }, + "cloud": { + "provider": "azure" + }, + "event": { + "dataset": "azure.app_state", + "duration": 115000, + "module": "azure" + }, + "metricset": { + "name": "app_state", + "period": 10000 + }, + "service": { + "type": "azure" + } +} diff --git a/x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc b/x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc new file mode 100644 index 00000000000..4517ccfed0d --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc @@ -0,0 +1,12 @@ +This is the app_state metricset of the module azure. + +This metricset allows users to retrieve application insights metrics from specified applications. + +[float] +==== Config options to identify resources + +`application_id`:: (_[]string_) ID of the application. This is Application ID from the API Access settings blade in the Azure portal. + +`api_key`:: (_[]string_) The API key which will be generated, more on the steps here https://dev.applicationinsights.io/documentation/Authorization/API-key-and-App-ID. + + diff --git a/x-pack/metricbeat/module/azure/app_state/_meta/fields.yml b/x-pack/metricbeat/module/azure/app_state/_meta/fields.yml new file mode 100644 index 00000000000..fad928c090f --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/_meta/fields.yml @@ -0,0 +1,86 @@ +- name: app_state + type: group + release: beta + description: > + application state + fields: + - name: start_date + type: date + description: > + The start date + - name: end_date + type: date + description: > + The end date + - name: requests_count.sum + type: float + description: > + Request count + - name: requests_failed.sum + type: float + description: > + Request failed count + - name: users_count.unique + type: float + description: > + User count + - name: sessions_count.unique + type: float + description: > + Session count + - name: users_authenticated.unique + type: float + description: > + Authenticated users count + - name: browser_timings_network_duration.avg + type: float + description: > + Browser timings network duration + - name: browser_timings_send_duration.avg + type: float + description: > + Browser timings send duration + - name: browser_timings_receive_uration.avg + type: float + description: > + Browser timings receive duration + - name: browser_timings_processing_duration.avg + type: float + description: > + Browser timings processing duration + - name: browser_timings_total_duration.avg + type: float + description: > + Browser timings total duration + - name: exceptions_count.sum + type: float + description: > + Exception count + - name: exceptions_browser.sum + type: float + description: > + Exception count at browser level + - name: exceptions_server.sum + type: float + description: > + Exception count at server level + - name: performance_counters_memory_available_bytes.avg + type: float + description: > + Performance counters memory available bytes + - name: performance_counters_process_private_bytes.avg + type: float + description: > + Performance counters process private bytes + - name: performance_counters_process_cpu_percentage_total.avg + type: float + description: > + Performance counters process cpu percentage total + - name: performance_counters_process_cpu_percentage.avg + type: float + description: > + Performance counters process cpu percentage + - name: performance_counters_processiobytes_per_second.avg + type: float + description: > + Performance counters process IO bytes per second diff --git a/x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go b/x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go new file mode 100644 index 00000000000..8762cae440d --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go @@ -0,0 +1,38 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +// +build integration +// +build azure + +package app_state + +import ( + "testing" + + "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/test" + + "github.com/stretchr/testify/assert" + + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + + // Register input module and metricset + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/app_insights" +) + +func TestFetchMetricset(t *testing.T) { + config := test.GetConfigForInsights(t, "app_state") + metricSet := mbtest.NewReportingMetricSetV2Error(t, config) + events, errs := mbtest.ReportingFetchV2Error(metricSet) + if len(errs) > 0 { + t.Fatalf("Expected 0 error, had %d. %v\n", len(errs), errs) + } + assert.NotEmpty(t, events) + mbtest.TestMetricsetFieldsDocumented(t, metricSet, events) +} + +func TestData(t *testing.T) { + config := test.GetConfigForInsights(t, "app_state") + metricSet := mbtest.NewFetcher(t, config) + metricSet.WriteEvents(t, "/") +} diff --git a/x-pack/metricbeat/module/azure/app_state/app_state_test.go b/x-pack/metricbeat/module/azure/app_state/app_state_test.go new file mode 100644 index 00000000000..a8dbab88081 --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/app_state_test.go @@ -0,0 +1,17 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package app_state + +import ( + "os" + + "github.com/elastic/beats/v7/metricbeat/mb" +) + +func init() { + // To be moved to some kind of helper + os.Setenv("BEAT_STRICT_PERMS", "false") + mb.Registry.SetSecondarySource(mb.NewLightModulesSource("../../../module")) +} diff --git a/x-pack/metricbeat/module/azure/app_state/manifest.yml b/x-pack/metricbeat/module/azure/app_state/manifest.yml new file mode 100644 index 00000000000..5c1d08a2ceb --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/manifest.yml @@ -0,0 +1,29 @@ +default: false +input: + module: azure + metricset: app_insights + defaults: + namespace: app_state + metrics: + - id: ["requests/count", "requests/failed"] + segment: ["request/urlHost", "request/name"] + aggregation: ["sum"] + interval: "P5M" + - id: ["users/count", "sessions/count", "users/authenticated"] + segment: ["request/urlHost"] + aggregation: ["unique"] + interval: "P5M" + - id: ["browserTimings/networkDuration", "browserTimings/sendDuration", "browserTimings/receiveDuration", "browserTimings/processingDuration", "browserTimings/totalDuration"] + segment: ["browserTiming/urlHost", "browserTiming/urlPath"] + aggregation: ["avg"] + interval: "P5M" + top: 5 + - id: ["exceptions/count", "exceptions/browser", "exceptions/server"] + segment: ["exception/type", "cloud/roleName"] + aggregation: ["sum"] + interval: "P5M" + - id: ["performanceCounters/memoryAvailableBytes", "performanceCounters/processCpuPercentageTotal", "performanceCounters/processCpuPercentage", "performanceCounters/processIOBytesPerSecond", + "performanceCounters/processPrivateBytes"] + aggregation: ["avg"] + segment: ["cloud/roleName", "cloud/roleInstance"] + interval: "P5M" diff --git a/x-pack/metricbeat/module/azure/data.go b/x-pack/metricbeat/module/azure/data.go index bf77f657416..4d479ef45d5 100644 --- a/x-pack/metricbeat/module/azure/data.go +++ b/x-pack/metricbeat/module/azure/data.go @@ -120,7 +120,7 @@ func managePropertyName(metric string) string { // create an object in case of ":" resultMetricName = strings.Replace(resultMetricName, "_-_", "_", -1) // replace uppercases with underscores - resultMetricName = replaceUpperCase(resultMetricName) + resultMetricName = ReplaceUpperCase(resultMetricName) // avoid cases as this "logicaldisk_avg._disk_sec_per_transfer" obj := strings.Split(resultMetricName, ".") @@ -134,8 +134,8 @@ func managePropertyName(metric string) string { return resultMetricName } -// replaceUpperCase func will replace upper case with '_' -func replaceUpperCase(src string) string { +// ReplaceUpperCase func will replace upper case with '_' +func ReplaceUpperCase(src string) string { replaceUpperCaseRegexp := regexp.MustCompile(replaceUpperCaseRegex) return replaceUpperCaseRegexp.ReplaceAllStringFunc(src, func(str string) string { var newStr string diff --git a/x-pack/metricbeat/module/azure/data_test.go b/x-pack/metricbeat/module/azure/data_test.go index cdfad1965f8..cca7edc0233 100644 --- a/x-pack/metricbeat/module/azure/data_test.go +++ b/x-pack/metricbeat/module/azure/data_test.go @@ -47,10 +47,10 @@ func TestGetDimensionValue(t *testing.T) { } func TestReplaceUpperCase(t *testing.T) { - result := replaceUpperCase("TestReplaceUpper_Case") + result := ReplaceUpperCase("TestReplaceUpper_Case") assert.Equal(t, result, "Test_replace_upper_Case") // should not split on acronyms - result = replaceUpperCase("CPU_Percentage") + result = ReplaceUpperCase("CPU_Percentage") assert.Equal(t, result, "CPU_Percentage") } diff --git a/x-pack/metricbeat/module/azure/fields.go b/x-pack/metricbeat/module/azure/fields.go index 4c0ad95ad98..6a308a5d2ae 100644 --- a/x-pack/metricbeat/module/azure/fields.go +++ b/x-pack/metricbeat/module/azure/fields.go @@ -19,5 +19,5 @@ func init() { // AssetAzure returns asset data. // This is the base64 encoded gzipped contents of module/azure. func AssetAzure() string { - return "eJzUV8tu2zoQ3fsrBl4GSD7AiwsEt5suuuteGJNjhY1EEuQorfv1hR6kKVHyo1aKxIsAEcnzEM8MqUd4peMO8HfjaAPAiivawfa5/X+7AZDkhVOWldE7+G8DAP1cqI1sqnaJo4rQ0w5K3AAcFFXS77qJj6CxphN4++Ojbac609jhyQzDGCaFYlVT6VDpOBIgX+n40ziZPJ8F7n/fXwieexvETokZ3MDoyJvGCcoIUw9X0AUc8JaEOihKpU7tjiwfLY0Glh1fkBGktMvBHIATWbPUU4srcMfXkGNHw1j6p4dZWrP/QYInQ/3D4pywZEpRo7VKl8P87cP2NhN9bKKNTmwWmvavtziTmptjGqHAU0WCk9wENt/sI0Sh5P2cKSB8/ZIRSlWT9sro8T4t7NGF/bl2b85oHpVyIi4T3k/xTw836z5UBhcG/1b1t14MOOLGaZK5XLS2UNqr8oX9xf4T+/CeGK9TgNZWSmC3zTM857pSsnQcObi/R6SykvSl9J7RcSGR51vjzMAVvB1ovjZwkpZrM5KWy3zzYYUbmuE0tLBqK2wNDBqz5O5VVSldvkdoB2hALaHxWBJIYlTVtckVjXOkxXHdzM6iBkrriPFXIYyf7sbyPl3g/H+KFXszWXRck+aifbCuyxM4ZOAns0Y2WS7vJB5A88tQYO2SUHQVvGJ99vm60Bd6atLzXfAe4rPtYaiDwpJTRq7ehEOZ9fAwgY/HgBCmeZeoxTLvGZbzhoIbrFYtru4Q6mAhgw20B+NIoOfViQPwMnUfuJWPoqGVpmtjxzS1bZiKt3pyFo0//cYq/vl16qTyjIHCC6zIE38OJ1FuHJ/xphmVJtfeFBm1oI9tbVALQe0ZQ45K5dkdP4ehoPaMIU/uTX2WDRrE5h9/yLhHT8XQmT+ym6A1nCL5B6HRio27/p5aXnlLzYGnd9LlkvZsHJYfOiaDxPhe/wQAAP//ZxBMvQ==" + return "eJzkmU1v47YTxu/5FIMcA2w+gA9/IP+2hz0ULfpyJsbUWGEjkVxy6Kz76QuKkixLsizbspugOSywenme30MOJyLzBd5otwL8Ozh6AGDFBa3g8SX+//EBICMvnbKsjF7B/x4AID0LpclCEV9xVBB6WkGODwAbRUXmV9WDX0BjSXvx+MM7Gx91Jtj6yojDoUxXilVJuUOl2zuN5Bvt3o3LOtdHhdPPH68ELykGsVNyRLdxdORNcJIGht0MM+waHfCWpNoo6qL24x5E3lk6uHE88QmMBiW+DmYD3MEate5HXMC7HYahdhsYc//8NGpr1n+R5N6tdFFMgXUeESVaq3ReP//49HheiFQ2bYwKdlA08V9vcaRqzi7TVgo8FSS5UzeNmw/rVkKo7HrPriB8/XFgiNYWSuJifh29MbtMlaS9MvqwLI6UxIlymFsKE8gHnaMDNwBPj/jnp7O5N4XBIzcvpf45wYAjDk5TNsRFa4XSXuWv7E+2u7btr4lxHkF3mkd8ppqgZ3QsMuTxVjhyY0YvqkSH7zaepLOlHUlnx/3GqwXOaH79qoFFW18MUDOOlo7nw2Q3qZu+yX+9aBx9C+TZC2mC5mcfylHnsco4Yf1bUoZKeNp7g6qg7BbmSXmCIXhyTfig1bcwPvIXIPzpyU0Ye/JV17+J9+9J/GRuDPxKmuPioGxhhpeudvKb4Fk78+7JCVal0rkXmvjduDeRBVct3Gfc5kuR/T95Qe0FtRc0XrMAfbVS70Dnq/V7DpojSWpL4g5wtdV5fNYZGQtU53cZwL3deZhsGIu7EFZO03D0XVKld4NO/VOjPbE+O/71ON2QAJCb2YCCtlScQvLktjcnSiYTQJbcxrgStaQ0SbHFllQatxO4RVXguiCx3jH5Javp170tNLaQbKG1hcp2Pna9aIR1aot8L+raFWrXS6GlDcKSk6QZc0oL+W7s0gbYm6e1fW2Efwn+bGxlqhmL5MKTNDq7G/nXX1K1RD5I3oNdxloVhdL5LfYYtTSgjt86ceIzYlTF3A2qDM6RlrvRsbr4tGxUtZ1IR4zfhTS+Pw8Xz9APfa32CIYsOi5Js4gXlk25F4eB+D6sycJg93ulcS06PGLdf2XH/lNt+Rbc0KX6OrGRTNak+7GuN57cT9brIHYAZbLD0z24fsSbZZbkoSffnibIqj3coNTaZZ4cjtcbSg5YLLq4qpPOShYGso3txjiS6Hlx40b4uHUquIXPLupW2n237ZimtIFJbMveidfhH5QOKe5+arqnnAggvMSCPPHnSNLitvdHsmlGpckJpT3H39gfO1pNCw3tRCBHufLsdp8jUEM7ESjua9RnmaAadhAnQ8Y1ehJ1Z/7IaRrW5rfIIExptGLj5n+n5jO/UofC/W/S40vas3FxK/KBB7ZGbMf1nwAAAP//oQy/EA==" } diff --git a/x-pack/metricbeat/module/azure/module.yml b/x-pack/metricbeat/module/azure/module.yml index a51b202612b..4170154e246 100644 --- a/x-pack/metricbeat/module/azure/module.yml +++ b/x-pack/metricbeat/module/azure/module.yml @@ -4,5 +4,6 @@ metricsets: - container_instance - container_service - database_account + - app_state - compute_vm - compute_vm_scaleset diff --git a/x-pack/metricbeat/module/azure/test/integration.go b/x-pack/metricbeat/module/azure/test/integration.go index 7187e3b93f7..39e8402110c 100644 --- a/x-pack/metricbeat/module/azure/test/integration.go +++ b/x-pack/metricbeat/module/azure/test/integration.go @@ -40,3 +40,23 @@ func GetConfig(t *testing.T, metricSetName string) map[string]interface{} { "subscription_id": subId, } } + +// GetConfigForInsights function gets azure credentials for integration tests. +func GetConfigForInsights(t *testing.T, metricSetName string) map[string]interface{} { + t.Helper() + applicationId, ok := os.LookupEnv("AZURE_APPLICATION_ID") + if !ok { + t.Fatal("Could not find var AZURE_APPLICATION_ID") + } + apiKey, ok := os.LookupEnv("AZURE_API_KEY") + if !ok { + t.Fatal("Could not find var AZURE_API_KEY") + } + return map[string]interface{}{ + "module": "azure", + "period": "300s", + "metricsets": []string{metricSetName}, + "application_id": applicationId, + "api_key": apiKey, + } +} diff --git a/x-pack/metricbeat/modules.d/azure.yml.disabled b/x-pack/metricbeat/modules.d/azure.yml.disabled index 23211f47206..10d00e003cf 100644 --- a/x-pack/metricbeat/modules.d/azure.yml.disabled +++ b/x-pack/metricbeat/modules.d/azure.yml.disabled @@ -114,3 +114,11 @@ # api_key: '' # metrics: # - id: ["requests/count", "requests/duration"] + +#- module: azure +# metricsets: +# - app_state +# enabled: true +# period: 300s +# application_id: '' +# api_key: '' From 9aab0c0de9fd3ff44ae3307f174f256fa547e725 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Mon, 5 Oct 2020 10:53:08 +0200 Subject: [PATCH 18/21] Map `cloud.account.id` to azure sub id (#21483) * mofidy doc * tet * add cloud * changelog --- CHANGELOG.next.asciidoc | 1 + .../add_cloud_metadata/provider_azure_vm.go | 3 + .../provider_azure_vm_test.go | 6 +- .../metricbeat/module/azure/add_metadata.go | 5 +- .../module/azure/compute_vm/_meta/data.json | 115 +++++++++++++----- .../azure/compute_vm_scaleset/_meta/data.json | 33 ++--- x-pack/metricbeat/module/azure/data.go | 4 +- 7 files changed, 120 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 68b77a46037..c72c4adb04b 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -731,6 +731,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add overview and platform health dashboards to Cloud Foundry module. {pull}21124[21124] - Release lambda metricset in aws module as GA. {issue}21251[21251] {pull}21255[21255] - Add dashboard for pubsub metricset in googlecloud module. {pull}21326[21326] {issue}17137[17137] +- Map cloud data filed `cloud.account.id` to azure subscription. {pull}21483[21483] {issue}21381[21381] *Packetbeat* diff --git a/libbeat/processors/add_cloud_metadata/provider_azure_vm.go b/libbeat/processors/add_cloud_metadata/provider_azure_vm.go index 9cd3eba55b8..3028d531c1e 100644 --- a/libbeat/processors/add_cloud_metadata/provider_azure_vm.go +++ b/libbeat/processors/add_cloud_metadata/provider_azure_vm.go @@ -34,6 +34,9 @@ var azureVMMetadataFetcher = provider{ azHeaders := map[string]string{"Metadata": "true"} azSchema := func(m map[string]interface{}) common.MapStr { out, _ := s.Schema{ + "account": s.Object{ + "id": c.Str("subscriptionId"), + }, "instance": s.Object{ "id": c.Str("vmId"), "name": c.Str("name"), diff --git a/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go b/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go index 307ac60abad..a988cc8873f 100644 --- a/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go +++ b/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go @@ -40,7 +40,8 @@ const azInstanceIdentityDocument = `{ "sku": "14.04.4-LTS", "version": "14.04.201605091", "vmId": "04ab04c3-63de-4709-a9f9-9ab8c0411d5e", - "vmSize": "Standard_D3_v2" + "vmSize": "Standard_D3_v2", + "subscriptionId": "5tfb04c3-63de-4709-a9f9-9ab8c0411d5e" }` func initAzureTestServer() *httptest.Server { @@ -87,6 +88,9 @@ func TestRetrieveAzureMetadata(t *testing.T) { "machine": common.MapStr{ "type": "Standard_D3_v2", }, + "account": common.MapStr{ + "id": "5tfb04c3-63de-4709-a9f9-9ab8c0411d5e", + }, "region": "eastus2", }, } diff --git a/x-pack/metricbeat/module/azure/add_metadata.go b/x-pack/metricbeat/module/azure/add_metadata.go index ba8f35c7db6..1342170aec0 100644 --- a/x-pack/metricbeat/module/azure/add_metadata.go +++ b/x-pack/metricbeat/module/azure/add_metadata.go @@ -35,7 +35,7 @@ func addHostMetadata(event *mb.Event, metricList common.MapStr) { } } -func addCloudVMMetadata(event *mb.Event, vm VmResource) { +func addCloudVMMetadata(event *mb.Event, vm VmResource, subscriptionId string) { if vm.Name != "" { event.RootFields.Put("cloud.instance.name", vm.Name) event.RootFields.Put("host.name", vm.Name) @@ -47,4 +47,7 @@ func addCloudVMMetadata(event *mb.Event, vm VmResource) { if vm.Size != "" { event.RootFields.Put("cloud.machine.type", vm.Size) } + if subscriptionId != "" { + event.RootFields.Put("cloud.account.id", subscriptionId) + } } diff --git a/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json b/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json index 1da5cfb63ab..c38407c76f1 100644 --- a/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json +++ b/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json @@ -2,62 +2,86 @@ "@timestamp": "2017-10-12T08:05:34.853Z", "azure": { "compute_vm": { + "disk_read_bytes": { + "total": 0 + }, "disk_read_operations_per_sec": { - "avg": 3.3875 + "avg": 0 + }, + "disk_write_bytes": { + "total": 2969709.4 }, "disk_write_operations_per_sec": { - "avg": 0.6705 + "avg": 0.7809999999999999 }, "inbound_flows": { - "avg": 28.4 + "avg": 10 }, "inbound_flows_maximum_creation_rate": { - "avg": 10.4 + "avg": 10.6 + }, + "network_in": { + "total": 1478232 + }, + "network_in_total": { + "total": 1569665 + }, + "network_out": { + "total": 793344 + }, + "network_out_total": { + "total": 1074624 + }, + "os_disk_bandwidth_consumed_percentage": { + "avg": 0 + }, + "os_disk_iops_consumed_percentage": { + "avg": 0 }, "os_disk_queue_depth": { - "avg": 0.00125 + "avg": 0.002 }, "os_disk_read_bytes_per_sec": { - "avg": 602589.1825 + "avg": 0 }, "os_disk_read_operations_per_sec": { - "avg": 5.28375 + "avg": 0 }, "os_disk_write_bytes_per_sec": { - "avg": 14137.59375 + "avg": 9899.025 }, "os_disk_write_operations_per_sec": { - "avg": 1.46875 + "avg": 1.5619999999999998 }, "os_per_disk_qd": { - "avg": 0.00125 + "avg": 0.002 }, "os_per_disk_read_bytes_per_sec": { - "avg": 602589.1825 + "avg": 0 }, "os_per_disk_read_operations_per_sec": { - "avg": 5.28375 + "avg": 0 }, "os_per_disk_write_bytes_per_sec": { - "avg": 14137.59375 + "avg": 9899.025 }, "os_per_disk_write_operations_per_sec": { - "avg": 1.46875 + "avg": 1.5619999999999998 }, "outbound_flows": { - "avg": 28.4 + "avg": 10 }, "outbound_flows_maximum_creation_rate": { - "avg": 10.4 + "avg": 10.6 }, "per_disk_qd": { - "avg": 0.0025 + "avg": 0 }, "per_disk_read_bytes_per_sec": { - "avg": 51985.035 + "avg": 0 }, "per_disk_read_operations_per_sec": { - "avg": 2.92875 + "avg": 0 }, "per_disk_write_bytes_per_sec": { "avg": 0 @@ -66,26 +90,41 @@ "avg": 0 }, "percentage_cpu": { - "avg": 9.747 + "avg": 1.8719999999999999 + }, + "vm_cached_bandwidth_consumed_percentage": { + "avg": 0 + }, + "vm_cached_iops_consumed_percentage": { + "avg": 0 + }, + "vm_uncached_bandwidth_consumed_percentage": { + "avg": 0 + }, + "vm_uncached_iops_consumed_percentage": { + "avg": 0 } }, "namespace": "Microsoft.Compute/virtualMachines", "resource": { "group": "obs-infrastructure", - "id": "/subscriptions/70bd6e64-4b1e-4835-8896-db77b8eef364/resourceGroups/obs-infrastructure/providers/Microsoft.Compute/virtualMachines/obslinux", - "name": "obslinux", + "id": "/subscriptions/fd675b6f-b5e5-426e-ac45-d1f876d0ffa6/resourceGroups/obs-infrastructure/providers/Microsoft.Compute/virtualMachines/testaz", + "name": "testaz", "type": "Microsoft.Compute/virtualMachines" }, - "subscription_id": "70bd6e64-4b1e-4835-8896-db77b8eef364", + "subscription_id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6", "timegrain": "PT5M" }, "cloud": { + "account": { + "id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6" + }, "instance": { - "id": "d5d9444a-1964-4d23-9c62-5463ecb16fe0", - "name": "obslinux" + "id": "490fe4cf-2b33-4ead-a016-7e614c2f48ad", + "name": "testaz" }, "machine": { - "type": "Basic_A0" + "type": "Standard_A1_v2" }, "provider": "azure", "region": "westeurope" @@ -97,10 +136,28 @@ }, "host": { "cpu": { - "pct": 0.09747 + "pct": 0.01872 }, - "id": "d5d9444a-1964-4d23-9c62-5463ecb16fe0", - "name": "obslinux" + "disk": { + "read": { + "bytes": 0 + }, + "write": { + "bytes": 2969709.4 + } + }, + "id": "490fe4cf-2b33-4ead-a016-7e614c2f48ad", + "name": "testaz", + "network": { + "in": { + "bytes": 1569665, + "packets": 1478232 + }, + "out": { + "bytes": 1074624, + "packets": 793344 + } + } }, "metricset": { "name": "compute_vm", diff --git a/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json b/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json index e8f59859d8b..2d99d8ff6b0 100644 --- a/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json +++ b/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json @@ -2,6 +2,12 @@ "@timestamp": "2017-10-12T08:05:34.853Z", "azure": { "compute_vm_scaleset": { + "cpu_credits_consumed": { + "avg": 0.006999999999999999 + }, + "cpu_credits_remaining": { + "avg": 84.72 + }, "os_per_disk_qd": { "avg": 0 }, @@ -12,35 +18,34 @@ "avg": 0 }, "os_per_disk_write_bytes_per_sec": { - "avg": 1872.1200000000001 + "avg": 3846.531 }, "os_per_disk_write_operations_per_sec": { - "avg": 0.296 + "avg": 0.5519999999999999 } }, "namespace": "Microsoft.Compute/virtualMachineScaleSets", "resource": { - "group": "testgroup", - "id": "/subscriptions/70bd6e23-e3er3-4835-6785-db77b8eef364/resourceGroups/testgroup/providers/Microsoft.Compute/virtualMachineScaleSets/vmscaleset", - "name": "vmscaleset", - "tags": { - "environment": "staging", - "role": "allocator" - }, + "group": "obs-infrastructure", + "id": "/subscriptions/fd675b6f-b5e5-426e-ac45-d1f876d0ffa6/resourceGroups/obs-infrastructure/providers/Microsoft.Compute/virtualMachineScaleSets/obslinuxvmss", + "name": "obslinuxvmss", "type": "Microsoft.Compute/virtualMachineScaleSets" }, - "subscription_id": "70bd6e23-e3er3-4835-6785-db77b8eef364", + "subscription_id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6", "timegrain": "PT5M" }, "cloud": { + "account": { + "id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6" + }, "instance": { - "name": "vmscaleset" + "name": "obslinuxvmss" }, "machine": { - "type": "Standard_D4s_v3" + "type": "Standard_B1ls" }, "provider": "azure", - "region": "eastus2" + "region": "westeurope" }, "event": { "dataset": "azure.compute_vm_scaleset", @@ -48,7 +53,7 @@ "module": "azure" }, "host": { - "name": "vmscaleset" + "name": "obslinuxvmss" }, "metricset": { "name": "compute_vm_scaleset", diff --git a/x-pack/metricbeat/module/azure/data.go b/x-pack/metricbeat/module/azure/data.go index 4d479ef45d5..eb7f1433142 100644 --- a/x-pack/metricbeat/module/azure/data.go +++ b/x-pack/metricbeat/module/azure/data.go @@ -82,7 +82,7 @@ func EventsMapping(metrics []Metric, client *Client, report mb.ReporterV2) error event, metricList = createEvent(timestamp, defaultMetric, resource, groupDimValues) if client.Config.AddCloudMetadata { vm = client.GetVMForMetaData(&resource, groupDimValues) - addCloudVMMetadata(&event, vm) + addCloudVMMetadata(&event, vm, resource.Subscription) } } } @@ -90,7 +90,7 @@ func EventsMapping(metrics []Metric, client *Client, report mb.ReporterV2) error event, metricList = createEvent(timestamp, defaultMetric, resource, groupTimeValues) if client.Config.AddCloudMetadata { vm = client.GetVMForMetaData(&resource, groupTimeValues) - addCloudVMMetadata(&event, vm) + addCloudVMMetadata(&event, vm, resource.Subscription) } } if client.Config.DefaultResourceType == "" { From c91216796739bea67c32c6d6c5dc349abb7eb017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Mon, 5 Oct 2020 10:53:30 +0200 Subject: [PATCH 19/21] Do not run symlink tests on Windows (#21472) --- filebeat/input/filestream/fswatch_test.go | 146 +++++++----------- .../filestream/fswatch_test_non_windows.go | 144 +++++++++++++++++ .../input/filestream/testdata/excluded_file | 0 .../input/filestream/testdata/included_file | 0 .../testdata/symlink_to_included_file | 1 - 5 files changed, 201 insertions(+), 90 deletions(-) create mode 100644 filebeat/input/filestream/fswatch_test_non_windows.go delete mode 100644 filebeat/input/filestream/testdata/excluded_file delete mode 100644 filebeat/input/filestream/testdata/included_file delete mode 120000 filebeat/input/filestream/testdata/symlink_to_included_file diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index 5e63987c868..4979c9275c8 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -31,6 +31,12 @@ import ( "github.com/elastic/beats/v7/libbeat/logp" ) +var ( + excludedFilePath = filepath.Join("testdata", "excluded_file") + includedFilePath = filepath.Join("testdata", "included_file") + directoryPath = filepath.Join("testdata", "unharvestable_dir") +) + func TestFileScanner(t *testing.T) { testCases := map[string]struct { paths []string @@ -39,56 +45,30 @@ func TestFileScanner(t *testing.T) { expectedFiles []string }{ "select all files": { - paths: []string{ - filepath.Join("testdata", "excluded_file"), - filepath.Join("testdata", "included_file"), - }, + paths: []string{excludedFilePath, includedFilePath}, expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "excluded_file")), - mustAbsPath(filepath.Join("testdata", "included_file")), + mustAbsPath(excludedFilePath), + mustAbsPath(includedFilePath), }, }, "skip excluded files": { - paths: []string{ - filepath.Join("testdata", "excluded_file"), - filepath.Join("testdata", "included_file"), - }, + paths: []string{excludedFilePath, includedFilePath}, excludedFiles: []match.Matcher{ - match.MustCompile(filepath.Join("testdata", "excluded_file")), - }, - expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "included_file")), - }, - }, - // covers test_input.py/test_skip_symlinks - "skip symlinks": { - paths: []string{ - filepath.Join("testdata", "symlink_to_included_file"), - filepath.Join("testdata", "included_file"), + match.MustCompile("excluded_file"), }, - symlinks: false, expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "included_file")), - }, - }, - "return a file once if symlinks are enabled": { - paths: []string{ - filepath.Join("testdata", "symlink_to_included_file"), - filepath.Join("testdata", "included_file"), - }, - symlinks: true, - expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "included_file")), + mustAbsPath(includedFilePath), }, }, "skip directories": { - paths: []string{ - filepath.Join("testdata", "unharvestable_dir"), - }, + paths: []string{directoryPath}, expectedFiles: []string{}, }, } + setupFilesForScannerTest(t) + defer removeFilesOfScannerTest(t) + for name, test := range testCases { test := test @@ -107,11 +87,50 @@ func TestFileScanner(t *testing.T) { for p, _ := range files { paths = append(paths, p) } - assert.Equal(t, test.expectedFiles, paths) + assert.True(t, checkIfSameContents(test.expectedFiles, paths)) }) } } +func setupFilesForScannerTest(t *testing.T) { + err := os.MkdirAll(directoryPath, 0750) + if err != nil { + t.Fatal(t) + } + + for _, path := range []string{excludedFilePath, includedFilePath} { + f, err := os.Create(path) + if err != nil { + t.Fatalf("file %s, error %v", path, err) + } + f.Close() + } +} + +func removeFilesOfScannerTest(t *testing.T) { + err := os.RemoveAll("testdata") + if err != nil { + t.Fatal(err) + } +} + +// only handles sets +func checkIfSameContents(one, other []string) bool { + if len(one) != len(other) { + return false + } + + mustFind := len(one) + for _, oneElem := range one { + for _, otherElem := range other { + if oneElem == otherElem { + mustFind-- + } + } + } + return mustFind == 0 +} + func TestFileWatchNewDeleteModified(t *testing.T) { oldTs := time.Now() newTs := oldTs.Add(5 * time.Second) @@ -201,9 +220,7 @@ func TestFileWatchNewDeleteModified(t *testing.T) { events: make(chan loginp.FSEvent), } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go w.watch(ctx) + go w.watch(context.Background()) for _, expectedEvent := range test.expectedEvents { evt := w.Event() @@ -213,55 +230,6 @@ func TestFileWatchNewDeleteModified(t *testing.T) { } } -func TestFileWatcherRenamedFile(t *testing.T) { - testPath := mustAbsPath(filepath.Join("testdata", "first_name")) - renamedPath := mustAbsPath(filepath.Join("testdata", "renamed")) - - f, err := os.Create(testPath) - if err != nil { - t.Fatal(err) - } - f.Close() - fi, err := os.Stat(testPath) - if err != nil { - t.Fatal(err) - } - - cfg := fileScannerConfig{ - ExcludedFiles: nil, - Symlinks: false, - RecursiveGlob: false, - } - scanner, err := newFileScanner([]string{testPath, renamedPath}, cfg) - if err != nil { - t.Fatal(err) - } - w := fileWatcher{ - log: logp.L(), - scanner: scanner, - events: make(chan loginp.FSEvent), - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go w.watch(ctx) - assert.Equal(t, loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: testPath, Info: fi}, w.Event()) - - err = os.Rename(testPath, renamedPath) - if err != nil { - t.Fatal(err) - } - defer os.Remove(renamedPath) - fi, err = os.Stat(renamedPath) - if err != nil { - t.Fatal(err) - } - - go w.watch(ctx) - assert.Equal(t, loginp.FSEvent{Op: loginp.OpRename, OldPath: testPath, NewPath: renamedPath, Info: fi}, w.Event()) -} - type mockScanner struct { files map[string]os.FileInfo } diff --git a/filebeat/input/filestream/fswatch_test_non_windows.go b/filebeat/input/filestream/fswatch_test_non_windows.go new file mode 100644 index 00000000000..eecfeddf930 --- /dev/null +++ b/filebeat/input/filestream/fswatch_test_non_windows.go @@ -0,0 +1,144 @@ +// 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. + +// +build !windows + +package filestream + +import ( + "context" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestFileScannerSymlinks(t *testing.T) { + testCases := map[string]struct { + paths []string + excludedFiles []match.Matcher + symlinks bool + expectedFiles []string + }{ + // covers test_input.py/test_skip_symlinks + "skip symlinks": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: false, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "return a file once if symlinks are enabled": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: true, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + } + + err := os.Symlink( + mustAbsPath(filepath.Join("testdata", "included_file")), + mustAbsPath(filepath.Join("testdata", "symlink_to_included_file")), + ) + if err != nil { + t.Fatal(err) + } + + for name, test := range testCases { + test := test + + t.Run(name, func(t *testing.T) { + cfg := fileScannerConfig{ + ExcludedFiles: test.excludedFiles, + Symlinks: true, + RecursiveGlob: false, + } + fs, err := newFileScanner(test.paths, cfg) + if err != nil { + t.Fatal(err) + } + files := fs.GetFiles() + paths := make([]string, 0) + for p, _ := range files { + paths = append(paths, p) + } + assert.Equal(t, test.expectedFiles, paths) + }) + } +} + +func TestFileWatcherRenamedFile(t *testing.T) { + testPath := mustAbsPath("first_name") + renamedPath := mustAbsPath("renamed") + + f, err := os.Create(testPath) + if err != nil { + t.Fatal(err) + } + f.Close() + fi, err := os.Stat(testPath) + if err != nil { + t.Fatal(err) + } + + cfg := fileScannerConfig{ + ExcludedFiles: nil, + Symlinks: false, + RecursiveGlob: false, + } + scanner, err := newFileScanner([]string{testPath, renamedPath}, cfg) + if err != nil { + t.Fatal(err) + } + w := fileWatcher{ + log: logp.L(), + scanner: scanner, + events: make(chan loginp.FSEvent), + } + + go w.watch(context.Background()) + assert.Equal(t, loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: testPath, Info: fi}, w.Event()) + + err = os.Rename(testPath, renamedPath) + if err != nil { + t.Fatal(err) + } + defer os.Remove(renamedPath) + fi, err = os.Stat(renamedPath) + if err != nil { + t.Fatal(err) + } + + go w.watch(context.Background()) + evt := w.Event() + + assert.Equal(t, loginp.OpRename, evt.Op) + assert.Equal(t, testPath, evt.OldPath) + assert.Equal(t, renamedPath, evt.NewPath) +} diff --git a/filebeat/input/filestream/testdata/excluded_file b/filebeat/input/filestream/testdata/excluded_file deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/filebeat/input/filestream/testdata/included_file b/filebeat/input/filestream/testdata/included_file deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/filebeat/input/filestream/testdata/symlink_to_included_file b/filebeat/input/filestream/testdata/symlink_to_included_file deleted file mode 120000 index 40824f3f7d3..00000000000 --- a/filebeat/input/filestream/testdata/symlink_to_included_file +++ /dev/null @@ -1 +0,0 @@ -filebeat/input/filestream/testdata/included_file \ No newline at end of file From 77163970c4e0b23148d583242e3aec477b03e275 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Mon, 5 Oct 2020 12:03:20 +0200 Subject: [PATCH 20/21] Ignore unsupported metrics in the azure module (#21486) * mofidy doc * add ignore * changelog --- CHANGELOG.next.asciidoc | 1 + .../module/azure/compute_vm_scaleset/manifest.yml | 6 ++++++ x-pack/metricbeat/module/azure/config.go | 2 +- .../module/azure/container_instance/manifest.yml | 4 ++++ .../module/azure/container_service/manifest.yml | 6 ++++++ .../module/azure/database_account/manifest.yml | 8 ++++++++ .../module/azure/monitor/_meta/docs.asciidoc | 3 +++ .../metricbeat/module/azure/monitor/client_helper.go | 10 +++++----- .../module/azure/monitor/client_helper_test.go | 2 +- 9 files changed, 35 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index c72c4adb04b..2f956d70838 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -731,6 +731,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add overview and platform health dashboards to Cloud Foundry module. {pull}21124[21124] - Release lambda metricset in aws module as GA. {issue}21251[21251] {pull}21255[21255] - Add dashboard for pubsub metricset in googlecloud module. {pull}21326[21326] {issue}17137[17137] +- Expand unsupported option from namespace to metrics in the azure module. {pull}21486[21486] - Map cloud data filed `cloud.account.id` to azure subscription. {pull}21483[21483] {issue}21381[21381] *Packetbeat* diff --git a/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml b/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml index 9369a36b79e..37b1293a2e5 100644 --- a/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml +++ b/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml @@ -12,8 +12,10 @@ input: - name: ["CPU Credits Remaining", "CPU Credits Consumed", "OS Per Disk Read Bytes/sec", "OS Per Disk Write Bytes/sec", "OS Per Disk Read Operations/Sec", "OS Per Disk Write Operations/Sec", "OS Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" timegrain: "PT5M" + ignore_unsupported: true - name: ["Per Disk Read Bytes/sec", "Per Disk Write Bytes/sec", "Per Disk Read Operations/Sec", "Per Disk Write Operations/Sec", "Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "SlotId" @@ -24,6 +26,7 @@ input: "Premium Data Disk Cache Read Hit", "Outbound Flows Maximum Creation Rate", "Inbound Flows Maximum Creation Rate", "Outbound Flows", "Inbound Flows", "OS Disk IOPS Consumed Percentage", "OS Disk Bandwidth Consumed Percentage", "OS Disk Queue Depth", "OS Disk Write Operations/Sec", "OS Disk Read Operations/Sec", "OS Disk Write Bytes/sec", "OS Disk Read Bytes/sec", "Data Disk IOPS Consumed Percentage"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "VMName" @@ -40,9 +43,11 @@ input: metrics: - name: ["CPU Credits Remaining", "CPU Credits Consumed", "OS Per Disk Read Bytes/sec", "OS Per Disk Write Bytes/sec", "OS Per Disk Read Operations/Sec", "OS Per Disk Write Operations/Sec", "OS Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" - name: ["Per Disk Read Bytes/sec", "Per Disk Write Bytes/sec", "Per Disk Read Operations/Sec", "Per Disk Write Operations/Sec", "Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "SlotId" @@ -53,6 +58,7 @@ input: "Premium Data Disk Cache Read Hit", "Outbound Flows Maximum Creation Rate", "Inbound Flows Maximum Creation Rate", "Outbound Flows", "Inbound Flows", "OS Disk IOPS Consumed Percentage", "OS Disk Bandwidth Consumed Percentage", "OS Disk Queue Depth", "OS Disk Write Operations/Sec", "OS Disk Read Operations/Sec", "OS Disk Write Bytes/sec", "OS Disk Read Bytes/sec", "Data Disk IOPS Consumed Percentage"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "VMName" diff --git a/x-pack/metricbeat/module/azure/config.go b/x-pack/metricbeat/module/azure/config.go index 63bb5450b57..00f1af56126 100644 --- a/x-pack/metricbeat/module/azure/config.go +++ b/x-pack/metricbeat/module/azure/config.go @@ -41,7 +41,7 @@ type MetricConfig struct { Dimensions []DimensionConfig `config:"dimensions"` Timegrain string `config:"timegrain"` // namespaces can be unsupported by some resources and supported in some, this configuration option makes sure no error messages are returned if namespace is unsupported - // info messages will be logged instead + // info messages will be logged instead. Same situation with metrics, some are being removed from the API, we would like to make sure that does not affect the module IgnoreUnsupported bool `config:"ignore_unsupported"` } diff --git a/x-pack/metricbeat/module/azure/container_instance/manifest.yml b/x-pack/metricbeat/module/azure/container_instance/manifest.yml index a0e6cd5ec27..c767e072a42 100644 --- a/x-pack/metricbeat/module/azure/container_instance/manifest.yml +++ b/x-pack/metricbeat/module/azure/container_instance/manifest.yml @@ -10,21 +10,25 @@ input: metrics: - name: ["CpuUsage", "MemoryUsage"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "containerName" value: "*" - name: ["NetworkBytesReceivedPerSecond", "NetworkBytesTransmittedPerSecond"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" - resource_id: "" metrics: - name: ["CpuUsage", "MemoryUsage"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "containerName" value: "*" - name: ["NetworkBytesReceivedPerSecond", "NetworkBytesTransmittedPerSecond"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" diff --git a/x-pack/metricbeat/module/azure/container_service/manifest.yml b/x-pack/metricbeat/module/azure/container_service/manifest.yml index 1384a268868..b7cf7639d42 100644 --- a/x-pack/metricbeat/module/azure/container_service/manifest.yml +++ b/x-pack/metricbeat/module/azure/container_service/manifest.yml @@ -10,6 +10,7 @@ input: metrics: - name: ["kube_node_status_condition"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "node" @@ -20,9 +21,11 @@ input: value: "*" - name: ["kube_node_status_allocatable_cpu_cores", "kube_node_status_allocatable_memory_bytes"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" - name: ["kube_pod_status_ready", "kube_pod_status_phase"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "pod" @@ -31,6 +34,7 @@ input: metrics: - name: ["kube_node_status_condition"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "node" @@ -41,9 +45,11 @@ input: value: "*" - name: ["kube_node_status_allocatable_cpu_cores", "kube_node_status_allocatable_memory_bytes"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" - name: ["kube_pod_status_ready", "kube_pod_status_phase"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "pod" diff --git a/x-pack/metricbeat/module/azure/database_account/manifest.yml b/x-pack/metricbeat/module/azure/database_account/manifest.yml index 39086f6ff66..3436008db7e 100644 --- a/x-pack/metricbeat/module/azure/database_account/manifest.yml +++ b/x-pack/metricbeat/module/azure/database_account/manifest.yml @@ -14,12 +14,14 @@ input: - name: ["AvailableStorage", "DataUsage","DocumentCount", "DocumentQuota", "IndexUsage", "MetadataRequests", "MongoRequestCharge", "MongoRequests", "MongoRequestsCount", "MongoRequestsInsert", "MongoRequestsDelete", "MongoRequestsQuery", "MongoRequestsUpdate","ProvisionedThroughput", "NormalizedRUConsumption"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" value: "*" - name: ["TotalRequestUnits", "TotalRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" @@ -28,6 +30,7 @@ input: value: "*" - name: ["CassandraRequestCharges", "CassandraRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT1M" dimensions: - name: "DatabaseName" @@ -38,6 +41,7 @@ input: "SqlContainerDelete", "SqlContainerThroughputUpdate", "SqlContainerUpdate", "SqlDatabaseDelete", "SqlDatabaseThroughputUpdate", "SqlDatabaseUpdate", "TableTableDelete", "TableTableThroughputUpdate","TableTableUpdate"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true dimensions: - name: "ResourceName" value: "*" @@ -49,12 +53,14 @@ input: - name: ["AvailableStorage", "DataUsage","DocumentCount", "DocumentQuota", "IndexUsage", "MetadataRequests", "MongoRequestCharge", "MongoRequests", "MongoRequestsCount", "MongoRequestsInsert", "MongoRequestsDelete", "MongoRequestsQuery", "MongoRequestsUpdate","ProvisionedThroughput", "NormalizedRUConsumption"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" value: "*" - name: ["TotalRequestUnits", "TotalRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" @@ -63,6 +69,7 @@ input: value: "*" - name: ["CassandraRequestCharges", "CassandraRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT1M" dimensions: - name: "DatabaseName" @@ -73,6 +80,7 @@ input: "SqlContainerDelete", "SqlContainerThroughputUpdate", "SqlContainerUpdate", "SqlDatabaseDelete", "SqlDatabaseThroughputUpdate", "SqlDatabaseUpdate", "TableTableDelete", "TableTableThroughputUpdate","TableTableUpdate"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true dimensions: - name: "ResourceName" value: "*" diff --git a/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc b/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc index 19254f4ada9..9957b6a2ddd 100644 --- a/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc @@ -50,6 +50,9 @@ Metrics with dimensions are exported as flattened single dimensional metrics, ag `name`:: Dimension key `value`:: Dimension value. (Users can select * to return metric values for each dimension) +`ignore_unsupported`:: (_bool_) Namespaces can be unsupported by some resources and supported in some, this configuration option makes sure no error messages are returned if the namespace is unsupported. +The same will go for the metrics configured, some can be removed from Azure Monitor and it should not affect the state of the module. + Users can select the options to retrieve all metrics from a specific namespace using the following: ["source","yaml"] diff --git a/x-pack/metricbeat/module/azure/monitor/client_helper.go b/x-pack/metricbeat/module/azure/monitor/client_helper.go index 82875f46de5..403b971496f 100644 --- a/x-pack/metricbeat/module/azure/monitor/client_helper.go +++ b/x-pack/metricbeat/module/azure/monitor/client_helper.go @@ -78,20 +78,20 @@ func filterMetricNames(resourceId string, metricConfig azure.MetricConfig, metri } } else { // verify if configured metric names are valid, return log error event for the invalid ones, map only the valid metric names - supportedMetricNames, unsupportedMetricNames = filterSConfiguredMetrics(metricConfig.Name, metricDefinitions) - if len(unsupportedMetricNames) > 0 { + supportedMetricNames, unsupportedMetricNames = filterConfiguredMetrics(metricConfig.Name, metricDefinitions) + if len(unsupportedMetricNames) > 0 && !metricConfig.IgnoreUnsupported { return nil, errors.Errorf("the metric names configured %s are not supported for the resource %s and namespace %s", strings.Join(unsupportedMetricNames, ","), resourceId, metricConfig.Namespace) } } - if len(supportedMetricNames) == 0 { + if len(supportedMetricNames) == 0 && !metricConfig.IgnoreUnsupported { return nil, errors.Errorf("the metric names configured : %s are not supported for the resource %s and namespace %s ", strings.Join(metricConfig.Name, ","), resourceId, metricConfig.Namespace) } return supportedMetricNames, nil } -// filterSConfiguredMetrics will filter out any unsupported metrics based on the namespace selected -func filterSConfiguredMetrics(selectedRange []string, allRange []insights.MetricDefinition) ([]string, []string) { +// filterConfiguredMetrics will filter out any unsupported metrics based on the namespace selected +func filterConfiguredMetrics(selectedRange []string, allRange []insights.MetricDefinition) ([]string, []string) { var inRange []string var notInRange []string var allMetrics string diff --git a/x-pack/metricbeat/module/azure/monitor/client_helper_test.go b/x-pack/metricbeat/module/azure/monitor/client_helper_test.go index a15ee0089b9..bcbad0f4c26 100644 --- a/x-pack/metricbeat/module/azure/monitor/client_helper_test.go +++ b/x-pack/metricbeat/module/azure/monitor/client_helper_test.go @@ -108,7 +108,7 @@ func TestMapMetric(t *testing.T) { func TestFilterSConfiguredMetrics(t *testing.T) { selectedRange := []string{"TotalRequests", "Capacity", "CPUUsage"} - intersection, difference := filterSConfiguredMetrics(selectedRange, *MockMetricDefinitions()) + intersection, difference := filterConfiguredMetrics(selectedRange, *MockMetricDefinitions()) assert.Equal(t, intersection, []string{"TotalRequests", "Capacity"}) assert.Equal(t, difference, []string{"CPUUsage"}) } From 6fdb4ba899438c9fbb0e748e1a9643be5dd46437 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Mon, 5 Oct 2020 12:58:03 +0200 Subject: [PATCH 21/21] Skip filestream flaky tests (#21490) --- filebeat/input/filestream/fswatch_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index 4979c9275c8..d6286a273eb 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -38,6 +38,8 @@ var ( ) func TestFileScanner(t *testing.T) { + t.Skip("Flaky test: https://github.com/elastic/beats/issues/21489") + testCases := map[string]struct { paths []string excludedFiles []match.Matcher @@ -132,6 +134,8 @@ func checkIfSameContents(one, other []string) bool { } func TestFileWatchNewDeleteModified(t *testing.T) { + t.Skip("Flaky test: https://github.com/elastic/beats/issues/21489") + oldTs := time.Now() newTs := oldTs.Add(5 * time.Second) testCases := map[string]struct {