From 4b44b5bc23a2192578505a3164ae70e851408029 Mon Sep 17 00:00:00 2001 From: Luc Perkins Date: Wed, 7 Jul 2021 08:06:30 -0700 Subject: [PATCH] fix(external docs): New Vector website (#7368) * Add VRL expression template Signed-off-by: Luc Perkins * Templatize real world examples Signed-off-by: Luc Perkins * Improve CSS for VRL errors Signed-off-by: Luc Perkins * Rename unit testing doc Signed-off-by: Luc Perkins * Finish metric schema template Signed-off-by: Luc Perkins * Add tabs shortcode Signed-off-by: Luc Perkins * Fix CLI env vars shortcode Signed-off-by: Luc Perkins * Add component under hero Signed-off-by: Luc Perkins * Add shortcode for VRL examples Signed-off-by: Luc Perkins * Run JS main without waiting for DOM content ready Signed-off-by: Luc Perkins * Bring sources in sync with current docs Signed-off-by: Luc Perkins * Sync transforms with upstream docs Signed-off-by: Luc Perkins * Bring sinks in sync with upstream Signed-off-by: Luc Perkins * Upgrade the VRL expressions CSS Signed-off-by: Luc Perkins * More fixes for config CSS Signed-off-by: Luc Perkins * Remove drafts from preview build Signed-off-by: Luc Perkins * Experiment with page load hack Signed-off-by: Luc Perkins * Move showBody logic into HTML head Signed-off-by: Luc Perkins * Extract page load logic into separate partial Signed-off-by: Luc Perkins * Update CUE version in GitHub Actions Signed-off-by: Luc Perkins * Re-architect component template Signed-off-by: Luc Perkins * Initial templating logic for integration guides Signed-off-by: Luc Perkins * Add AWS Amplify config Signed-off-by: Luc Perkins * Add roles shortcode Signed-off-by: Luc Perkins * Consolidate all structured data into a single partial Signed-off-by: Luc Perkins * Allow for auto-generating VRL functions reference Signed-off-by: Luc Perkins * Add initial basis for admin widget Signed-off-by: Luc Perkins * Refactor management widget Signed-off-by: Luc Perkins * Improve CSS for VRL errors Signed-off-by: Luc Perkins * Templatize expressions page Signed-off-by: Luc Perkins * Templatize VRL concepts Signed-off-by: Luc Perkins * Finish templating main VRL page Signed-off-by: Luc Perkins * Delete unused CUE sources Signed-off-by: Luc Perkins * Templatize process docs Signed-off-by: Luc Perkins * Add pagination to highlights Signed-off-by: Luc Perkins * Small CSS updates to data templates Signed-off-by: Luc Perkins * First pass at admin widget Signed-off-by: Luc Perkins * Add versions list to CUE sources Signed-off-by: Luc Perkins * Add latest toggler to docs Signed-off-by: Luc Perkins * Fix release pagination spacing issue Signed-off-by: Luc Perkins * Rearchitect CUE sources for downloads Signed-off-by: Luc Perkins * Fix URL issues in downloads page Signed-off-by: Luc Perkins * Remove now-unused matrix.yaml file Signed-off-by: Luc Perkins * Restructue CUE download sources again Signed-off-by: Luc Perkins * New admin widget Signed-off-by: Luc Perkins * Remove unused guides Signed-off-by: Luc Perkins * Move SVG CSS out of purge-able file Signed-off-by: Luc Perkins * Small typography fixes Signed-off-by: Luc Perkins * Finish new admin widgets Signed-off-by: Luc Perkins * Add IAM permissions display for components Signed-off-by: Luc Perkins * Update Tailwind typography module Signed-off-by: Luc Perkins * Add hero SVG and update Tailwind Signed-off-by: Luc Perkins * Provide hoverable component cards Signed-off-by: Luc Perkins * Fix component examples Signed-off-by: Luc Perkins * Refine aesthetic of home hero widget Signed-off-by: Luc Perkins * Add why Vector section Signed-off-by: Luc Perkins * Add platform selector section Signed-off-by: Luc Perkins * Add logo to navbar Signed-off-by: Luc Perkins * Add initial installation section Signed-off-by: Luc Perkins * Move install commands into CUE sources Signed-off-by: Luc Perkins * Add initial installation section for front page Signed-off-by: Luc Perkins * Small aesthetic fixes Signed-off-by: Luc Perkins * More small aesthetic fixes for home page Signed-off-by: Luc Perkins * Add windows logo Signed-off-by: Luc Perkins * Add under-title colored spacers Signed-off-by: Luc Perkins * Fix light/dark navbar SVG logo issue Signed-off-by: Luc Perkins * Add links to topology images on front page Signed-off-by: Luc Perkins * Store platform selection in local storage Signed-off-by: Luc Perkins * Fix SVG rendering issue caused by minification Signed-off-by: Luc Perkins * Move JS loading into head Signed-off-by: Luc Perkins * Fix hover selector issues Signed-off-by: Luc Perkins * Add installation SVGs Signed-off-by: Luc Perkins * Add hover effect for install SVGs Signed-off-by: Luc Perkins * Fix TOC Bot JS issue Signed-off-by: Luc Perkins * Fix broken CUE URLs Signed-off-by: Luc Perkins * Add descriptions for all sources and transforms Signed-off-by: Luc Perkins * Add descriptions for remaining sinks Signed-off-by: Luc Perkins * Add home hero button links Signed-off-by: Luc Perkins * Fix blog post cards to be links Signed-off-by: Luc Perkins * Update guide cards Signed-off-by: Luc Perkins * Remove navbar social buttons for sm and md screens Signed-off-by: Luc Perkins * Add initial community section to front page Signed-off-by: Luc Perkins * Add social links to community section Signed-off-by: Luc Perkins * Add Vector topology info to CUE sources Signed-off-by: Luc Perkins * Add topologies shortcode Signed-off-by: Luc Perkins * Fix API config shortcode Signed-off-by: Luc Perkins * Fix CLI env vars shortcode Signed-off-by: Luc Perkins * Make hero buttons rounded Signed-off-by: Luc Perkins * Fix CSS issues on download page and re-arrange image assets for roles and topologies Signed-off-by: Luc Perkins * Small fixes to main page aesthetic Signed-off-by: Luc Perkins * Migrate management page to new system Signed-off-by: Luc Perkins * More re-arranging of the admin documentation Signed-off-by: Luc Perkins * Add localStorage invalidation directive Signed-off-by: Luc Perkins * Fix guides CSS issues Signed-off-by: Luc Perkins * Fix indentation issue in redact function docs and fix remaining link issues in highlights Signed-off-by: Luc Perkins * Add missing release pages Signed-off-by: Luc Perkins * Add instructions for new Vector releases Signed-off-by: Luc Perkins * Fix remaining broken links Signed-off-by: Luc Perkins * Add link checker to CI production build Signed-off-by: Luc Perkins * Extract install widget into partial Signed-off-by: Luc Perkins * Put JS partials in a separate directory Signed-off-by: Luc Perkins * Initiate first stab at React components Signed-off-by: Luc Perkins * Add initial implementation of globe Signed-off-by: Luc Perkins * Update yarn.lock Signed-off-by: Luc Perkins * Hide the globe element for now Signed-off-by: Luc Perkins * s/website/docs Signed-off-by: Luc Perkins * Move SVGs into assets Signed-off-by: Luc Perkins * Prettify the installation section on the main page Signed-off-by: Luc Perkins * Add logo to home hero Signed-off-by: Luc Perkins * Add config widget to front page Signed-off-by: Luc Perkins * More improvements to config widget Signed-off-by: Luc Perkins * Spruce up code example CSS Signed-off-by: Luc Perkins * Add components section to main page Signed-off-by: Luc Perkins * More polish for components section on main page Signed-off-by: Luc Perkins * Better styling for component chips on main page Signed-off-by: Luc Perkins * Add animated Vector diagram Signed-off-by: Luc Perkins * Fix error in app.js caused by variable rename Signed-off-by: Luc Perkins * Add VRL function examples Signed-off-by: Luc Perkins * Re-template CSS generation Signed-off-by: Luc Perkins * Reformat CUE sources Signed-off-by: Luc Perkins * Begin adding config reloading section to proc mgmt doc Signed-off-by: Luc Perkins * Add styling to globe Signed-off-by: Luc Perkins * More aesthetic changes to globe Signed-off-by: Luc Perkins * Revamp aesthetic for component links on main page Signed-off-by: Luc Perkins * Fix linter issue with newline in jsconfig.json Signed-off-by: Luc Perkins * Remove jsconfig from Git Signed-off-by: Luc Perkins * Fix CSS output paths in prod build Signed-off-by: Luc Perkins * Fix URL issues caused by last merge Signed-off-by: Luc Perkins * Reformat CUE sources Signed-off-by: Luc Perkins * Update Hugo version in build scripts Signed-off-by: Luc Perkins * Remove unused variable breaking the site build Signed-off-by: Luc Perkins * Refactor CSS generation again Signed-off-by: Luc Perkins * Fix CSS output path Signed-off-by: Luc Perkins * Fix menus broken by Hugo config name change Signed-off-by: Luc Perkins * Fix potential issue in PostCSS build Signed-off-by: Luc Perkins * Add post-processing step back into CSS builds Signed-off-by: Luc Perkins * Provide initial implementation of search index generation Signed-off-by: Luc Perkins * Add Algolia upload scripts Signed-off-by: Luc Perkins * Add page content to search index JSON Signed-off-by: Luc Perkins * Add Algolia config sync steps to CI Signed-off-by: Luc Perkins * Fix Algolia config file Signed-off-by: Luc Perkins * Add section to search parameters Signed-off-by: Luc Perkins * s/tags/badges in highlights (to avoid search index confusion) Signed-off-by: Luc Perkins * Add .env.example file for Algolia env vars Signed-off-by: Luc Perkins * Add page summary to search indexing Signed-off-by: Luc Perkins * Add redirects for integration guides Signed-off-by: Luc Perkins * Add rudimentary 404 page Signed-off-by: Luc Perkins * Adjust padding on home page elements Signed-off-by: Luc Perkins * Add tags to all component documents Signed-off-by: Luc Perkins * Add Markdown files for missing components Signed-off-by: Luc Perkins * Merge missing sources from master Signed-off-by: Luc Perkins * Update Netlify config to properly set Algolia info per environment Signed-off-by: Luc Perkins * Add page URL to search index Signed-off-by: Luc Perkins * Add initial setup for Algolia search UI Signed-off-by: Luc Perkins * Fix JS console errors due to non-existing elements on specific pages Signed-off-by: Luc Perkins * Update project stats Signed-off-by: Luc Perkins * Add search results dropdown Signed-off-by: Luc Perkins * Provide initial search results dropdown implementation Signed-off-by: Luc Perkins * Provide initial search bar Signed-off-by: Luc Perkins * Remove stray console.log calls from JS Signed-off-by: Luc Perkins * Add experimental way to prevent classes from being purged Signed-off-by: Luc Perkins * Add initial keyboard shortcut for search Signed-off-by: Luc Perkins * Add description field to search Signed-off-by: Luc Perkins * Fix globe color CSS and placement Signed-off-by: Luc Perkins * Add safe classes list to PostCSS config Signed-off-by: Luc Perkins * Add autoprefixer config Signed-off-by: Luc Perkins * Add separate subdirectory for navbar partials Signed-off-by: Luc Perkins * Make Tailwind CSS only rather than Sass processed Signed-off-by: Luc Perkins * More @apply directives for JS-driven elements Signed-off-by: Luc Perkins * Add component type to search result title Signed-off-by: Luc Perkins * More liberal purging policy for Tailwind CSS Signed-off-by: Luc Perkins * Fix CSS purging issue with type selectors Signed-off-by: Luc Perkins * Specify no Netlify CI build when no changes to ./docs Signed-off-by: Luc Perkins * Provide new implementation of community page and remove some unused assets Signed-off-by: Luc Perkins * Allow for links in footer headers Signed-off-by: Luc Perkins * Add transformation setup doc from old vector.dev Signed-off-by: Luc Perkins * Remove unused Markdown nested with CUE sources Signed-off-by: Luc Perkins * Add metrics catalogue shortcode plus more internal_metrics docs Signed-off-by: Luc Perkins * Revamp validation documentation Signed-off-by: Luc Perkins * Move missing CUE sources over from master Signed-off-by: Luc Perkins * Move remaining components into new system Signed-off-by: Luc Perkins * Fix broken links Signed-off-by: Luc Perkins * Add search tags to blog posts and guides Signed-off-by: Luc Perkins * Add new semantic PR categories Signed-off-by: Luc Perkins * Add structured data layer for metric and log schemas Signed-off-by: Luc Perkins * Fix sidebar hover issue Signed-off-by: Luc Perkins * Tighten spacing below hero across sections Signed-off-by: Luc Perkins * Tighten spacing below hero across sections Signed-off-by: Luc Perkins * Port more CUE sources over from master Signed-off-by: Luc Perkins * Update spinning globe colors Signed-off-by: Luc Perkins * Add more info to CLI tables Signed-off-by: Luc Perkins * Fix rendering error caused by dict/slice Signed-off-by: Luc Perkins * Migrate new CUE sources from master Signed-off-by: Luc Perkins * Fix sidebar scrolling issues Signed-off-by: Luc Perkins * Add glossary to CUE sources and make UI layer Signed-off-by: Luc Perkins * Transfer redirects from vector-website repo Signed-off-by: Luc Perkins * Add note on redirects to site README Signed-off-by: Luc Perkins * Use chevrons instead of plus/minus Signed-off-by: Luc Perkins * Remove no-longer-used AWS Amplify config Signed-off-by: Luc Perkins * Fix some broken external links Signed-off-by: Luc Perkins * Add README note on link checking Signed-off-by: Luc Perkins * Fix minor UI issues Signed-off-by: Luc Perkins * Change name of CUE in website Brewfile Signed-off-by: Luc Perkins * Replace 'more' with ellipsis icon Signed-off-by: Luc Perkins * More small UI fixes Signed-off-by: Luc Perkins * Fix example selector issue Signed-off-by: Luc Perkins * Another hovering link fix Signed-off-by: Luc Perkins * Fix broken URL in Lua component docs Signed-off-by: Luc Perkins * Reformat CUE sources Signed-off-by: Luc Perkins * Rework CI jobs to remove documentation checks Signed-off-by: Luc Perkins * Move some CUE scripting logic into docs Signed-off-by: Luc Perkins * Fix issue in docs dir CUE script Signed-off-by: Luc Perkins * Fix minor discrepancy in merge.cue Signed-off-by: Luc Perkins * Temporarily remove the config section from main page Signed-off-by: Luc Perkins * Fix minor glitches Signed-off-by: Luc Perkins Co-authored-by: Luc Perkins --- .editorconfig | 3 + .github/CODEOWNERS | 84 +- .github/semantic.yml | 12 +- .github/workflows/publish-docs.yml.bak | 110 - .github/workflows/test.yml | 12 - Makefile | 2 +- README.md | 4 +- docs/.env.example | 5 + docs/.gitignore | 20 + docs/.htmltest.external.yml | 14 + docs/.htmltest.yml | 5 + docs/Brewfile.netlify | 2 + docs/Makefile | 69 + docs/README.md | 83 +- docs/algolia.json | 51 + docs/assets/css/style.css | 49 + docs/assets/images/diagram.svg | 1585 ------ docs/assets/img/icons/chart.svg | 49 + docs/assets/img/icons/clock.svg | 29 + docs/assets/img/icons/code.svg | 19 + docs/assets/img/icons/hex.svg | 19 + docs/assets/img/icons/laptop.svg | 19 + docs/assets/img/icons/lock.svg | 14 + docs/assets/js/app.js | 126 + docs/assets/js/below.js | 105 + docs/assets/js/countries.json | 3806 ++++++++++++++ docs/assets/js/home.tsx | 320 ++ docs/assets/js/markers.json | 162 + docs/assets/sass/home.sass | 197 + docs/assets/sass/syntax.sass | 714 +++ docs/assets/sass/toc.sass | 76 + docs/assets/sass/unpurged.sass | 61 + docs/assets/sass/variables.sass | 25 + docs/babel.config.js | 34 + docs/config.toml | 382 ++ docs/content/en/_index.md | 146 + docs/content/en/blog/_index.md | 5 + .../en/blog/adaptive-request-concurrency.md | 162 + docs/content/en/blog/datadog-acquisition.md | 23 + docs/content/en/blog/graphql-api.md | 238 + docs/content/en/blog/how-we-test-vector.md | 391 ++ docs/content/en/blog/introducing-vector.md | 43 + .../content/en/blog/kubernetes-integration.md | 127 + docs/content/en/blog/vector-remap-language.md | 508 ++ docs/content/en/community/_index.md | 67 + docs/content/en/components/_index.md | 13 + docs/content/en/docs/_index.md | 20 + docs/content/en/docs/about/_index.md | 15 + docs/content/en/docs/about/concepts.md | 84 + .../en/docs/about/under-the-hood/_index.md | 15 + .../under-the-hood/architecture/_index.md | 19 + .../architecture/concurrency-model.md | 24 + .../architecture/data-model/_index.md | 25 + .../architecture/data-model/log.md | 40 + .../architecture/data-model/metric.md | 19 + .../architecture/pipeline-model.md | 36 + .../architecture/runtime-model.md | 52 + .../docs/about/under-the-hood/guarantees.md | 93 + .../about/under-the-hood/networking/_index.md | 8 + .../about/under-the-hood/networking/arc.md | 16 + docs/content/en/docs/about/what-is-vector.md | 17 + docs/content/en/docs/administration/_index.md | 19 + .../en/docs/administration/management.md | 208 + .../en/docs/administration/monitoring.md | 129 + docs/content/en/docs/administration/tuning.md | 9 + .../en/docs/administration/upgrading.md | 9 + .../en/docs/administration/validating.md | 63 + docs/content/en/docs/example.md | 7 + docs/content/en/docs/reference/_index.md | 19 + docs/content/en/docs/reference/api.md | 28 + docs/content/en/docs/reference/cli.md | 19 + .../en/docs/reference/configuration/_index.md | 285 + .../configuration/field-path-notation.md | 76 + .../reference/configuration/global-options.md | 10 + .../reference/configuration/sinks/_index.md | 13 + .../sinks/aws_cloudwatch_logs.md | 11 + .../sinks/aws_cloudwatch_metrics.md | 11 + .../sinks/aws_kinesis_firehose.md | 11 + .../sinks/aws_kinesis_streams.md | 11 + .../reference/configuration/sinks/aws_s3.md | 12 + .../reference/configuration/sinks/aws_sqs.md | 11 + .../configuration/sinks/azure_blob.md | 11 + .../configuration/sinks/azure_monitor_logs.md | 11 + .../configuration/sinks/blackhole.md | 11 + .../configuration/sinks/clickhouse.md | 11 + .../reference/configuration/sinks/console.md | 11 + .../configuration/sinks/datadog_events.md | 11 + .../configuration/sinks/datadog_logs.md | 11 + .../configuration/sinks/datadog_metrics.md | 11 + .../configuration/sinks/elasticsearch.md | 11 + .../reference/configuration/sinks/file.md | 11 + .../configuration/sinks/gcp_cloud_storage.md | 12 + .../configuration/sinks/gcp_pubsub.md | 11 + .../sinks/gcp_stackdriver_logs.md | 12 + .../sinks/gcp_stackdriver_metrics.md | 11 + .../configuration/sinks/honeycomb.md | 11 + .../reference/configuration/sinks/http.md | 11 + .../configuration/sinks/humio_logs.md | 11 + .../configuration/sinks/humio_metrics.md | 11 + .../configuration/sinks/influxdb_logs.md | 11 + .../configuration/sinks/influxdb_metrics.md | 11 + .../reference/configuration/sinks/kafka.md | 11 + .../reference/configuration/sinks/logdna.md | 11 + .../reference/configuration/sinks/loki.md | 11 + .../reference/configuration/sinks/nats.md | 11 + .../configuration/sinks/new_relic_logs.md | 11 + .../configuration/sinks/papertrail.md | 11 + .../sinks/prometheus_exporter.md | 12 + .../sinks/prometheus_remote_write.md | 11 + .../reference/configuration/sinks/pulsar.md | 11 + .../configuration/sinks/sematext_logs.md | 11 + .../configuration/sinks/sematext_metrics.md | 11 + .../reference/configuration/sinks/socket.md | 12 + .../configuration/sinks/splunk_hec.md | 11 + .../reference/configuration/sinks/statsd.md | 11 + .../reference/configuration/sinks/vector.md | 11 + .../reference/configuration/sources/_index.md | 16 + .../configuration/sources/apache_metrics.md | 12 + .../configuration/sources/aws_ecs_metrics.md | 13 + .../sources/aws_kinesis_firehose.md | 11 + .../reference/configuration/sources/aws_s3.md | 11 + .../configuration/sources/datadog_logs.md | 11 + .../reference/configuration/sources/dnstap.md | 11 + .../configuration/sources/docker_logs.md | 11 + .../sources/eventstoredb_metrics.md | 11 + .../reference/configuration/sources/exec.md | 11 + .../reference/configuration/sources/file.md | 11 + .../reference/configuration/sources/fluent.md | 11 + .../configuration/sources/generator.md | 11 + .../configuration/sources/heroku_logs.md | 11 + .../configuration/sources/host_metrics.md | 11 + .../reference/configuration/sources/http.md | 11 + .../configuration/sources/internal_logs.md | 11 + .../configuration/sources/internal_metrics.md | 11 + .../configuration/sources/journald.md | 11 + .../reference/configuration/sources/kafka.md | 11 + .../configuration/sources/kubernetes_logs.md | 11 + .../configuration/sources/logstash.md | 11 + .../configuration/sources/mongodb_metrics.md | 11 + .../configuration/sources/nginx_metrics.md | 11 + .../sources/postgresql_metrics.md | 11 + .../sources/prometheus_remote_write.md | 11 + .../sources/prometheus_scrape.md | 12 + .../reference/configuration/sources/socket.md | 12 + .../configuration/sources/splunk_hec.md | 12 + .../reference/configuration/sources/statsd.md | 11 + .../reference/configuration/sources/stdin.md | 11 + .../reference/configuration/sources/syslog.md | 11 + .../reference/configuration/sources/vector.md | 11 + .../configuration/template-syntax.md | 122 + .../en/docs/reference/configuration/tests.md | 18 + .../configuration/transforms/_index.md | 14 + .../configuration/transforms/aggregate.md | 10 + ...aws_cloudwatch_logs_subscription_parser.md | 12 + .../transforms/aws_ec2_metadata.md | 11 + .../configuration/transforms/dedupe.md | 12 + .../configuration/transforms/filter.md | 11 + .../configuration/transforms/geoip.md | 11 + .../configuration/transforms/log_to_metric.md | 11 + .../reference/configuration/transforms/lua.md | 11 + .../configuration/transforms/metric_to_log.md | 11 + .../configuration/transforms/reduce.md | 11 + .../configuration/transforms/remap.md | 14 + .../configuration/transforms/route.md | 11 + .../configuration/transforms/sample.md | 11 + .../transforms/tag_cardinality_limit.md | 11 + .../configuration/transforms/wasm.md | 12 + docs/content/en/docs/reference/glossary.md | 7 + docs/content/en/docs/reference/vrl/_index.md | 152 + docs/content/en/docs/reference/vrl/errors.md | 96 + .../content/en/docs/reference/vrl/examples.md | 79 + .../en/docs/reference/vrl/expressions.md | 28 + .../en/docs/reference/vrl/functions.md | 13 + docs/content/en/docs/setup/_index.md | 27 + .../en/docs/setup/deployment/_index.md | 19 + .../content/en/docs/setup/deployment/roles.md | 13 + .../en/docs/setup/deployment/topologies.md | 14 + .../en/docs/setup/installation/_index.md | 40 + .../docs/setup/installation/manual/_index.md | 12 + .../installation/manual/from-archives.md | 241 + .../setup/installation/manual/from-source.md | 308 ++ .../installation/operating-systems/_index.md | 9 + .../operating-systems/amazon-linux.md | 14 + .../installation/operating-systems/centos.md | 14 + .../installation/operating-systems/debian.md | 14 + .../installation/operating-systems/macos.md | 11 + .../installation/operating-systems/nixos.md | 14 + .../operating-systems/raspbian.md | 14 + .../installation/operating-systems/rhel.md | 14 + .../installation/operating-systems/ubuntu.md | 15 + .../installation/operating-systems/windows.md | 14 + .../installation/package-managers/_index.md | 14 + .../installation/package-managers/apt.md | 57 + .../installation/package-managers/dpkg.md | 39 + .../installation/package-managers/helm.md | 80 + .../installation/package-managers/homebrew.md | 34 + .../installation/package-managers/msi.md | 21 + .../installation/package-managers/nix.md | 47 + .../installation/package-managers/rpm.md | 35 + .../package-managers/vector-installer.md | 14 + .../installation/package-managers/yum.md | 47 + .../setup/installation/platforms/_index.md | 9 + .../setup/installation/platforms/docker.md | 83 + .../installation/platforms/kubernetes.md | 230 + docs/content/en/docs/setup/quickstart.md | 157 + docs/content/en/docs/setup/transformation.md | 207 + docs/content/en/download/_index.md | 5 + docs/content/en/guides/_index.md | 7 + docs/content/en/guides/advanced/_index.md | 6 + .../advanced/cloudwatch-logs-firehose.md | 620 +++ .../advanced/custom-aggregations-with-lua.md | 298 ++ .../advanced/merge-multiline-logs-with-lua.md | 159 + .../advanced/parsing-csv-logs-with-lua.md | 257 + docs/content/en/guides/advanced/wasm-hello.md | 259 + .../en/guides/advanced/wasm-multiline.md | 682 +++ docs/content/en/guides/level-up/_index.md | 6 + .../level-up/managing-complex-configs.md | 194 + .../en/guides/level-up/managing-schemas.md | 344 ++ .../en/guides/level-up}/transformation.md | 118 +- .../en/guides/level-up/troubleshooting.md | 115 + .../en/guides/level-up/unit-testing.md | 220 + ...oding-option-for-console-and-file-sinks.md | 12 +- .../2019-11-19-arm-support-on-linux.md | 30 +- .../highlights/2019-11-21-windows-support.md | 13 +- ...-11-25-unit-testing-vector-config-files.md | 24 +- ...-rename-datadog-sink-to-datadog_metrics.md | 12 +- .../en}/highlights/2019-12-13-custom-dns.md | 14 +- .../2019-12-14-kubernetes-source-alpha.md | 13 +- .../en}/highlights/2019-12-16-ec2-metadata.md | 17 +- ...udp-sources-into-a-single-socket-source.md | 12 +- ...move-existing-tcp-sink-into-socket-sink.md | 12 +- .../2020-01-07-prometheus-source.md | 19 +- .../2020-01-12-request-options-refactored.md | 15 +- ...a-delim-server-list-instead-of-an-array.md | 12 +- ...2020-01-14-rename-line-field-to-message.md | 12 +- ...01-20-splunk-hec-specify-indexed-fields.md | 12 +- .../highlights/2020-02-05-drop-aws-options.md | 19 +- .../2020-02-05-merge-partial-docker-events.md | 12 +- .../2020-02-07-multi-config-files.md | 9 +- .../2020-02-11-improved-syslog-parsing.md | 16 +- .../2020-02-14-global-log-schema.md | 25 +- ...0-02-17-add-fields-transform-templating.md | 18 +- .../en/highlights/2020-02-20-new-sinks.md | 30 + ...020-02-21-file-source-multiline-support.md | 21 +- .../2020-02-24-log-data-model-changes.md | 14 +- .../2020-02-24-rename-fields-transform.md | 18 + .../2020-02-24-swimlanes-transform.md | 14 +- .../highlights/2020-02-27-nixos-support.md | 10 +- .../2020-02-28-custom-vector-builds.md | 12 +- .../highlights/2020-03-03-privacy-policy.md | 10 +- ...3-04-encoding-only-fields-except-fields.md | 9 +- ...2020-03-04-encoding-whitelist-blacklist.md | 15 +- .../2020-03-09-kafka-sink-compression.md | 14 +- .../highlights/2020-03-10-dedupe-transform.md | 20 +- ...0-03-11-tag-cardinality-limit-transform.md | 25 +- .../highlights/2020-03-11-vector-sink-tls.md | 16 +- .../highlights/2020-03-12-papertrail-sink.md | 12 +- ...020-03-12-rename-host_field-to-host_key.md | 12 +- .../highlights/2020-03-14-honeycomb-sink.md | 11 +- .../2020-03-19-apache-pulsar-sink.md | 11 +- .../2020-03-23-datadog-logs-sink.md | 14 +- ...er_logging-sink-to-gcp_stackdriver_logs.md | 10 +- .../highlights/2020-03-31-filter-transform.md | 38 + .../highlights/2020-03-31-guides-section.md | 16 +- .../2020-04-01-more-condition-predicates.md | 23 +- .../2020-04-05-default-compression-to-none.md | 10 +- .../2020-04-07-lua-transform-version-2.md | 47 + ...ernal-tagging-for-metrics-serialization.md | 9 +- .../2020-04-07-vector-to-vector-metrics.md | 16 +- .../2020-04-09-make-acl-optional.md | 14 +- ...t-search_dirs-to-config-dirs-by-default.md | 15 +- .../en}/highlights/2020-04-17-new-sinks.md | 17 +- .../2020-04-20-improved-shutdown.md | 9 +- ...4-shutdown-vector-if-all-sources-finish.md | 9 +- ...5-add-support-for-include-exclude-units.md | 9 +- ...020-05-13-add-regexset-support-to-regex.md | 14 +- .../2020-05-20-add-bearer-auth-strategy.md | 12 +- ...27-add-support-for-loading-multiple-cas.md | 9 +- ...06-10-consolidate-and-beautify-validate.md | 9 +- ...2020-06-18-remove-custom-dns-resolution.md | 8 +- .../2020-06-27-add-sasl-to-kafka.md | 18 +- ...06-add-compression-option-for-aws-sinks.md | 16 +- ...dd-musl-and-glibc-support-to-install-sh.md | 9 +- .../2020-07-10-add-reduce-transform.md | 17 +- .../highlights/2020-08-31-mpl-2-0-license.md | 8 +- .../2020-09-18-adaptive-concurrency.md | 10 +- .../2020-10-27-kubernetes-integration.md | 12 +- .../2020-10-27-metrics-integrations.md | 23 +- .../2020-10-28-new-aws-integrations.md | 22 +- ...20-11-19-prometheus-remote-integrations.md | 15 +- .../2020-11-25-json-yaml-config-formats.md | 13 +- .../2020-12-01-0-11-upgrade-guide.md | 26 +- .../en}/highlights/2020-12-23-graphql-api.md | 9 +- .../2020-12-23-internal-logs-source.md | 13 +- .../en}/highlights/2020-12-23-vector-top.md | 12 +- .../2021-01-10-kafka-sink-metrics.md | 14 +- .../2021-01-20-wildcard-identifiers.md | 9 +- .../2021-01-31-file-source-checkpointing.md | 10 +- .../2021-02-16-0-12-upgrade-guide.md | 48 +- .../2021-02-16-filter-remap-support.md | 13 +- ...21-02-16-reduce-transform-remap-support.md | 14 +- .../2021-02-16-swimlanes-remap-support.md | 15 +- .../2021-02-16-vector-remap-language.md | 15 +- .../2021-04-21-0-13-upgrade-guide.md | 8 +- .../en}/highlights/2021-04-21-vector-tap.md | 9 +- .../en}/highlights/2021-04-21-vrl-abort.md | 11 +- .../2021-06-01-removing-helm-rawconfig.md | 10 +- .../highlights/2021-06-02-drop-jemalloc.md | 28 +- .../2021-06-02-fix-vector-metric-naming.md | 9 +- .../en}/highlights/2021-06-03-exec-source.md | 13 +- docs/content/en/highlights/_index.md | 6 + docs/content/en/releases/0.10.0.md | 4 + docs/content/en/releases/0.11.0.md | 4 + docs/content/en/releases/0.11.1.md | 4 + docs/content/en/releases/0.12.0.md | 4 + docs/content/en/releases/0.12.1.md | 4 + docs/content/en/releases/0.12.2.md | 4 + docs/content/en/releases/0.13.0.md | 4 + docs/content/en/releases/0.13.1.md | 4 + docs/content/en/releases/0.14.0.md | 4 + docs/content/en/releases/0.4.0.md | 4 + docs/content/en/releases/0.5.0.md | 4 + docs/content/en/releases/0.6.0.md | 4 + docs/content/en/releases/0.7.0.md | 4 + docs/content/en/releases/0.7.1.md | 4 + docs/content/en/releases/0.7.2.md | 4 + docs/content/en/releases/0.8.0.md | 4 + docs/content/en/releases/0.8.1.md | 4 + docs/content/en/releases/0.8.2.md | 4 + docs/content/en/releases/0.9.0.md | 4 + docs/content/en/releases/0.9.1.md | 4 + docs/content/en/releases/0.9.2.md | 4 + docs/content/en/releases/_index.md | 4 + docs/cue/README.md | 6 + docs/{ => cue}/reference.cue | 16 +- .../reference/administration.cue} | 7 +- .../reference/administration/downloads.cue | 153 + .../administration/install_commands.cue | 20 + .../reference/administration}/interfaces.cue | 6 +- .../administration/interfaces}/apt.cue | 17 +- .../administration/interfaces/docker_cli.cue} | 33 +- .../administration/interfaces}/dpkg.cue | 4 +- .../administration/interfaces}/helm3.cue | 4 +- .../administration/interfaces}/homebrew.cue | 4 +- .../administration/interfaces}/kubectl.cue | 2 +- .../administration/interfaces}/msi.cue | 13 +- .../administration/interfaces}/nix.cue | 4 +- .../role_implementations/file_agent.cue | 23 + .../role_implementations/file_sidecar.cue | 24 + .../role_implementations/journald_agent.cue | 21 + .../vector_aggregator.cue | 19 + .../administration/interfaces}/rpm.cue | 4 +- .../interfaces/vector_installer.cue} | 3 +- .../administration/interfaces}/yum.cue | 4 +- .../reference/administration/management.cue | 282 + .../administration}/operating_systems.cue | 4 +- .../operating_systems/amazon_linux.cue | 10 +- .../operating_systems/centos.cue | 14 +- .../operating_systems/debian.cue | 14 +- .../operating_systems/macos.cue | 8 +- .../operating_systems/nixos.cue | 8 +- .../operating_systems/raspbian.cue | 6 +- .../operating_systems/rhel.cue | 14 +- .../operating_systems/ubuntu.cue | 14 +- .../operating_systems/windows.cue | 8 +- .../administration}/package_managers.cue | 2 +- .../administration/package_managers/apt.cue | 6 + .../administration/package_managers/dpkg.cue | 6 + .../administration/package_managers/helm.cue | 6 + .../package_managers/homebrew.cue | 6 + .../administration/package_managers/msi.cue | 6 + .../administration/package_managers/nix.cue | 6 + .../administration/package_managers/rpm.cue | 6 + .../administration/package_managers/yum.cue | 6 + .../reference/administration}/roles.cue | 2 +- .../reference/administration}/roles/agent.cue | 4 +- .../administration}/roles/aggregator.cue | 2 +- .../reference/administration/topologies.cue | 25 + .../administration/topologies/centralized.cue | 60 + .../administration/topologies/distributed.cue | 60 + .../topologies/stream_based.cue | 63 + docs/cue/reference/administration/ui.cue | 59 + docs/{ => cue}/reference/api.cue | 2 +- docs/cue/reference/authors.cue | 47 + docs/{ => cue}/reference/cli.cue | 52 +- docs/{ => cue}/reference/components.cue | 32 +- docs/{ => cue}/reference/components/aws.cue | 41 +- docs/{ => cue}/reference/components/kafka.cue | 0 docs/{ => cue}/reference/components/sinks.cue | 67 +- .../components/sinks/aws_cloudwatch.cue | 0 .../components/sinks/aws_cloudwatch_logs.cue | 2 +- .../sinks/aws_cloudwatch_metrics.cue | 0 .../components/sinks/aws_kinesis_firehose.cue | 0 .../components/sinks/aws_kinesis_streams.cue | 15 +- .../reference/components/sinks/aws_s3.cue | 9 +- .../reference/components/sinks/aws_sqs.cue | 0 .../reference/components/sinks/azure_blob.cue | 29 +- .../components/sinks/azure_monitor_logs.cue | 0 .../reference/components/sinks/blackhole.cue | 0 .../reference/components/sinks/clickhouse.cue | 0 .../reference/components/sinks/console.cue | 0 .../reference/components/sinks/datadog.cue | 2 +- .../components/sinks/datadog_events.cue | 0 .../components/sinks/datadog_logs.cue | 0 .../components/sinks/datadog_metrics.cue | 0 .../components/sinks/elasticsearch.cue | 41 +- .../reference/components/sinks/file.cue | 0 .../reference/components/sinks/gcp.cue | 4 +- .../components/sinks/gcp_cloud_storage.cue | 52 +- .../reference/components/sinks/gcp_pubsub.cue | 2 +- .../components/sinks/gcp_stackdriver_logs.cue | 114 +- .../sinks/gcp_stackdriver_metrics.cue | 4 +- .../reference/components/sinks/honeycomb.cue | 0 .../reference/components/sinks/http.cue | 0 .../reference/components/sinks/humio.cue | 25 +- .../reference/components/sinks/humio_logs.cue | 0 .../components/sinks/humio_metrics.cue | 0 .../reference/components/sinks/influxdb.cue | 0 .../components/sinks/influxdb_logs.cue | 0 .../components/sinks/influxdb_metrics.cue | 0 .../reference/components/sinks/kafka.cue | 0 .../reference/components/sinks/logdna.cue | 0 .../reference/components/sinks/loki.cue | 24 +- .../reference/components/sinks/nats.cue | 0 .../components/sinks/new_relic_logs.cue | 0 .../reference/components/sinks/papertrail.cue | 0 .../components/sinks/prometheus_exporter.cue | 37 +- .../sinks/prometheus_remote_write.cue | 7 +- .../reference/components/sinks/pulsar.cue | 0 .../reference/components/sinks/redis.cue | 0 .../reference/components/sinks/sematext.cue | 0 .../components/sinks/sematext_logs.cue | 0 .../components/sinks/sematext_metrics.cue | 2 +- .../reference/components/sinks/socket.cue | 0 .../reference/components/sinks/splunk_hec.cue | 7 +- .../reference/components/sinks/statsd.cue | 0 .../reference/components/sinks/vector.cue | 0 .../reference/components/sources.cue | 6 +- .../components/sources/apache_metrics.cue | 2 +- .../components/sources/aws_ecs_metrics.cue | 8 +- .../sources/aws_kinesis_firehose.cue | 38 +- .../reference/components/sources/aws_s3.cue | 116 +- .../components/sources/datadog_logs.cue | 0 .../reference/components/sources/dnstap.cue | 87 +- .../components/sources/docker_logs.cue | 23 +- .../sources/eventstoredb_metrics.cue | 0 .../reference/components/sources/exec.cue | 2 +- .../reference/components/sources/file.cue | 74 +- .../reference/components/sources/fluent.cue | 0 .../components/sources/generator.cue | 0 .../components/sources/heroku_logs.cue | 0 .../components/sources/host_metrics.cue | 0 .../reference/components/sources/http.cue | 2 +- .../components/sources/internal_logs.cue | 8 +- .../components/sources/internal_metrics.cue | 9 +- .../reference/components/sources/journald.cue | 6 +- .../reference/components/sources/kafka.cue | 18 +- .../components/sources/kubernetes_logs.cue | 4 +- .../reference/components/sources/logstash.cue | 0 .../components/sources/mongodb_metrics.cue | 8 +- .../components/sources/nginx_metrics.cue | 4 +- .../components/sources/postgresql_metrics.cue | 25 +- .../sources/prometheus_remote_write.cue | 0 .../components/sources/prometheus_scrape.cue | 0 .../reference/components/sources/socket.cue | 16 +- .../components/sources/splunk_hec.cue | 0 .../reference/components/sources/statsd.cue | 15 +- .../reference/components/sources/stdin.cue | 5 +- .../reference/components/sources/syslog.cue | 20 +- .../reference/components/sources/vector.cue | 33 +- .../{ => cue}/reference/components/splunk.cue | 0 .../reference/components/transforms.cue | 0 .../components/transforms/add_fields.cue | 0 .../components/transforms/add_tags.cue | 0 .../components/transforms/aggregate.cue | 26 +- .../components/transforms/ansi_stripper.cue | 0 ...ws_cloudwatch_logs_subscription_parser.cue | 2 +- .../transforms/aws_ec2_metadata.cue | 0 .../components/transforms/coercer.cue | 0 .../components/transforms/concat.cue | 0 .../components/transforms/dedupe.cue | 2 +- .../components/transforms/filter.cue | 0 .../reference/components/transforms/geoip.cue | 0 .../components/transforms/grok_parser.cue | 0 .../components/transforms/json_parser.cue | 0 .../transforms/key_value_parser.cue | 0 .../components/transforms/log_to_metric.cue | 136 +- .../components/transforms/logfmt_parser.cue | 4 +- .../reference/components/transforms/lua.cue | 19 +- .../reference/components/transforms/merge.cue | 0 .../components/transforms/metric_to_log.cue | 8 +- .../components/transforms/reduce.cue | 17 +- .../components/transforms/regex_parser.cue | 8 +- .../reference/components/transforms/remap.cue | 24 +- .../components/transforms/remove_fields.cue | 0 .../components/transforms/remove_tags.cue | 0 .../components/transforms/rename_fields.cue | 0 .../reference/components/transforms/route.cue | 30 +- .../components/transforms/sample.cue | 0 .../reference/components/transforms/split.cue | 0 .../transforms/tag_cardinality_limit.cue | 12 +- .../components/transforms/tokenizer.cue | 0 .../reference/components/transforms/wasm.cue | 8 +- docs/{ => cue}/reference/configuration.cue | 6 +- docs/{ => cue}/reference/data_model.cue | 0 .../{ => cue}/reference/data_model/schema.cue | 7 +- docs/cue/reference/glossary.cue | 217 + docs/cue/reference/process.cue | 66 + docs/{ => cue}/reference/releases.cue | 7 +- docs/{ => cue}/reference/releases/0.10.0.cue | 6 +- docs/{ => cue}/reference/releases/0.11.0.cue | 0 docs/{ => cue}/reference/releases/0.11.1.cue | 3 +- docs/{ => cue}/reference/releases/0.12.0.cue | 2 +- docs/{ => cue}/reference/releases/0.12.1.cue | 3 +- docs/{ => cue}/reference/releases/0.12.2.cue | 7 +- docs/{ => cue}/reference/releases/0.13.0.cue | 5 +- docs/cue/reference/releases/0.13.1.cue | 13 + docs/{ => cue}/reference/releases/0.14.0.cue | 2 +- docs/{ => cue}/reference/releases/0.4.0.cue | 0 docs/{ => cue}/reference/releases/0.5.0.cue | 0 docs/{ => cue}/reference/releases/0.6.0.cue | 0 docs/{ => cue}/reference/releases/0.7.0.cue | 0 docs/{ => cue}/reference/releases/0.7.1.cue | 3 +- docs/{ => cue}/reference/releases/0.7.2.cue | 3 +- docs/{ => cue}/reference/releases/0.8.0.cue | 0 docs/{ => cue}/reference/releases/0.8.1.cue | 3 +- docs/{ => cue}/reference/releases/0.8.2.cue | 3 +- docs/{ => cue}/reference/releases/0.9.0.cue | 8 +- docs/{ => cue}/reference/releases/0.9.1.cue | 3 +- docs/{ => cue}/reference/releases/0.9.2.cue | 3 +- docs/{ => cue}/reference/remap.cue | 22 +- docs/{ => cue}/reference/remap/concepts.cue | 0 docs/cue/reference/remap/concepts/event.cue | 48 + .../reference/remap/concepts/expressions.cue | 7 + .../cue/reference/remap/concepts/function.cue | 23 + .../reference/remap/concepts/literal.cue | 5 +- docs/cue/reference/remap/concepts/program.cue | 8 + docs/{ => cue}/reference/remap/errors.cue | 0 .../100_unhandled_root_runtime_error.cue | 0 .../errors/101_malformed_regex_literal.cue | 4 +- ...02_non_boolean_if_expression_predicate.cue | 2 +- ...103_unhandled_assignment_runtime_error.cue | 2 +- .../104_unnecessary_error_assignment.cue | 2 +- .../remap/errors/105_undefined_function.cue | 2 +- .../106_function_argument_arity_mismatch.cue | 2 +- ...107_required_function_argument_missing.cue | 2 +- .../108_unknown_function_argument_keyword.cue | 2 +- .../errors/110_invalid_argument_type.cue | 10 +- .../remap/errors/203_unrecognized_token.cue | 0 .../remap/errors/204_unrecognized_eof.cue | 0 .../remap/errors/205_reserved_keyword.cue | 0 .../errors/206_invalid_numeric_literal.cue | 0 .../errors/207_invalid_string_literal.cue | 0 .../remap/errors/208_invalid_literal.cue | 0 .../errors/209_invalid_escape_character.cue | 0 .../remap/errors/300_unexpected_type.cue | 0 .../remap/errors/301_type_coercion_error.cue | 0 .../remap/errors/302_remainder_error.cue | 0 .../remap/errors/303_multiplication_error.cue | 2 +- .../remap/errors/304_division_error.cue | 0 .../remap/errors/305_divide_by_zero_error.cue | 2 +- .../reference/remap/errors/306_nan_float.cue | 0 .../remap/errors/307_addition_error.cue | 0 .../remap/errors/308_subtraction_error.cue | 0 .../reference/remap/errors/309_or_error.cue | 0 .../reference/remap/errors/310_and_error.cue | 0 .../remap/errors/311_greater_than_error.cue | 0 .../reference/remap/errors/312_ge_error.cue | 0 .../remap/errors/313_less_than_error.cue | 0 .../reference/remap/errors/314_le_error.cue | 0 .../errors/400_unexpected_expression.cue | 0 .../remap/errors/401_invalid_enum_variant.cue | 0 .../errors/402_expected_static_expression.cue | 0 .../remap/errors/403_invalid_argument.cue | 0 .../remap/errors/601_invalid_timestamp.cue | 2 +- .../620_aborting_infallible_function.cue | 0 .../remap/errors/630_fallible_argument.cue | 0 .../remap/errors/640_unnecessary_noop.cue | 0 .../650_chained_comparison_operators.cue | 0 ...unnecessary_error_coalescing_operation.cue | 0 .../remap/errors/652_merge_non_objects.cue | 0 .../remap/errors/660_non_boolean_negation.cue | 0 .../{ => cue}/reference/remap/expressions.cue | 0 .../reference/remap/expressions/abort.cue | 0 .../remap/expressions/arithmetic.cue | 0 .../remap/expressions/assignment.cue | 0 .../reference/remap/expressions/block.cue | 0 .../reference/remap/expressions/coalesce.cue | 0 .../remap/expressions/comparison.cue | 0 .../remap/expressions/function_call.cue | 0 .../reference/remap/expressions/if.cue | 0 .../reference/remap/expressions/index.cue | 0 .../reference/remap/expressions/logical.cue | 0 .../reference/remap/expressions/path.cue | 0 .../reference/remap/expressions/variable.cue | 0 docs/{ => cue}/reference/remap/features.cue | 0 .../reference/remap/features/compilation.cue | 6 +- .../remap/features/ergonomic_safety.cue | 11 +- .../reference/remap/features/fail_safety.cue | 2 +- .../features/high_quality_error_messages.cue} | 6 +- .../remap/features/logs_and_metrics.cue | 0 .../remap/features/memory_safety.cue | 0 .../reference/remap/features/native.cue | 0 .../reference/remap/features/stateless.cue | 0 .../reference/remap/features/type_safety.cue | 16 +- docs/{ => cue}/reference/remap/functions.cue | 22 + .../reference/remap/functions/append.cue | 0 .../reference/remap/functions/array.cue | 0 .../reference/remap/functions/assert.cue | 0 .../reference/remap/functions/bool.cue | 0 .../reference/remap/functions/ceil.cue | 0 .../reference/remap/functions/compact.cue | 0 .../reference/remap/functions/contains.cue | 0 .../remap/functions/decode_base64.cue | 0 .../remap/functions/decode_percent.cue | 2 +- .../reference/remap/functions/del.cue | 0 .../reference/remap/functions/downcase.cue | 0 .../remap/functions/encode_base64.cue | 0 .../reference/remap/functions/encode_json.cue | 0 .../remap/functions/encode_key_value.cue | 6 +- .../remap/functions/encode_logfmt.cue | 6 +- .../remap/functions/encode_percent.cue | 0 .../reference/remap/functions/ends_with.cue | 0 .../reference/remap/functions/exists.cue | 0 .../reference/remap/functions/flatten.cue | 0 .../reference/remap/functions/float.cue | 0 .../reference/remap/functions/floor.cue | 0 .../reference/remap/functions/format_int.cue | 0 .../remap/functions/format_number.cue | 0 .../remap/functions/format_timestamp.cue | 0 .../reference/remap/functions/get_env_var.cue | 0 .../remap/functions/get_hostname.cue | 0 .../reference/remap/functions/includes.cue | 0 .../reference/remap/functions/int.cue | 0 .../reference/remap/functions/ip_aton.cue | 0 .../remap/functions/ip_cidr_contains.cue | 0 .../reference/remap/functions/ip_ntoa.cue | 0 .../reference/remap/functions/ip_subnet.cue | 0 .../reference/remap/functions/ip_to_ipv6.cue | 0 .../remap/functions/ipv6_to_ipv4.cue | 0 .../reference/remap/functions/is_array.cue | 0 .../reference/remap/functions/is_boolean.cue | 0 .../reference/remap/functions/is_float.cue | 0 .../reference/remap/functions/is_integer.cue | 0 .../reference/remap/functions/is_null.cue | 0 .../reference/remap/functions/is_nullish.cue | 0 .../reference/remap/functions/is_object.cue | 0 .../reference/remap/functions/is_regex.cue | 0 .../reference/remap/functions/is_string.cue | 0 .../remap/functions/is_timestamp.cue | 0 .../reference/remap/functions/join.cue | 0 .../reference/remap/functions/length.cue | 0 .../reference/remap/functions/log.cue | 0 .../reference/remap/functions/match.cue | 0 .../reference/remap/functions/match_any.cue | 0 .../reference/remap/functions/match_array.cue | 0 .../reference/remap/functions/md5.cue | 0 .../reference/remap/functions/merge.cue | 0 .../reference/remap/functions/now.cue | 0 .../reference/remap/functions/object.cue | 0 .../remap/functions/parse_apache_log.cue | 0 .../remap/functions/parse_aws_alb_log.cue | 0 ...ws_cloudwatch_log_subscription_message.cue | 0 .../functions/parse_aws_vpc_flow_log.cue | 0 .../remap/functions/parse_common_log.cue | 4 +- .../reference/remap/functions/parse_csv.cue | 0 .../remap/functions/parse_duration.cue | 0 .../reference/remap/functions/parse_glog.cue | 0 .../reference/remap/functions/parse_grok.cue | 0 .../reference/remap/functions/parse_int.cue | 0 .../reference/remap/functions/parse_json.cue | 0 .../remap/functions/parse_key_value.cue | 8 +- .../reference/remap/functions/parse_klog.cue | 0 .../functions/parse_linux_authorization.cue | 4 +- .../remap/functions/parse_logfmt.cue | 15 +- .../remap/functions/parse_nginx_log.cue | 13 +- .../remap/functions/parse_query_string.cue | 0 .../reference/remap/functions/parse_regex.cue | 0 .../remap/functions/parse_regex_all.cue | 4 +- .../remap/functions/parse_ruby_hash.cue | 0 .../remap/functions/parse_syslog.cue | 0 .../remap/functions/parse_timestamp.cue | 0 .../remap/functions/parse_tokens.cue | 0 .../reference/remap/functions/parse_url.cue | 0 .../reference/remap/functions/parse_xml.cue | 0 .../reference/remap/functions/push.cue | 0 .../reference/remap/functions/redact.cue | 24 +- .../reference/remap/functions/replace.cue | 0 .../reference/remap/functions/round.cue | 0 .../reference/remap/functions/sha1.cue | 0 .../reference/remap/functions/sha2.cue | 0 .../reference/remap/functions/sha3.cue | 0 .../reference/remap/functions/slice.cue | 0 .../reference/remap/functions/split.cue | 0 .../reference/remap/functions/starts_with.cue | 0 .../reference/remap/functions/string.cue | 0 .../functions/strip_ansi_escape_codes.cue | 0 .../remap/functions/strip_whitespace.cue | 0 .../remap/functions/tag_types_externally.cue | 0 .../reference/remap/functions/timestamp.cue | 0 .../reference/remap/functions/to_bool.cue | 0 .../reference/remap/functions/to_float.cue | 0 .../reference/remap/functions/to_int.cue | 0 .../reference/remap/functions/to_regex.cue | 0 .../reference/remap/functions/to_string.cue | 0 .../remap/functions/to_syslog_facility.cue | 0 .../remap/functions/to_syslog_level.cue | 2 +- .../remap/functions/to_syslog_severity.cue | 0 .../remap/functions/to_timestamp.cue | 0 .../remap/functions/to_unix_timestamp.cue | 0 .../reference/remap/functions/truncate.cue | 0 .../reference/remap/functions/upcase.cue | 0 .../reference/remap/functions/uuid_v4.cue | 0 docs/{ => cue}/reference/remap/literals.cue | 1 - .../reference/remap/literals/array.cue | 8 +- .../reference/remap/literals/boolean.cue | 0 .../reference/remap/literals/float.cue | 0 .../reference/remap/literals/integer.cue | 0 .../reference/remap/literals/null.cue | 0 .../reference/remap/literals/object.cue | 0 .../remap/literals/regular_expression.cue | 2 +- .../reference/remap/literals/string.cue | 0 .../reference/remap/literals/timestamp.cue | 0 docs/{ => cue}/reference/remap/principles.cue | 0 .../remap/principles/performance.cue | 0 .../reference/remap/principles/safety.cue | 0 docs/{ => cue}/reference/remap/syntax.cue | 1 - .../reference/remap/syntax/comment.cue | 0 .../reference/remap/syntax/keywords.cue | 0 .../reference/remap/syntax/whitespace.cue | 0 docs/{ => cue}/reference/services.cue | 0 .../reference/services/apache_http.cue | 0 .../reference/services/aws_cloudwatch.cue | 0 .../services/aws_cloudwatch_logs.cue | 0 .../services/aws_cloudwatch_metrics.cue | 0 docs/{ => cue}/reference/services/aws_ecs.cue | 0 .../services/aws_kinesis_data_streams.cue | 0 .../services/aws_kinesis_firehose.cue | 0 docs/{ => cue}/reference/services/aws_s3.cue | 0 docs/{ => cue}/reference/services/aws_sqs.cue | 0 .../reference/services/azure_blob.cue | 0 .../reference/services/azure_monitor_logs.cue | 0 .../reference/services/clickhouse.cue | 0 docs/{ => cue}/reference/services/datadog.cue | 0 .../reference/services/datadog_events.cue | 0 .../reference/services/datadog_logs.cue | 0 .../reference/services/datadog_metrics.cue | 0 .../reference/services/dnstap_data.cue | 0 docs/{ => cue}/reference/services/docker.cue | 0 .../reference/services/elasticsearch.cue | 0 .../services/eventstoredb_stats_client.cue | 0 docs/{ => cue}/reference/services/exec.cue | 0 docs/{ => cue}/reference/services/files.cue | 0 docs/{ => cue}/reference/services/fluent.cue | 0 .../services/gcp_cloud_monitoring.cue | 10 + .../reference/services/gcp_cloud_storage.cue | 10 + .../services/gcp_operations_logs.cue | 10 + docs/cue/reference/services/gcp_pubsub.cue | 10 + docs/{ => cue}/reference/services/heroku.cue | 0 .../reference/services/honeycomb.cue | 0 docs/{ => cue}/reference/services/host.cue | 0 docs/{ => cue}/reference/services/http.cue | 0 docs/cue/reference/services/humio.cue | 10 + .../{ => cue}/reference/services/influxdb.cue | 0 .../{ => cue}/reference/services/journald.cue | 0 docs/{ => cue}/reference/services/kafka.cue | 0 .../reference/services/kubernetes.cue | 0 docs/{ => cue}/reference/services/logdna.cue | 0 .../{ => cue}/reference/services/logstash.cue | 0 docs/cue/reference/services/loki.cue | 10 + docs/cue/reference/services/mongodb.cue | 10 + docs/{ => cue}/reference/services/nats.cue | 0 .../cue/reference/services/new_relic_logs.cue | 10 + docs/cue/reference/services/nginx.cue | 10 + .../reference/services/papertrail.cue | 0 .../reference/services/prometheus.cue | 0 .../reference/services/prometheus_client.cue | 0 docs/{ => cue}/reference/services/pulsar.cue | 0 docs/{ => cue}/reference/services/redis.cue | 0 .../{ => cue}/reference/services/sematext.cue | 0 .../reference/services/socket_client.cue | 0 .../reference/services/socket_recevier.cue | 0 docs/{ => cue}/reference/services/splunk.cue | 0 docs/{ => cue}/reference/services/statsd.cue | 0 .../reference/services/statsd_receiver.cue | 0 docs/{ => cue}/reference/services/stdin.cue | 0 docs/{ => cue}/reference/services/stdout.cue | 0 docs/{ => cue}/reference/services/syslog.cue | 0 docs/{ => cue}/reference/services/vector.cue | 0 docs/{ => cue}/reference/team.cue | 0 docs/{ => cue}/reference/urls.cue | 194 +- docs/cue/reference/versions.cue | 26 + docs/data/.gitkeep | 0 docs/guides/integrate.cue | 46 - docs/highlights/.schema.json | 74 - docs/highlights/2020-02-20-new-sinks.md | 29 - .../2020-02-24-rename-fields-transform.md | 16 - .../highlights/2020-03-31-filter-transform.md | 37 - .../2020-04-07-lua-transform-version-2.md | 55 - docs/layouts/404.html | 28 + .../_default/_markup/render-heading.html | 10 + .../layouts/_default/_markup/render-link.html | 12 + docs/layouts/_default/baseof.html | 66 + docs/layouts/_default/blog-post-card.html | 45 + .../_default/component-card-selectable.html | 30 + docs/layouts/_default/component-card.html | 28 + docs/layouts/_default/li.html | 13 + docs/layouts/_default/list.search.json | 17 + docs/layouts/_default/section-card.html | 15 + docs/layouts/blog/section.html | 42 + docs/layouts/blog/single.html | 26 + docs/layouts/community/section.html | 37 + docs/layouts/components/section.html | 43 + docs/layouts/docs/component.html | 137 + docs/layouts/docs/section.html | 15 + docs/layouts/docs/single.html | 15 + docs/layouts/download/section.html | 127 + docs/layouts/guides/integrate.html | 110 + docs/layouts/guides/li.html | 42 + docs/layouts/guides/list.html | 5 + docs/layouts/guides/section.html | 105 + docs/layouts/guides/single.html | 31 + docs/layouts/highlights/li.html | 63 + docs/layouts/highlights/section.html | 61 + docs/layouts/highlights/single.html | 27 + docs/layouts/home.html | 19 + docs/layouts/partials/admonition.html | 57 + docs/layouts/partials/badge.html | 18 + docs/layouts/partials/banner.html | 31 + docs/layouts/partials/blog/authors.html | 22 + docs/layouts/partials/blog/hero.html | 34 + docs/layouts/partials/blog/pagination.html | 5 + docs/layouts/partials/breadcrumb.html | 27 + docs/layouts/partials/community/hero.html | 44 + docs/layouts/partials/content.html | 3 + docs/layouts/partials/css.html | 34 + docs/layouts/partials/data.html | 1709 ++++++ .../partials/docs/component-under-hero.html | 58 + docs/layouts/partials/docs/dashboard.html | 42 + docs/layouts/partials/docs/edit.html | 15 + docs/layouts/partials/docs/mobile-nav.html | 24 + docs/layouts/partials/docs/pagination.html | 5 + .../partials/docs/section-pages-list.html | 31 + docs/layouts/partials/docs/sidebar.html | 144 + docs/layouts/partials/docs/slideover.html | 42 + .../partials/download/download-matrix.html | 60 + docs/layouts/partials/download/links.html | 25 + .../partials/download/release-toggle.html | 25 + .../partials/download/version-selector.html | 67 + docs/layouts/partials/footer.html | 43 + docs/layouts/partials/guides/badges.html | 25 + .../partials/guides/integrate/hero.html | 19 + docs/layouts/partials/guides/pagination.html | 5 + docs/layouts/partials/guides/tutorial.html | 3 + docs/layouts/partials/heading.html | 28 + docs/layouts/partials/hero.html | 18 + docs/layouts/partials/highlights/authors.html | 22 + .../partials/highlights/pagination.html | 5 + docs/layouts/partials/home/community.html | 47 + docs/layouts/partials/home/components.html | 48 + docs/layouts/partials/home/configure.html | 59 + docs/layouts/partials/home/heading.html | 7 + docs/layouts/partials/home/hero.html | 51 + docs/layouts/partials/home/installation.html | 74 + docs/layouts/partials/home/platform.html | 39 + docs/layouts/partials/home/what.html | 16 + docs/layouts/partials/home/why-vector.html | 37 + docs/layouts/partials/icon.html | 2 + docs/layouts/partials/javascript/below.html | 4 + docs/layouts/partials/javascript/head.html | 9 + docs/layouts/partials/javascript/home.html | 5 + docs/layouts/partials/meta.html | 36 + docs/layouts/partials/navbar.html | 120 + docs/layouts/partials/navbar/flyout-menu.html | 40 + docs/layouts/partials/navbar/search-bar.html | 16 + .../partials/navbar/search-results.html | 20 + docs/layouts/partials/navbar/toggler.html | 23 + docs/layouts/partials/one-liner.html | 19 + docs/layouts/partials/pagination.html | 38 + .../layouts/partials/releases/pagination.html | 5 + docs/layouts/partials/social-buttons.html | 14 + docs/layouts/partials/svg.html | 4 + docs/layouts/partials/toc.html | 14 + docs/layouts/releases/li.html | 26 + docs/layouts/releases/section.html | 18 + docs/layouts/releases/single.html | 136 + .../shortcodes/administration/logs.html | 90 + .../shortcodes/administration/manage.html | 85 + .../shortcodes/administration/process.html | 2 + .../shortcodes/administration/upgrading.html | 55 + docs/layouts/shortcodes/api/config.html | 2 + docs/layouts/shortcodes/api/endpoints.html | 62 + docs/layouts/shortcodes/cli/commands.html | 170 + docs/layouts/shortcodes/cli/env-vars.html | 5 + docs/layouts/shortcodes/cli/interface.html | 9 + docs/layouts/shortcodes/components.html | 9 + docs/layouts/shortcodes/config/global.html | 2 + .../layouts/shortcodes/config/log-schema.html | 2 + .../shortcodes/config/metric-schema.html | 2 + .../layouts/shortcodes/config/unit-tests.html | 0 docs/layouts/shortcodes/danger.html | 1 + docs/layouts/shortcodes/details.html | 14 + .../shortcodes/easy-install-scripts.html | 19 + docs/layouts/shortcodes/file-issue.html | 10 + docs/layouts/shortcodes/glossary.html | 14 + docs/layouts/shortcodes/info.html | 1 + .../shortcodes/internal-metrics-list.html | 38 + docs/layouts/shortcodes/jump.html | 27 + docs/layouts/shortcodes/pages.html | 7 + docs/layouts/shortcodes/quote.html | 1 + docs/layouts/shortcodes/requirement.html | 1 + docs/layouts/shortcodes/roles.html | 27 + docs/layouts/shortcodes/sections.html | 7 + docs/layouts/shortcodes/snippet.html | 12 + docs/layouts/shortcodes/success.html | 1 + .../shortcodes/supported-installers.html | 14 + docs/layouts/shortcodes/svg.html | 2 + docs/layouts/shortcodes/tab.html | 8 + docs/layouts/shortcodes/tabs.html | 19 + docs/layouts/shortcodes/topologies.html | 32 + docs/layouts/shortcodes/version.html | 1 + docs/layouts/shortcodes/vrl/concepts.html | 2 + .../shortcodes/vrl/dynamic-expressions.html | 2 + .../shortcodes/vrl/errors/compile-time.html | 2 + docs/layouts/shortcodes/vrl/examples.html | 9 + docs/layouts/shortcodes/vrl/features.html | 2 + docs/layouts/shortcodes/vrl/functions.html | 16 + .../shortcodes/vrl/literal-expressions.html | 2 + docs/layouts/shortcodes/vrl/principles.html | 2 + .../shortcodes/vrl/real-world-examples.html | 3 + docs/layouts/shortcodes/vrl/syntax.html | 2 + docs/layouts/shortcodes/warning.html | 1 + docs/manual/about.md | 13 - docs/manual/about/concepts.md | 117 - docs/manual/about/under-the-hood.md | 10 - .../about/under-the-hood/architecture.md | 21 - .../architecture/concurrency-model.md | 35 - .../under-the-hood/architecture/data-model.md | 36 - .../architecture/data-model/log.md | 18 - .../architecture/data-model/metric.md | 21 - .../architecture/pipeline-model.md | 46 - .../architecture/runtime-model.md | 74 - .../manual/about/under-the-hood/guarantees.md | 142 - .../manual/about/under-the-hood/networking.md | 14 - .../adaptive-request-concurrency.md | 17 - docs/manual/about/what-is-vector.md | 23 - docs/manual/administration.md | 16 - docs/manual/administration/monitoring.md | 167 - .../administration/process-management.md | 345 -- docs/manual/administration/tuning.md | 13 - docs/manual/administration/updating.md | 45 - docs/manual/administration/validating.md | 64 - docs/manual/meta/glossary.md | 159 - docs/manual/setup.md | 13 - docs/manual/setup/configuration.md | 198 - docs/manual/setup/deployment.md | 26 - docs/manual/setup/deployment/strategies.md | 112 - docs/manual/setup/deployment/topologies.md | 111 - docs/manual/setup/getting-started.md | 188 - docs/manual/setup/installation.md | 23 - docs/manual/setup/installation/manual.md | 15 - .../installation/manual/from-archives.md | 311 -- .../setup/installation/manual/from-source.md | 565 -- docs/package.json | 42 + docs/postcss.config.js | 37 + .../role_implementations/file_agent.cue | 27 - .../role_implementations/file_sidecar.cue | 28 - .../role_implementations/journald_agent.cue | 25 - .../vector_aggregator.cue | 23 - docs/reference/installation/downloads.cue | 23 - .../installation/downloads/aarch64-rpm.cue | 13 - .../aarch64-unknown-linux-gnu-tar-gz.cue | 12 - .../installation/downloads/amd64-deb.cue | 13 - .../installation/downloads/arm64-deb.cue | 13 - .../installation/downloads/armhf-deb.cue | 13 - .../installation/downloads/armv7-rpm.cue | 13 - .../armv7-unknown-linux-gnueabihf-tar-gz.cue | 12 - .../installation/downloads/x64-msi.cue | 13 - .../downloads/x86_64-apple-darwin-tar-gz.cue | 12 - .../downloads/x86_64-pc-windows-msvc-zip.cue | 12 - .../installation/downloads/x86_64-rpm.cue | 13 - .../x86_64-unknown-linux-gnu-tar-gz.cue | 12 - .../installation/package_managers/apt.cue | 6 - .../installation/package_managers/dpkg.cue | 6 - .../installation/package_managers/helm.cue | 6 - .../package_managers/homebrew.cue | 6 - .../installation/package_managers/msi.cue | 6 - .../installation/package_managers/nix.cue | 6 - .../installation/package_managers/rpm.cue | 6 - .../installation/package_managers/yum.cue | 6 - docs/reference/installation/platforms.cue | 17 - .../installation/platforms/docker.cue | 15 - .../installation/platforms/kubernetes.cue | 29 - docs/reference/process.cue | 45 - docs/reference/remap/concepts/event.cue | 46 - docs/reference/remap/concepts/expression.cue | 7 - docs/reference/remap/concepts/function.cue | 21 - docs/reference/remap/concepts/program.cue | 7 - .../services/gcp_cloud_monitoring.cue | 10 - docs/reference/services/gcp_cloud_storage.cue | 10 - .../services/gcp_operations_logs.cue | 10 - docs/reference/services/gcp_pubsub.cue | 10 - docs/reference/services/humio.cue | 10 - docs/reference/services/loki.cue | 10 - docs/reference/services/mongodb.cue | 10 - docs/reference/services/new_relic_logs.cue | 10 - docs/reference/services/nginx.cue | 10 - docs/scripts/cue.sh | 96 + docs/snippets/ack.md | 1 + docs/snippets/arc.md | 25 + docs/snippets/buffers-and-batches.md | 8 + docs/snippets/checkpointing.md | 3 + .../background/aws-cloudwatch-logs.md | 3 + .../background/aws-cloudwatch-metrics.md | 3 + .../background/aws-simple-queue-service.md | 3 + .../guides/integrate/background/docker.md | 3 + .../guides/integrate/background/kubernetes.md | 3 + docs/snippets/guides/integrate/data/logs.md | 1 + .../snippets/guides/integrate/data/metrics.md | 1 + docs/snippets/guides/integrate/vector.md | 6 + docs/snippets/health-checks.md | 13 + docs/snippets/how-it-works/feature-flags.md | 37 + docs/snippets/how-it-works/schemas.md | 5 + docs/snippets/how-it-works/types.md | 42 + docs/snippets/librdkafka.md | 3 + docs/snippets/line-delimiters.md | 1 + docs/snippets/partitioning.md | 8 + docs/snippets/retry-policy.md | 1 + docs/snippets/stateless.md | 1 + docs/snippets/tls.md | 3 + docs/snippets/ui/start.md | 27 + docs/static/_redirects | 21 + docs/static/favicon.ico | Bin 0 -> 123726 bytes docs/static/img/adaptive-concurrency.png | Bin 0 -> 154675 bytes docs/static/img/architecture.svg | 67 + .../img/aws-kinesis-firehose-to-vector.png | Bin 0 -> 85683 bytes docs/static/img/blog/k8s-after.png | Bin 0 -> 103973 bytes docs/static/img/blog/k8s-before.png | Bin 0 -> 180740 bytes docs/static/img/blog/k8s-resources-after.png | Bin 0 -> 57621 bytes docs/static/img/blog/k8s-resources-before.png | Bin 0 -> 83913 bytes docs/static/img/blog/rate-limiting-loop.png | Bin 0 -> 210720 bytes .../img/blog/vector-api-public-playground.png | Bin 0 -> 212385 bytes docs/static/img/blog/vector-top.png | Bin 0 -> 323512 bytes .../img/blog/vrl-quadrant-comparison.svg | 64 + .../img/buffers-and-batches-partitioned.svg | 100 + .../static/img/buffers-and-batches-serial.svg | 60 + docs/static/img/concurrency-model.svg | 186 + docs/static/img/data-model-event.svg | 165 + docs/static/img/data-model-log.svg | 168 + docs/static/img/data-model-metric.svg | 169 + docs/static/img/deployment.png | Bin 0 -> 84378 bytes .../guides/aws-kinesis-firehose-to-vector.png | Bin 0 -> 85683 bytes docs/static/img/guides/merge-transform.svg | 991 ++++ docs/static/img/hero-hex.svg | 285 + docs/static/img/logos/apple.svg | 10 + docs/static/img/logos/aws_cloudwatch.svg | 15 + .../static/img/logos/aws_kinesis_firehose.svg | 24 + docs/static/img/logos/aws_kinesis_streams.svg | 22 + docs/static/img/logos/aws_s3.svg | 14 + docs/static/img/logos/clickhouse.svg | 16 + docs/static/img/logos/datadog.svg | 12 + docs/static/img/logos/docker.svg | 88 + docs/static/img/logos/elasticsearch.svg | 16 + docs/static/img/logos/file.svg | 15 + docs/static/img/logos/gcp_big_query.svg | 21 + docs/static/img/logos/gcp_cloud_storage.svg | 18 + docs/static/img/logos/gcp_pubsub.svg | 24 + docs/static/img/logos/gcp_stackdriver.svg | 15 + docs/static/img/logos/honeycomb.svg | 14 + docs/static/img/logos/http.svg | 11 + docs/static/img/logos/humio.svg | 13 + docs/static/img/logos/influxdb.svg | 12 + docs/static/img/logos/journald.svg | 13 + docs/static/img/logos/kafka.svg | 11 + docs/static/img/logos/kubernetes.svg | 6 + docs/static/img/logos/linux.svg | 22 + docs/static/img/logos/logdna.svg | 11 + docs/static/img/logos/logplex.svg | 11 + docs/static/img/logos/loki.svg | 87 + docs/static/img/logos/new_relic.svg | 20 + docs/static/img/logos/papertrail.svg | 18 + docs/static/img/logos/prometheus.svg | 11 + docs/static/img/logos/pulsar.svg | 11 + docs/static/img/logos/raspbian.svg | 32 + docs/static/img/logos/sematext.svg | 13 + docs/static/img/logos/socket.svg | 9 + docs/static/img/logos/splunk_hec.svg | 11 + docs/static/img/logos/statsd.svg | 12 + docs/static/img/logos/stdin.svg | 11 + docs/static/img/logos/syslog.svg | 11 + docs/static/img/logos/vector-logo-dark.svg | 28 + docs/static/img/logos/vector-logo-light.svg | 25 + docs/static/img/logos/vector.svg | 13 + docs/static/img/logos/windows.svg | 10 + docs/static/img/pipeline-model.svg | 123 + docs/static/img/roles/agent.svg | 69 + docs/static/img/roles/aggregator.svg | 105 + docs/static/img/roles/daemon.svg | 110 + docs/static/img/roles/service.svg | 82 + docs/static/img/roles/sidecar.svg | 146 + docs/static/img/runtime-model.svg | 92 + docs/static/img/topologies/centralized.svg | 117 + docs/static/img/topologies/distributed.svg | 101 + docs/static/img/topologies/stream-based.svg | 252 + docs/static/img/topology-centralized.svg | 117 + docs/static/img/topology-distributed.svg | 101 + docs/static/img/topology-stream-based.svg | 252 + docs/static/img/vector-open-graph.png | Bin 0 -> 350907 bytes docs/tailwind.config.js | 1086 ++++ docs/yarn.lock | 4572 +++++++++++++++++ netlify.toml | 70 + scripts/check-docs.sh | 59 +- scripts/check-markdown.sh | 16 - scripts/check-style.sh | 1 + scripts/cue.sh | 5 +- scripts/release-prepare.rb | 2 +- 1116 files changed, 36043 insertions(+), 7286 deletions(-) delete mode 100644 .github/workflows/publish-docs.yml.bak create mode 100644 docs/.env.example create mode 100644 docs/.gitignore create mode 100644 docs/.htmltest.external.yml create mode 100644 docs/.htmltest.yml create mode 100644 docs/Brewfile.netlify create mode 100644 docs/Makefile create mode 100644 docs/algolia.json create mode 100644 docs/assets/css/style.css delete mode 100644 docs/assets/images/diagram.svg create mode 100644 docs/assets/img/icons/chart.svg create mode 100644 docs/assets/img/icons/clock.svg create mode 100644 docs/assets/img/icons/code.svg create mode 100644 docs/assets/img/icons/hex.svg create mode 100644 docs/assets/img/icons/laptop.svg create mode 100644 docs/assets/img/icons/lock.svg create mode 100644 docs/assets/js/app.js create mode 100644 docs/assets/js/below.js create mode 100644 docs/assets/js/countries.json create mode 100644 docs/assets/js/home.tsx create mode 100644 docs/assets/js/markers.json create mode 100644 docs/assets/sass/home.sass create mode 100644 docs/assets/sass/syntax.sass create mode 100644 docs/assets/sass/toc.sass create mode 100644 docs/assets/sass/unpurged.sass create mode 100644 docs/assets/sass/variables.sass create mode 100644 docs/babel.config.js create mode 100644 docs/config.toml create mode 100644 docs/content/en/_index.md create mode 100644 docs/content/en/blog/_index.md create mode 100644 docs/content/en/blog/adaptive-request-concurrency.md create mode 100644 docs/content/en/blog/datadog-acquisition.md create mode 100644 docs/content/en/blog/graphql-api.md create mode 100644 docs/content/en/blog/how-we-test-vector.md create mode 100644 docs/content/en/blog/introducing-vector.md create mode 100644 docs/content/en/blog/kubernetes-integration.md create mode 100644 docs/content/en/blog/vector-remap-language.md create mode 100644 docs/content/en/community/_index.md create mode 100644 docs/content/en/components/_index.md create mode 100644 docs/content/en/docs/_index.md create mode 100644 docs/content/en/docs/about/_index.md create mode 100644 docs/content/en/docs/about/concepts.md create mode 100644 docs/content/en/docs/about/under-the-hood/_index.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/_index.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/concurrency-model.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/data-model/_index.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/data-model/log.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/data-model/metric.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/pipeline-model.md create mode 100644 docs/content/en/docs/about/under-the-hood/architecture/runtime-model.md create mode 100644 docs/content/en/docs/about/under-the-hood/guarantees.md create mode 100644 docs/content/en/docs/about/under-the-hood/networking/_index.md create mode 100644 docs/content/en/docs/about/under-the-hood/networking/arc.md create mode 100644 docs/content/en/docs/about/what-is-vector.md create mode 100644 docs/content/en/docs/administration/_index.md create mode 100644 docs/content/en/docs/administration/management.md create mode 100644 docs/content/en/docs/administration/monitoring.md create mode 100644 docs/content/en/docs/administration/tuning.md create mode 100644 docs/content/en/docs/administration/upgrading.md create mode 100644 docs/content/en/docs/administration/validating.md create mode 100644 docs/content/en/docs/example.md create mode 100644 docs/content/en/docs/reference/_index.md create mode 100644 docs/content/en/docs/reference/api.md create mode 100644 docs/content/en/docs/reference/cli.md create mode 100644 docs/content/en/docs/reference/configuration/_index.md create mode 100644 docs/content/en/docs/reference/configuration/field-path-notation.md create mode 100644 docs/content/en/docs/reference/configuration/global-options.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/_index.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/aws_kinesis_firehose.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/aws_kinesis_streams.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/aws_s3.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/aws_sqs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/azure_blob.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/azure_monitor_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/blackhole.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/clickhouse.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/console.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/datadog_events.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/datadog_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/datadog_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/elasticsearch.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/file.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/gcp_cloud_storage.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/gcp_pubsub.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/honeycomb.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/http.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/humio_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/humio_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/influxdb_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/influxdb_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/kafka.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/logdna.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/loki.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/nats.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/new_relic_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/papertrail.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/prometheus_exporter.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/prometheus_remote_write.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/pulsar.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/sematext_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/sematext_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/socket.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/splunk_hec.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/statsd.md create mode 100644 docs/content/en/docs/reference/configuration/sinks/vector.md create mode 100644 docs/content/en/docs/reference/configuration/sources/_index.md create mode 100644 docs/content/en/docs/reference/configuration/sources/apache_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/aws_ecs_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/aws_kinesis_firehose.md create mode 100644 docs/content/en/docs/reference/configuration/sources/aws_s3.md create mode 100644 docs/content/en/docs/reference/configuration/sources/datadog_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sources/dnstap.md create mode 100644 docs/content/en/docs/reference/configuration/sources/docker_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sources/eventstoredb_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/exec.md create mode 100644 docs/content/en/docs/reference/configuration/sources/file.md create mode 100644 docs/content/en/docs/reference/configuration/sources/fluent.md create mode 100644 docs/content/en/docs/reference/configuration/sources/generator.md create mode 100644 docs/content/en/docs/reference/configuration/sources/heroku_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sources/host_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/http.md create mode 100644 docs/content/en/docs/reference/configuration/sources/internal_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sources/internal_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/journald.md create mode 100644 docs/content/en/docs/reference/configuration/sources/kafka.md create mode 100644 docs/content/en/docs/reference/configuration/sources/kubernetes_logs.md create mode 100644 docs/content/en/docs/reference/configuration/sources/logstash.md create mode 100644 docs/content/en/docs/reference/configuration/sources/mongodb_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/nginx_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/postgresql_metrics.md create mode 100644 docs/content/en/docs/reference/configuration/sources/prometheus_remote_write.md create mode 100644 docs/content/en/docs/reference/configuration/sources/prometheus_scrape.md create mode 100644 docs/content/en/docs/reference/configuration/sources/socket.md create mode 100644 docs/content/en/docs/reference/configuration/sources/splunk_hec.md create mode 100644 docs/content/en/docs/reference/configuration/sources/statsd.md create mode 100644 docs/content/en/docs/reference/configuration/sources/stdin.md create mode 100644 docs/content/en/docs/reference/configuration/sources/syslog.md create mode 100644 docs/content/en/docs/reference/configuration/sources/vector.md create mode 100644 docs/content/en/docs/reference/configuration/template-syntax.md create mode 100644 docs/content/en/docs/reference/configuration/tests.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/_index.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/aggregate.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/aws_ec2_metadata.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/dedupe.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/filter.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/geoip.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/log_to_metric.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/lua.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/metric_to_log.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/reduce.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/remap.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/route.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/sample.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/tag_cardinality_limit.md create mode 100644 docs/content/en/docs/reference/configuration/transforms/wasm.md create mode 100644 docs/content/en/docs/reference/glossary.md create mode 100644 docs/content/en/docs/reference/vrl/_index.md create mode 100644 docs/content/en/docs/reference/vrl/errors.md create mode 100644 docs/content/en/docs/reference/vrl/examples.md create mode 100644 docs/content/en/docs/reference/vrl/expressions.md create mode 100644 docs/content/en/docs/reference/vrl/functions.md create mode 100644 docs/content/en/docs/setup/_index.md create mode 100644 docs/content/en/docs/setup/deployment/_index.md create mode 100644 docs/content/en/docs/setup/deployment/roles.md create mode 100644 docs/content/en/docs/setup/deployment/topologies.md create mode 100644 docs/content/en/docs/setup/installation/_index.md create mode 100644 docs/content/en/docs/setup/installation/manual/_index.md create mode 100644 docs/content/en/docs/setup/installation/manual/from-archives.md create mode 100644 docs/content/en/docs/setup/installation/manual/from-source.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/_index.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/amazon-linux.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/centos.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/debian.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/macos.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/nixos.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/raspbian.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/rhel.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/ubuntu.md create mode 100644 docs/content/en/docs/setup/installation/operating-systems/windows.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/_index.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/apt.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/dpkg.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/helm.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/homebrew.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/msi.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/nix.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/rpm.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/vector-installer.md create mode 100644 docs/content/en/docs/setup/installation/package-managers/yum.md create mode 100644 docs/content/en/docs/setup/installation/platforms/_index.md create mode 100644 docs/content/en/docs/setup/installation/platforms/docker.md create mode 100644 docs/content/en/docs/setup/installation/platforms/kubernetes.md create mode 100644 docs/content/en/docs/setup/quickstart.md create mode 100644 docs/content/en/docs/setup/transformation.md create mode 100644 docs/content/en/download/_index.md create mode 100644 docs/content/en/guides/_index.md create mode 100644 docs/content/en/guides/advanced/_index.md create mode 100644 docs/content/en/guides/advanced/cloudwatch-logs-firehose.md create mode 100644 docs/content/en/guides/advanced/custom-aggregations-with-lua.md create mode 100644 docs/content/en/guides/advanced/merge-multiline-logs-with-lua.md create mode 100644 docs/content/en/guides/advanced/parsing-csv-logs-with-lua.md create mode 100644 docs/content/en/guides/advanced/wasm-hello.md create mode 100644 docs/content/en/guides/advanced/wasm-multiline.md create mode 100644 docs/content/en/guides/level-up/_index.md create mode 100644 docs/content/en/guides/level-up/managing-complex-configs.md create mode 100644 docs/content/en/guides/level-up/managing-schemas.md rename docs/{manual/setup => content/en/guides/level-up}/transformation.md (60%) create mode 100644 docs/content/en/guides/level-up/troubleshooting.md create mode 100644 docs/content/en/guides/level-up/unit-testing.md rename docs/{ => content/en}/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md (76%) rename docs/{ => content/en}/highlights/2019-11-19-arm-support-on-linux.md (85%) rename docs/{ => content/en}/highlights/2019-11-21-windows-support.md (90%) rename docs/{ => content/en}/highlights/2019-11-25-unit-testing-vector-config-files.md (84%) rename docs/{ => content/en}/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md (74%) rename docs/{ => content/en}/highlights/2019-12-13-custom-dns.md (77%) rename docs/{ => content/en}/highlights/2019-12-14-kubernetes-source-alpha.md (80%) rename docs/{ => content/en}/highlights/2019-12-16-ec2-metadata.md (72%) rename docs/{ => content/en}/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md (76%) rename docs/{ => content/en}/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md (76%) rename docs/{ => content/en}/highlights/2020-01-07-prometheus-source.md (72%) rename docs/{ => content/en}/highlights/2020-01-12-request-options-refactored.md (88%) rename docs/{ => content/en}/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md (79%) rename docs/{ => content/en}/highlights/2020-01-14-rename-line-field-to-message.md (74%) rename docs/{ => content/en}/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md (79%) rename docs/{ => content/en}/highlights/2020-02-05-drop-aws-options.md (72%) rename docs/{ => content/en}/highlights/2020-02-05-merge-partial-docker-events.md (83%) rename docs/{ => content/en}/highlights/2020-02-07-multi-config-files.md (80%) rename docs/{ => content/en}/highlights/2020-02-11-improved-syslog-parsing.md (72%) rename docs/{ => content/en}/highlights/2020-02-14-global-log-schema.md (67%) rename docs/{ => content/en}/highlights/2020-02-17-add-fields-transform-templating.md (56%) create mode 100644 docs/content/en/highlights/2020-02-20-new-sinks.md rename docs/{ => content/en}/highlights/2020-02-21-file-source-multiline-support.md (69%) rename docs/{ => content/en}/highlights/2020-02-24-log-data-model-changes.md (79%) create mode 100644 docs/content/en/highlights/2020-02-24-rename-fields-transform.md rename docs/{ => content/en}/highlights/2020-02-24-swimlanes-transform.md (67%) rename docs/{ => content/en}/highlights/2020-02-27-nixos-support.md (79%) rename docs/{ => content/en}/highlights/2020-02-28-custom-vector-builds.md (81%) rename docs/{ => content/en}/highlights/2020-03-03-privacy-policy.md (75%) rename docs/{ => content/en}/highlights/2020-03-04-encoding-only-fields-except-fields.md (84%) rename docs/{ => content/en}/highlights/2020-03-04-encoding-whitelist-blacklist.md (68%) rename docs/{ => content/en}/highlights/2020-03-09-kafka-sink-compression.md (72%) rename docs/{ => content/en}/highlights/2020-03-10-dedupe-transform.md (66%) rename docs/{ => content/en}/highlights/2020-03-11-tag-cardinality-limit-transform.md (72%) rename docs/{ => content/en}/highlights/2020-03-11-vector-sink-tls.md (52%) rename docs/{ => content/en}/highlights/2020-03-12-papertrail-sink.md (57%) rename docs/{ => content/en}/highlights/2020-03-12-rename-host_field-to-host_key.md (75%) rename docs/{ => content/en}/highlights/2020-03-14-honeycomb-sink.md (76%) rename docs/{ => content/en}/highlights/2020-03-19-apache-pulsar-sink.md (63%) rename docs/{ => content/en}/highlights/2020-03-23-datadog-logs-sink.md (55%) rename docs/{ => content/en}/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md (75%) create mode 100644 docs/content/en/highlights/2020-03-31-filter-transform.md rename docs/{ => content/en}/highlights/2020-03-31-guides-section.md (51%) rename docs/{ => content/en}/highlights/2020-04-01-more-condition-predicates.md (67%) rename docs/{ => content/en}/highlights/2020-04-05-default-compression-to-none.md (81%) create mode 100644 docs/content/en/highlights/2020-04-07-lua-transform-version-2.md rename docs/{ => content/en}/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md (89%) rename docs/{ => content/en}/highlights/2020-04-07-vector-to-vector-metrics.md (70%) rename docs/{ => content/en}/highlights/2020-04-09-make-acl-optional.md (72%) rename docs/{ => content/en}/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md (78%) rename docs/{ => content/en}/highlights/2020-04-17-new-sinks.md (62%) rename docs/{ => content/en}/highlights/2020-04-20-improved-shutdown.md (86%) rename docs/{ => content/en}/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md (88%) rename docs/{ => content/en}/highlights/2020-05-05-add-support-for-include-exclude-units.md (87%) rename docs/{ => content/en}/highlights/2020-05-13-add-regexset-support-to-regex.md (74%) rename docs/{ => content/en}/highlights/2020-05-20-add-bearer-auth-strategy.md (82%) rename docs/{ => content/en}/highlights/2020-05-27-add-support-for-loading-multiple-cas.md (85%) rename docs/{ => content/en}/highlights/2020-06-10-consolidate-and-beautify-validate.md (85%) rename docs/{ => content/en}/highlights/2020-06-18-remove-custom-dns-resolution.md (90%) rename docs/{ => content/en}/highlights/2020-06-27-add-sasl-to-kafka.md (78%) rename docs/{ => content/en}/highlights/2020-07-06-add-compression-option-for-aws-sinks.md (77%) rename docs/{ => content/en}/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md (95%) rename docs/{ => content/en}/highlights/2020-07-10-add-reduce-transform.md (91%) rename docs/{ => content/en}/highlights/2020-08-31-mpl-2-0-license.md (92%) rename docs/{ => content/en}/highlights/2020-09-18-adaptive-concurrency.md (84%) rename docs/{ => content/en}/highlights/2020-10-27-kubernetes-integration.md (89%) rename docs/{ => content/en}/highlights/2020-10-27-metrics-integrations.md (78%) rename docs/{ => content/en}/highlights/2020-10-28-new-aws-integrations.md (71%) rename docs/{ => content/en}/highlights/2020-11-19-prometheus-remote-integrations.md (89%) rename docs/{ => content/en}/highlights/2020-11-25-json-yaml-config-formats.md (85%) rename docs/{ => content/en}/highlights/2020-12-01-0-11-upgrade-guide.md (88%) rename docs/{ => content/en}/highlights/2020-12-23-graphql-api.md (91%) rename docs/{ => content/en}/highlights/2020-12-23-internal-logs-source.md (81%) rename docs/{ => content/en}/highlights/2020-12-23-vector-top.md (84%) rename docs/{ => content/en}/highlights/2021-01-10-kafka-sink-metrics.md (74%) rename docs/{ => content/en}/highlights/2021-01-20-wildcard-identifiers.md (84%) rename docs/{ => content/en}/highlights/2021-01-31-file-source-checkpointing.md (88%) rename docs/{ => content/en}/highlights/2021-02-16-0-12-upgrade-guide.md (82%) rename docs/{ => content/en}/highlights/2021-02-16-filter-remap-support.md (80%) rename docs/{ => content/en}/highlights/2021-02-16-reduce-transform-remap-support.md (84%) rename docs/{ => content/en}/highlights/2021-02-16-swimlanes-remap-support.md (81%) rename docs/{ => content/en}/highlights/2021-02-16-vector-remap-language.md (83%) rename docs/{ => content/en}/highlights/2021-04-21-0-13-upgrade-guide.md (92%) rename docs/{ => content/en}/highlights/2021-04-21-vector-tap.md (92%) rename docs/{ => content/en}/highlights/2021-04-21-vrl-abort.md (90%) rename docs/{ => content/en}/highlights/2021-06-01-removing-helm-rawconfig.md (88%) rename docs/{ => content/en}/highlights/2021-06-02-drop-jemalloc.md (58%) rename docs/{ => content/en}/highlights/2021-06-02-fix-vector-metric-naming.md (83%) rename docs/{ => content/en}/highlights/2021-06-03-exec-source.md (75%) create mode 100644 docs/content/en/highlights/_index.md create mode 100644 docs/content/en/releases/0.10.0.md create mode 100644 docs/content/en/releases/0.11.0.md create mode 100644 docs/content/en/releases/0.11.1.md create mode 100644 docs/content/en/releases/0.12.0.md create mode 100644 docs/content/en/releases/0.12.1.md create mode 100644 docs/content/en/releases/0.12.2.md create mode 100644 docs/content/en/releases/0.13.0.md create mode 100644 docs/content/en/releases/0.13.1.md create mode 100644 docs/content/en/releases/0.14.0.md create mode 100644 docs/content/en/releases/0.4.0.md create mode 100644 docs/content/en/releases/0.5.0.md create mode 100644 docs/content/en/releases/0.6.0.md create mode 100644 docs/content/en/releases/0.7.0.md create mode 100644 docs/content/en/releases/0.7.1.md create mode 100644 docs/content/en/releases/0.7.2.md create mode 100644 docs/content/en/releases/0.8.0.md create mode 100644 docs/content/en/releases/0.8.1.md create mode 100644 docs/content/en/releases/0.8.2.md create mode 100644 docs/content/en/releases/0.9.0.md create mode 100644 docs/content/en/releases/0.9.1.md create mode 100644 docs/content/en/releases/0.9.2.md create mode 100644 docs/content/en/releases/_index.md create mode 100644 docs/cue/README.md rename docs/{ => cue}/reference.cue (98%) rename docs/{reference/installation.cue => cue/reference/administration.cue} (50%) create mode 100644 docs/cue/reference/administration/downloads.cue create mode 100644 docs/cue/reference/administration/install_commands.cue rename docs/{reference/installation => cue/reference/administration}/interfaces.cue (96%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/apt.cue (74%) rename docs/{reference/installation/_interfaces/docker-cli.cue => cue/reference/administration/interfaces/docker_cli.cue} (76%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/dpkg.cue (92%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/helm3.cue (97%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/homebrew.cue (92%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/kubectl.cue (99%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/msi.cue (89%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/nix.cue (93%) create mode 100644 docs/cue/reference/administration/interfaces/role_implementations/file_agent.cue create mode 100644 docs/cue/reference/administration/interfaces/role_implementations/file_sidecar.cue create mode 100644 docs/cue/reference/administration/interfaces/role_implementations/journald_agent.cue create mode 100644 docs/cue/reference/administration/interfaces/role_implementations/vector_aggregator.cue rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/rpm.cue (92%) rename docs/{reference/installation/_interfaces/vector-installer.cue => cue/reference/administration/interfaces/vector_installer.cue} (95%) rename docs/{reference/installation/_interfaces => cue/reference/administration/interfaces}/yum.cue (93%) create mode 100644 docs/cue/reference/administration/management.cue rename docs/{reference/installation => cue/reference/administration}/operating_systems.cue (74%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/amazon_linux.cue (73%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/centos.cue (59%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/debian.cue (62%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/macos.cue (71%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/nixos.cue (72%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/raspbian.cue (76%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/rhel.cue (58%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/ubuntu.cue (55%) rename docs/{reference/installation => cue/reference/administration}/operating_systems/windows.cue (68%) rename docs/{reference/installation => cue/reference/administration}/package_managers.cue (92%) create mode 100644 docs/cue/reference/administration/package_managers/apt.cue create mode 100644 docs/cue/reference/administration/package_managers/dpkg.cue create mode 100644 docs/cue/reference/administration/package_managers/helm.cue create mode 100644 docs/cue/reference/administration/package_managers/homebrew.cue create mode 100644 docs/cue/reference/administration/package_managers/msi.cue create mode 100644 docs/cue/reference/administration/package_managers/nix.cue create mode 100644 docs/cue/reference/administration/package_managers/rpm.cue create mode 100644 docs/cue/reference/administration/package_managers/yum.cue rename docs/{reference/installation => cue/reference/administration}/roles.cue (93%) rename docs/{reference/installation => cue/reference/administration}/roles/agent.cue (88%) rename docs/{reference/installation => cue/reference/administration}/roles/aggregator.cue (94%) create mode 100644 docs/cue/reference/administration/topologies.cue create mode 100644 docs/cue/reference/administration/topologies/centralized.cue create mode 100644 docs/cue/reference/administration/topologies/distributed.cue create mode 100644 docs/cue/reference/administration/topologies/stream_based.cue create mode 100644 docs/cue/reference/administration/ui.cue rename docs/{ => cue}/reference/api.cue (98%) create mode 100644 docs/cue/reference/authors.cue rename docs/{ => cue}/reference/cli.cue (91%) rename docs/{ => cue}/reference/components.cue (96%) rename docs/{ => cue}/reference/components/aws.cue (83%) rename docs/{ => cue}/reference/components/kafka.cue (100%) rename docs/{ => cue}/reference/components/sinks.cue (89%) rename docs/{ => cue}/reference/components/sinks/aws_cloudwatch.cue (100%) rename docs/{ => cue}/reference/components/sinks/aws_cloudwatch_logs.cue (99%) rename docs/{ => cue}/reference/components/sinks/aws_cloudwatch_metrics.cue (100%) rename docs/{ => cue}/reference/components/sinks/aws_kinesis_firehose.cue (100%) rename docs/{ => cue}/reference/components/sinks/aws_kinesis_streams.cue (89%) rename docs/{ => cue}/reference/components/sinks/aws_s3.cue (99%) rename docs/{ => cue}/reference/components/sinks/aws_sqs.cue (100%) rename docs/{ => cue}/reference/components/sinks/azure_blob.cue (86%) rename docs/{ => cue}/reference/components/sinks/azure_monitor_logs.cue (100%) rename docs/{ => cue}/reference/components/sinks/blackhole.cue (100%) rename docs/{ => cue}/reference/components/sinks/clickhouse.cue (100%) rename docs/{ => cue}/reference/components/sinks/console.cue (100%) rename docs/{ => cue}/reference/components/sinks/datadog.cue (94%) rename docs/{ => cue}/reference/components/sinks/datadog_events.cue (100%) rename docs/{ => cue}/reference/components/sinks/datadog_logs.cue (100%) rename docs/{ => cue}/reference/components/sinks/datadog_metrics.cue (100%) rename docs/{ => cue}/reference/components/sinks/elasticsearch.cue (82%) rename docs/{ => cue}/reference/components/sinks/file.cue (100%) rename docs/{ => cue}/reference/components/sinks/gcp.cue (89%) rename docs/{ => cue}/reference/components/sinks/gcp_cloud_storage.cue (87%) rename docs/{ => cue}/reference/components/sinks/gcp_pubsub.cue (95%) rename docs/{ => cue}/reference/components/sinks/gcp_stackdriver_logs.cue (57%) rename docs/{ => cue}/reference/components/sinks/gcp_stackdriver_metrics.cue (93%) rename docs/{ => cue}/reference/components/sinks/honeycomb.cue (100%) rename docs/{ => cue}/reference/components/sinks/http.cue (100%) rename docs/{ => cue}/reference/components/sinks/humio.cue (81%) rename docs/{ => cue}/reference/components/sinks/humio_logs.cue (100%) rename docs/{ => cue}/reference/components/sinks/humio_metrics.cue (100%) rename docs/{ => cue}/reference/components/sinks/influxdb.cue (100%) rename docs/{ => cue}/reference/components/sinks/influxdb_logs.cue (100%) rename docs/{ => cue}/reference/components/sinks/influxdb_metrics.cue (100%) rename docs/{ => cue}/reference/components/sinks/kafka.cue (100%) rename docs/{ => cue}/reference/components/sinks/logdna.cue (100%) rename docs/{ => cue}/reference/components/sinks/loki.cue (82%) rename docs/{ => cue}/reference/components/sinks/nats.cue (100%) rename docs/{ => cue}/reference/components/sinks/new_relic_logs.cue (100%) rename docs/{ => cue}/reference/components/sinks/papertrail.cue (100%) rename docs/{ => cue}/reference/components/sinks/prometheus_exporter.cue (86%) rename docs/{ => cue}/reference/components/sinks/prometheus_remote_write.cue (94%) rename docs/{ => cue}/reference/components/sinks/pulsar.cue (100%) rename docs/{ => cue}/reference/components/sinks/redis.cue (100%) rename docs/{ => cue}/reference/components/sinks/sematext.cue (100%) rename docs/{ => cue}/reference/components/sinks/sematext_logs.cue (100%) rename docs/{ => cue}/reference/components/sinks/sematext_metrics.cue (97%) rename docs/{ => cue}/reference/components/sinks/socket.cue (100%) rename docs/{ => cue}/reference/components/sinks/splunk_hec.cue (93%) rename docs/{ => cue}/reference/components/sinks/statsd.cue (100%) rename docs/{ => cue}/reference/components/sinks/vector.cue (100%) rename docs/{ => cue}/reference/components/sources.cue (97%) rename docs/{ => cue}/reference/components/sources/apache_metrics.cue (98%) rename docs/{ => cue}/reference/components/sources/aws_ecs_metrics.cue (97%) rename docs/{ => cue}/reference/components/sources/aws_kinesis_firehose.cue (92%) rename docs/{ => cue}/reference/components/sources/aws_s3.cue (74%) rename docs/{ => cue}/reference/components/sources/datadog_logs.cue (100%) rename docs/{ => cue}/reference/components/sources/dnstap.cue (93%) rename docs/{ => cue}/reference/components/sources/docker_logs.cue (93%) rename docs/{ => cue}/reference/components/sources/eventstoredb_metrics.cue (100%) rename docs/{ => cue}/reference/components/sources/exec.cue (98%) rename docs/{ => cue}/reference/components/sources/file.cue (94%) rename docs/{ => cue}/reference/components/sources/fluent.cue (100%) rename docs/{ => cue}/reference/components/sources/generator.cue (100%) rename docs/{ => cue}/reference/components/sources/heroku_logs.cue (100%) rename docs/{ => cue}/reference/components/sources/host_metrics.cue (100%) rename docs/{ => cue}/reference/components/sources/http.cue (98%) rename docs/{ => cue}/reference/components/sources/internal_logs.cue (91%) rename docs/{ => cue}/reference/components/sources/internal_metrics.cue (98%) rename docs/{ => cue}/reference/components/sources/journald.cue (97%) rename docs/{ => cue}/reference/components/sources/kafka.cue (94%) rename docs/{ => cue}/reference/components/sources/kubernetes_logs.cue (99%) rename docs/{ => cue}/reference/components/sources/logstash.cue (100%) rename docs/{ => cue}/reference/components/sources/mongodb_metrics.cue (99%) rename docs/{ => cue}/reference/components/sources/nginx_metrics.cue (98%) rename docs/{ => cue}/reference/components/sources/postgresql_metrics.cue (95%) rename docs/{ => cue}/reference/components/sources/prometheus_remote_write.cue (100%) rename docs/{ => cue}/reference/components/sources/prometheus_scrape.cue (100%) rename docs/{ => cue}/reference/components/sources/socket.cue (93%) rename docs/{ => cue}/reference/components/sources/splunk_hec.cue (100%) rename docs/{ => cue}/reference/components/sources/statsd.cue (87%) rename docs/{ => cue}/reference/components/sources/stdin.cue (91%) rename docs/{ => cue}/reference/components/sources/syslog.cue (89%) rename docs/{ => cue}/reference/components/sources/vector.cue (75%) rename docs/{ => cue}/reference/components/splunk.cue (100%) rename docs/{ => cue}/reference/components/transforms.cue (100%) rename docs/{ => cue}/reference/components/transforms/add_fields.cue (100%) rename docs/{ => cue}/reference/components/transforms/add_tags.cue (100%) rename docs/{ => cue}/reference/components/transforms/aggregate.cue (75%) rename docs/{ => cue}/reference/components/transforms/ansi_stripper.cue (100%) rename docs/{ => cue}/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue (99%) rename docs/{ => cue}/reference/components/transforms/aws_ec2_metadata.cue (100%) rename docs/{ => cue}/reference/components/transforms/coercer.cue (100%) rename docs/{ => cue}/reference/components/transforms/concat.cue (100%) rename docs/{ => cue}/reference/components/transforms/dedupe.cue (97%) rename docs/{ => cue}/reference/components/transforms/filter.cue (100%) rename docs/{ => cue}/reference/components/transforms/geoip.cue (100%) rename docs/{ => cue}/reference/components/transforms/grok_parser.cue (100%) rename docs/{ => cue}/reference/components/transforms/json_parser.cue (100%) rename docs/{ => cue}/reference/components/transforms/key_value_parser.cue (100%) rename docs/{ => cue}/reference/components/transforms/log_to_metric.cue (77%) rename docs/{ => cue}/reference/components/transforms/logfmt_parser.cue (97%) rename docs/{ => cue}/reference/components/transforms/lua.cue (98%) rename docs/{ => cue}/reference/components/transforms/merge.cue (100%) rename docs/{ => cue}/reference/components/transforms/metric_to_log.cue (95%) rename docs/{ => cue}/reference/components/transforms/reduce.cue (96%) rename docs/{ => cue}/reference/components/transforms/regex_parser.cue (94%) rename docs/{ => cue}/reference/components/transforms/remap.cue (85%) rename docs/{ => cue}/reference/components/transforms/remove_fields.cue (100%) rename docs/{ => cue}/reference/components/transforms/remove_tags.cue (100%) rename docs/{ => cue}/reference/components/transforms/rename_fields.cue (100%) rename docs/{ => cue}/reference/components/transforms/route.cue (85%) rename docs/{ => cue}/reference/components/transforms/sample.cue (100%) rename docs/{ => cue}/reference/components/transforms/split.cue (100%) rename docs/{ => cue}/reference/components/transforms/tag_cardinality_limit.cue (97%) rename docs/{ => cue}/reference/components/transforms/tokenizer.cue (100%) rename docs/{ => cue}/reference/components/transforms/wasm.cue (93%) rename docs/{ => cue}/reference/configuration.cue (95%) rename docs/{ => cue}/reference/data_model.cue (100%) rename docs/{ => cue}/reference/data_model/schema.cue (98%) create mode 100644 docs/cue/reference/glossary.cue create mode 100644 docs/cue/reference/process.cue rename docs/{ => cue}/reference/releases.cue (80%) rename docs/{ => cue}/reference/releases/0.10.0.cue (99%) rename docs/{ => cue}/reference/releases/0.11.0.cue (100%) rename docs/{ => cue}/reference/releases/0.11.1.cue (98%) rename docs/{ => cue}/reference/releases/0.12.0.cue (99%) rename docs/{ => cue}/reference/releases/0.12.1.cue (99%) rename docs/{ => cue}/reference/releases/0.12.2.cue (94%) rename docs/{ => cue}/reference/releases/0.13.0.cue (99%) create mode 100644 docs/cue/reference/releases/0.13.1.cue rename docs/{ => cue}/reference/releases/0.14.0.cue (99%) rename docs/{ => cue}/reference/releases/0.4.0.cue (100%) rename docs/{ => cue}/reference/releases/0.5.0.cue (100%) rename docs/{ => cue}/reference/releases/0.6.0.cue (100%) rename docs/{ => cue}/reference/releases/0.7.0.cue (100%) rename docs/{ => cue}/reference/releases/0.7.1.cue (99%) rename docs/{ => cue}/reference/releases/0.7.2.cue (99%) rename docs/{ => cue}/reference/releases/0.8.0.cue (100%) rename docs/{ => cue}/reference/releases/0.8.1.cue (90%) rename docs/{ => cue}/reference/releases/0.8.2.cue (97%) rename docs/{ => cue}/reference/releases/0.9.0.cue (99%) rename docs/{ => cue}/reference/releases/0.9.1.cue (99%) rename docs/{ => cue}/reference/releases/0.9.2.cue (90%) rename docs/{ => cue}/reference/remap.cue (91%) rename docs/{ => cue}/reference/remap/concepts.cue (100%) create mode 100644 docs/cue/reference/remap/concepts/event.cue create mode 100644 docs/cue/reference/remap/concepts/expressions.cue create mode 100644 docs/cue/reference/remap/concepts/function.cue rename docs/{ => cue}/reference/remap/concepts/literal.cue (51%) create mode 100644 docs/cue/reference/remap/concepts/program.cue rename docs/{ => cue}/reference/remap/errors.cue (100%) rename docs/{ => cue}/reference/remap/errors/100_unhandled_root_runtime_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/101_malformed_regex_literal.cue (88%) rename docs/{ => cue}/reference/remap/errors/102_non_boolean_if_expression_predicate.cue (90%) rename docs/{ => cue}/reference/remap/errors/103_unhandled_assignment_runtime_error.cue (96%) rename docs/{ => cue}/reference/remap/errors/104_unnecessary_error_assignment.cue (92%) rename docs/{ => cue}/reference/remap/errors/105_undefined_function.cue (79%) rename docs/{ => cue}/reference/remap/errors/106_function_argument_arity_mismatch.cue (80%) rename docs/{ => cue}/reference/remap/errors/107_required_function_argument_missing.cue (80%) rename docs/{ => cue}/reference/remap/errors/108_unknown_function_argument_keyword.cue (80%) rename docs/{ => cue}/reference/remap/errors/110_invalid_argument_type.cue (77%) rename docs/{ => cue}/reference/remap/errors/203_unrecognized_token.cue (100%) rename docs/{ => cue}/reference/remap/errors/204_unrecognized_eof.cue (100%) rename docs/{ => cue}/reference/remap/errors/205_reserved_keyword.cue (100%) rename docs/{ => cue}/reference/remap/errors/206_invalid_numeric_literal.cue (100%) rename docs/{ => cue}/reference/remap/errors/207_invalid_string_literal.cue (100%) rename docs/{ => cue}/reference/remap/errors/208_invalid_literal.cue (100%) rename docs/{ => cue}/reference/remap/errors/209_invalid_escape_character.cue (100%) rename docs/{ => cue}/reference/remap/errors/300_unexpected_type.cue (100%) rename docs/{ => cue}/reference/remap/errors/301_type_coercion_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/302_remainder_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/303_multiplication_error.cue (73%) rename docs/{ => cue}/reference/remap/errors/304_division_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/305_divide_by_zero_error.cue (98%) rename docs/{ => cue}/reference/remap/errors/306_nan_float.cue (100%) rename docs/{ => cue}/reference/remap/errors/307_addition_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/308_subtraction_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/309_or_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/310_and_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/311_greater_than_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/312_ge_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/313_less_than_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/314_le_error.cue (100%) rename docs/{ => cue}/reference/remap/errors/400_unexpected_expression.cue (100%) rename docs/{ => cue}/reference/remap/errors/401_invalid_enum_variant.cue (100%) rename docs/{ => cue}/reference/remap/errors/402_expected_static_expression.cue (100%) rename docs/{ => cue}/reference/remap/errors/403_invalid_argument.cue (100%) rename docs/{ => cue}/reference/remap/errors/601_invalid_timestamp.cue (86%) rename docs/{ => cue}/reference/remap/errors/620_aborting_infallible_function.cue (100%) rename docs/{ => cue}/reference/remap/errors/630_fallible_argument.cue (100%) rename docs/{ => cue}/reference/remap/errors/640_unnecessary_noop.cue (100%) rename docs/{ => cue}/reference/remap/errors/650_chained_comparison_operators.cue (100%) rename docs/{ => cue}/reference/remap/errors/651_unnecessary_error_coalescing_operation.cue (100%) rename docs/{ => cue}/reference/remap/errors/652_merge_non_objects.cue (100%) rename docs/{ => cue}/reference/remap/errors/660_non_boolean_negation.cue (100%) rename docs/{ => cue}/reference/remap/expressions.cue (100%) rename docs/{ => cue}/reference/remap/expressions/abort.cue (100%) rename docs/{ => cue}/reference/remap/expressions/arithmetic.cue (100%) rename docs/{ => cue}/reference/remap/expressions/assignment.cue (100%) rename docs/{ => cue}/reference/remap/expressions/block.cue (100%) rename docs/{ => cue}/reference/remap/expressions/coalesce.cue (100%) rename docs/{ => cue}/reference/remap/expressions/comparison.cue (100%) rename docs/{ => cue}/reference/remap/expressions/function_call.cue (100%) rename docs/{ => cue}/reference/remap/expressions/if.cue (100%) rename docs/{ => cue}/reference/remap/expressions/index.cue (100%) rename docs/{ => cue}/reference/remap/expressions/logical.cue (100%) rename docs/{ => cue}/reference/remap/expressions/path.cue (100%) rename docs/{ => cue}/reference/remap/expressions/variable.cue (100%) rename docs/{ => cue}/reference/remap/features.cue (100%) rename docs/{ => cue}/reference/remap/features/compilation.cue (86%) rename docs/{ => cue}/reference/remap/features/ergonomic_safety.cue (84%) rename docs/{ => cue}/reference/remap/features/fail_safety.cue (94%) rename docs/{reference/remap/features/quality_error_messages.cue => cue/reference/remap/features/high_quality_error_messages.cue} (88%) rename docs/{ => cue}/reference/remap/features/logs_and_metrics.cue (100%) rename docs/{ => cue}/reference/remap/features/memory_safety.cue (100%) rename docs/{ => cue}/reference/remap/features/native.cue (100%) rename docs/{ => cue}/reference/remap/features/stateless.cue (100%) rename docs/{ => cue}/reference/remap/features/type_safety.cue (77%) rename docs/{ => cue}/reference/remap/functions.cue (70%) rename docs/{ => cue}/reference/remap/functions/append.cue (100%) rename docs/{ => cue}/reference/remap/functions/array.cue (100%) rename docs/{ => cue}/reference/remap/functions/assert.cue (100%) rename docs/{ => cue}/reference/remap/functions/bool.cue (100%) rename docs/{ => cue}/reference/remap/functions/ceil.cue (100%) rename docs/{ => cue}/reference/remap/functions/compact.cue (100%) rename docs/{ => cue}/reference/remap/functions/contains.cue (100%) rename docs/{ => cue}/reference/remap/functions/decode_base64.cue (100%) rename docs/{ => cue}/reference/remap/functions/decode_percent.cue (87%) rename docs/{ => cue}/reference/remap/functions/del.cue (100%) rename docs/{ => cue}/reference/remap/functions/downcase.cue (100%) rename docs/{ => cue}/reference/remap/functions/encode_base64.cue (100%) rename docs/{ => cue}/reference/remap/functions/encode_json.cue (100%) rename docs/{ => cue}/reference/remap/functions/encode_key_value.cue (98%) rename docs/{ => cue}/reference/remap/functions/encode_logfmt.cue (95%) rename docs/{ => cue}/reference/remap/functions/encode_percent.cue (100%) rename docs/{ => cue}/reference/remap/functions/ends_with.cue (100%) rename docs/{ => cue}/reference/remap/functions/exists.cue (100%) rename docs/{ => cue}/reference/remap/functions/flatten.cue (100%) rename docs/{ => cue}/reference/remap/functions/float.cue (100%) rename docs/{ => cue}/reference/remap/functions/floor.cue (100%) rename docs/{ => cue}/reference/remap/functions/format_int.cue (100%) rename docs/{ => cue}/reference/remap/functions/format_number.cue (100%) rename docs/{ => cue}/reference/remap/functions/format_timestamp.cue (100%) rename docs/{ => cue}/reference/remap/functions/get_env_var.cue (100%) rename docs/{ => cue}/reference/remap/functions/get_hostname.cue (100%) rename docs/{ => cue}/reference/remap/functions/includes.cue (100%) rename docs/{ => cue}/reference/remap/functions/int.cue (100%) rename docs/{ => cue}/reference/remap/functions/ip_aton.cue (100%) rename docs/{ => cue}/reference/remap/functions/ip_cidr_contains.cue (100%) rename docs/{ => cue}/reference/remap/functions/ip_ntoa.cue (100%) rename docs/{ => cue}/reference/remap/functions/ip_subnet.cue (100%) rename docs/{ => cue}/reference/remap/functions/ip_to_ipv6.cue (100%) rename docs/{ => cue}/reference/remap/functions/ipv6_to_ipv4.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_array.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_boolean.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_float.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_integer.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_null.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_nullish.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_object.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_regex.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_string.cue (100%) rename docs/{ => cue}/reference/remap/functions/is_timestamp.cue (100%) rename docs/{ => cue}/reference/remap/functions/join.cue (100%) rename docs/{ => cue}/reference/remap/functions/length.cue (100%) rename docs/{ => cue}/reference/remap/functions/log.cue (100%) rename docs/{ => cue}/reference/remap/functions/match.cue (100%) rename docs/{ => cue}/reference/remap/functions/match_any.cue (100%) rename docs/{ => cue}/reference/remap/functions/match_array.cue (100%) rename docs/{ => cue}/reference/remap/functions/md5.cue (100%) rename docs/{ => cue}/reference/remap/functions/merge.cue (100%) rename docs/{ => cue}/reference/remap/functions/now.cue (100%) rename docs/{ => cue}/reference/remap/functions/object.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_apache_log.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_aws_alb_log.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_aws_cloudwatch_log_subscription_message.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_aws_vpc_flow_log.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_common_log.cue (93%) rename docs/{ => cue}/reference/remap/functions/parse_csv.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_duration.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_glog.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_grok.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_int.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_json.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_key_value.cue (97%) rename docs/{ => cue}/reference/remap/functions/parse_klog.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_linux_authorization.cue (84%) rename docs/{ => cue}/reference/remap/functions/parse_logfmt.cue (69%) rename docs/{ => cue}/reference/remap/functions/parse_nginx_log.cue (87%) rename docs/{ => cue}/reference/remap/functions/parse_query_string.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_regex.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_regex_all.cue (91%) rename docs/{ => cue}/reference/remap/functions/parse_ruby_hash.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_syslog.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_timestamp.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_tokens.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_url.cue (100%) rename docs/{ => cue}/reference/remap/functions/parse_xml.cue (100%) rename docs/{ => cue}/reference/remap/functions/push.cue (100%) rename docs/{ => cue}/reference/remap/functions/redact.cue (65%) rename docs/{ => cue}/reference/remap/functions/replace.cue (100%) rename docs/{ => cue}/reference/remap/functions/round.cue (100%) rename docs/{ => cue}/reference/remap/functions/sha1.cue (100%) rename docs/{ => cue}/reference/remap/functions/sha2.cue (100%) rename docs/{ => cue}/reference/remap/functions/sha3.cue (100%) rename docs/{ => cue}/reference/remap/functions/slice.cue (100%) rename docs/{ => cue}/reference/remap/functions/split.cue (100%) rename docs/{ => cue}/reference/remap/functions/starts_with.cue (100%) rename docs/{ => cue}/reference/remap/functions/string.cue (100%) rename docs/{ => cue}/reference/remap/functions/strip_ansi_escape_codes.cue (100%) rename docs/{ => cue}/reference/remap/functions/strip_whitespace.cue (100%) rename docs/{ => cue}/reference/remap/functions/tag_types_externally.cue (100%) rename docs/{ => cue}/reference/remap/functions/timestamp.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_bool.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_float.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_int.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_regex.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_string.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_syslog_facility.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_syslog_level.cue (92%) rename docs/{ => cue}/reference/remap/functions/to_syslog_severity.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_timestamp.cue (100%) rename docs/{ => cue}/reference/remap/functions/to_unix_timestamp.cue (100%) rename docs/{ => cue}/reference/remap/functions/truncate.cue (100%) rename docs/{ => cue}/reference/remap/functions/upcase.cue (100%) rename docs/{ => cue}/reference/remap/functions/uuid_v4.cue (100%) rename docs/{ => cue}/reference/remap/literals.cue (91%) rename docs/{ => cue}/reference/remap/literals/array.cue (87%) rename docs/{ => cue}/reference/remap/literals/boolean.cue (100%) rename docs/{ => cue}/reference/remap/literals/float.cue (100%) rename docs/{ => cue}/reference/remap/literals/integer.cue (100%) rename docs/{ => cue}/reference/remap/literals/null.cue (100%) rename docs/{ => cue}/reference/remap/literals/object.cue (100%) rename docs/{ => cue}/reference/remap/literals/regular_expression.cue (99%) rename docs/{ => cue}/reference/remap/literals/string.cue (100%) rename docs/{ => cue}/reference/remap/literals/timestamp.cue (100%) rename docs/{ => cue}/reference/remap/principles.cue (100%) rename docs/{ => cue}/reference/remap/principles/performance.cue (100%) rename docs/{ => cue}/reference/remap/principles/safety.cue (100%) rename docs/{ => cue}/reference/remap/syntax.cue (91%) rename docs/{ => cue}/reference/remap/syntax/comment.cue (100%) rename docs/{ => cue}/reference/remap/syntax/keywords.cue (100%) rename docs/{ => cue}/reference/remap/syntax/whitespace.cue (100%) rename docs/{ => cue}/reference/services.cue (100%) rename docs/{ => cue}/reference/services/apache_http.cue (100%) rename docs/{ => cue}/reference/services/aws_cloudwatch.cue (100%) rename docs/{ => cue}/reference/services/aws_cloudwatch_logs.cue (100%) rename docs/{ => cue}/reference/services/aws_cloudwatch_metrics.cue (100%) rename docs/{ => cue}/reference/services/aws_ecs.cue (100%) rename docs/{ => cue}/reference/services/aws_kinesis_data_streams.cue (100%) rename docs/{ => cue}/reference/services/aws_kinesis_firehose.cue (100%) rename docs/{ => cue}/reference/services/aws_s3.cue (100%) rename docs/{ => cue}/reference/services/aws_sqs.cue (100%) rename docs/{ => cue}/reference/services/azure_blob.cue (100%) rename docs/{ => cue}/reference/services/azure_monitor_logs.cue (100%) rename docs/{ => cue}/reference/services/clickhouse.cue (100%) rename docs/{ => cue}/reference/services/datadog.cue (100%) rename docs/{ => cue}/reference/services/datadog_events.cue (100%) rename docs/{ => cue}/reference/services/datadog_logs.cue (100%) rename docs/{ => cue}/reference/services/datadog_metrics.cue (100%) rename docs/{ => cue}/reference/services/dnstap_data.cue (100%) rename docs/{ => cue}/reference/services/docker.cue (100%) rename docs/{ => cue}/reference/services/elasticsearch.cue (100%) rename docs/{ => cue}/reference/services/eventstoredb_stats_client.cue (100%) rename docs/{ => cue}/reference/services/exec.cue (100%) rename docs/{ => cue}/reference/services/files.cue (100%) rename docs/{ => cue}/reference/services/fluent.cue (100%) create mode 100644 docs/cue/reference/services/gcp_cloud_monitoring.cue create mode 100644 docs/cue/reference/services/gcp_cloud_storage.cue create mode 100644 docs/cue/reference/services/gcp_operations_logs.cue create mode 100644 docs/cue/reference/services/gcp_pubsub.cue rename docs/{ => cue}/reference/services/heroku.cue (100%) rename docs/{ => cue}/reference/services/honeycomb.cue (100%) rename docs/{ => cue}/reference/services/host.cue (100%) rename docs/{ => cue}/reference/services/http.cue (100%) create mode 100644 docs/cue/reference/services/humio.cue rename docs/{ => cue}/reference/services/influxdb.cue (100%) rename docs/{ => cue}/reference/services/journald.cue (100%) rename docs/{ => cue}/reference/services/kafka.cue (100%) rename docs/{ => cue}/reference/services/kubernetes.cue (100%) rename docs/{ => cue}/reference/services/logdna.cue (100%) rename docs/{ => cue}/reference/services/logstash.cue (100%) create mode 100644 docs/cue/reference/services/loki.cue create mode 100644 docs/cue/reference/services/mongodb.cue rename docs/{ => cue}/reference/services/nats.cue (100%) create mode 100644 docs/cue/reference/services/new_relic_logs.cue create mode 100644 docs/cue/reference/services/nginx.cue rename docs/{ => cue}/reference/services/papertrail.cue (100%) rename docs/{ => cue}/reference/services/prometheus.cue (100%) rename docs/{ => cue}/reference/services/prometheus_client.cue (100%) rename docs/{ => cue}/reference/services/pulsar.cue (100%) rename docs/{ => cue}/reference/services/redis.cue (100%) rename docs/{ => cue}/reference/services/sematext.cue (100%) rename docs/{ => cue}/reference/services/socket_client.cue (100%) rename docs/{ => cue}/reference/services/socket_recevier.cue (100%) rename docs/{ => cue}/reference/services/splunk.cue (100%) rename docs/{ => cue}/reference/services/statsd.cue (100%) rename docs/{ => cue}/reference/services/statsd_receiver.cue (100%) rename docs/{ => cue}/reference/services/stdin.cue (100%) rename docs/{ => cue}/reference/services/stdout.cue (100%) rename docs/{ => cue}/reference/services/syslog.cue (100%) rename docs/{ => cue}/reference/services/vector.cue (100%) rename docs/{ => cue}/reference/team.cue (100%) rename docs/{ => cue}/reference/urls.cue (84%) create mode 100644 docs/cue/reference/versions.cue create mode 100644 docs/data/.gitkeep delete mode 100644 docs/guides/integrate.cue delete mode 100644 docs/highlights/.schema.json delete mode 100644 docs/highlights/2020-02-20-new-sinks.md delete mode 100644 docs/highlights/2020-02-24-rename-fields-transform.md delete mode 100644 docs/highlights/2020-03-31-filter-transform.md delete mode 100644 docs/highlights/2020-04-07-lua-transform-version-2.md create mode 100644 docs/layouts/404.html create mode 100644 docs/layouts/_default/_markup/render-heading.html create mode 100644 docs/layouts/_default/_markup/render-link.html create mode 100644 docs/layouts/_default/baseof.html create mode 100644 docs/layouts/_default/blog-post-card.html create mode 100644 docs/layouts/_default/component-card-selectable.html create mode 100644 docs/layouts/_default/component-card.html create mode 100644 docs/layouts/_default/li.html create mode 100644 docs/layouts/_default/list.search.json create mode 100644 docs/layouts/_default/section-card.html create mode 100644 docs/layouts/blog/section.html create mode 100644 docs/layouts/blog/single.html create mode 100644 docs/layouts/community/section.html create mode 100644 docs/layouts/components/section.html create mode 100644 docs/layouts/docs/component.html create mode 100644 docs/layouts/docs/section.html create mode 100644 docs/layouts/docs/single.html create mode 100644 docs/layouts/download/section.html create mode 100644 docs/layouts/guides/integrate.html create mode 100644 docs/layouts/guides/li.html create mode 100644 docs/layouts/guides/list.html create mode 100644 docs/layouts/guides/section.html create mode 100644 docs/layouts/guides/single.html create mode 100644 docs/layouts/highlights/li.html create mode 100644 docs/layouts/highlights/section.html create mode 100644 docs/layouts/highlights/single.html create mode 100644 docs/layouts/home.html create mode 100644 docs/layouts/partials/admonition.html create mode 100644 docs/layouts/partials/badge.html create mode 100644 docs/layouts/partials/banner.html create mode 100644 docs/layouts/partials/blog/authors.html create mode 100644 docs/layouts/partials/blog/hero.html create mode 100644 docs/layouts/partials/blog/pagination.html create mode 100644 docs/layouts/partials/breadcrumb.html create mode 100644 docs/layouts/partials/community/hero.html create mode 100644 docs/layouts/partials/content.html create mode 100644 docs/layouts/partials/css.html create mode 100644 docs/layouts/partials/data.html create mode 100644 docs/layouts/partials/docs/component-under-hero.html create mode 100644 docs/layouts/partials/docs/dashboard.html create mode 100644 docs/layouts/partials/docs/edit.html create mode 100644 docs/layouts/partials/docs/mobile-nav.html create mode 100644 docs/layouts/partials/docs/pagination.html create mode 100644 docs/layouts/partials/docs/section-pages-list.html create mode 100644 docs/layouts/partials/docs/sidebar.html create mode 100644 docs/layouts/partials/docs/slideover.html create mode 100644 docs/layouts/partials/download/download-matrix.html create mode 100644 docs/layouts/partials/download/links.html create mode 100644 docs/layouts/partials/download/release-toggle.html create mode 100644 docs/layouts/partials/download/version-selector.html create mode 100644 docs/layouts/partials/footer.html create mode 100644 docs/layouts/partials/guides/badges.html create mode 100644 docs/layouts/partials/guides/integrate/hero.html create mode 100644 docs/layouts/partials/guides/pagination.html create mode 100644 docs/layouts/partials/guides/tutorial.html create mode 100644 docs/layouts/partials/heading.html create mode 100644 docs/layouts/partials/hero.html create mode 100644 docs/layouts/partials/highlights/authors.html create mode 100644 docs/layouts/partials/highlights/pagination.html create mode 100644 docs/layouts/partials/home/community.html create mode 100644 docs/layouts/partials/home/components.html create mode 100644 docs/layouts/partials/home/configure.html create mode 100644 docs/layouts/partials/home/heading.html create mode 100644 docs/layouts/partials/home/hero.html create mode 100644 docs/layouts/partials/home/installation.html create mode 100644 docs/layouts/partials/home/platform.html create mode 100644 docs/layouts/partials/home/what.html create mode 100644 docs/layouts/partials/home/why-vector.html create mode 100644 docs/layouts/partials/icon.html create mode 100644 docs/layouts/partials/javascript/below.html create mode 100644 docs/layouts/partials/javascript/head.html create mode 100644 docs/layouts/partials/javascript/home.html create mode 100644 docs/layouts/partials/meta.html create mode 100644 docs/layouts/partials/navbar.html create mode 100644 docs/layouts/partials/navbar/flyout-menu.html create mode 100644 docs/layouts/partials/navbar/search-bar.html create mode 100644 docs/layouts/partials/navbar/search-results.html create mode 100644 docs/layouts/partials/navbar/toggler.html create mode 100644 docs/layouts/partials/one-liner.html create mode 100644 docs/layouts/partials/pagination.html create mode 100644 docs/layouts/partials/releases/pagination.html create mode 100644 docs/layouts/partials/social-buttons.html create mode 100644 docs/layouts/partials/svg.html create mode 100644 docs/layouts/partials/toc.html create mode 100644 docs/layouts/releases/li.html create mode 100644 docs/layouts/releases/section.html create mode 100644 docs/layouts/releases/single.html create mode 100644 docs/layouts/shortcodes/administration/logs.html create mode 100644 docs/layouts/shortcodes/administration/manage.html create mode 100644 docs/layouts/shortcodes/administration/process.html create mode 100644 docs/layouts/shortcodes/administration/upgrading.html create mode 100644 docs/layouts/shortcodes/api/config.html create mode 100644 docs/layouts/shortcodes/api/endpoints.html create mode 100644 docs/layouts/shortcodes/cli/commands.html create mode 100644 docs/layouts/shortcodes/cli/env-vars.html create mode 100644 docs/layouts/shortcodes/cli/interface.html create mode 100644 docs/layouts/shortcodes/components.html create mode 100644 docs/layouts/shortcodes/config/global.html create mode 100644 docs/layouts/shortcodes/config/log-schema.html create mode 100644 docs/layouts/shortcodes/config/metric-schema.html create mode 100644 docs/layouts/shortcodes/config/unit-tests.html create mode 100644 docs/layouts/shortcodes/danger.html create mode 100644 docs/layouts/shortcodes/details.html create mode 100644 docs/layouts/shortcodes/easy-install-scripts.html create mode 100644 docs/layouts/shortcodes/file-issue.html create mode 100644 docs/layouts/shortcodes/glossary.html create mode 100644 docs/layouts/shortcodes/info.html create mode 100644 docs/layouts/shortcodes/internal-metrics-list.html create mode 100644 docs/layouts/shortcodes/jump.html create mode 100644 docs/layouts/shortcodes/pages.html create mode 100644 docs/layouts/shortcodes/quote.html create mode 100644 docs/layouts/shortcodes/requirement.html create mode 100644 docs/layouts/shortcodes/roles.html create mode 100644 docs/layouts/shortcodes/sections.html create mode 100644 docs/layouts/shortcodes/snippet.html create mode 100644 docs/layouts/shortcodes/success.html create mode 100644 docs/layouts/shortcodes/supported-installers.html create mode 100644 docs/layouts/shortcodes/svg.html create mode 100644 docs/layouts/shortcodes/tab.html create mode 100644 docs/layouts/shortcodes/tabs.html create mode 100644 docs/layouts/shortcodes/topologies.html create mode 100644 docs/layouts/shortcodes/version.html create mode 100644 docs/layouts/shortcodes/vrl/concepts.html create mode 100644 docs/layouts/shortcodes/vrl/dynamic-expressions.html create mode 100644 docs/layouts/shortcodes/vrl/errors/compile-time.html create mode 100644 docs/layouts/shortcodes/vrl/examples.html create mode 100644 docs/layouts/shortcodes/vrl/features.html create mode 100644 docs/layouts/shortcodes/vrl/functions.html create mode 100644 docs/layouts/shortcodes/vrl/literal-expressions.html create mode 100644 docs/layouts/shortcodes/vrl/principles.html create mode 100644 docs/layouts/shortcodes/vrl/real-world-examples.html create mode 100644 docs/layouts/shortcodes/vrl/syntax.html create mode 100644 docs/layouts/shortcodes/warning.html delete mode 100644 docs/manual/about.md delete mode 100644 docs/manual/about/concepts.md delete mode 100644 docs/manual/about/under-the-hood.md delete mode 100644 docs/manual/about/under-the-hood/architecture.md delete mode 100644 docs/manual/about/under-the-hood/architecture/concurrency-model.md delete mode 100644 docs/manual/about/under-the-hood/architecture/data-model.md delete mode 100644 docs/manual/about/under-the-hood/architecture/data-model/log.md delete mode 100644 docs/manual/about/under-the-hood/architecture/data-model/metric.md delete mode 100644 docs/manual/about/under-the-hood/architecture/pipeline-model.md delete mode 100644 docs/manual/about/under-the-hood/architecture/runtime-model.md delete mode 100644 docs/manual/about/under-the-hood/guarantees.md delete mode 100644 docs/manual/about/under-the-hood/networking.md delete mode 100644 docs/manual/about/under-the-hood/networking/adaptive-request-concurrency.md delete mode 100644 docs/manual/about/what-is-vector.md delete mode 100644 docs/manual/administration.md delete mode 100644 docs/manual/administration/monitoring.md delete mode 100644 docs/manual/administration/process-management.md delete mode 100644 docs/manual/administration/tuning.md delete mode 100644 docs/manual/administration/updating.md delete mode 100644 docs/manual/administration/validating.md delete mode 100644 docs/manual/meta/glossary.md delete mode 100644 docs/manual/setup.md delete mode 100644 docs/manual/setup/configuration.md delete mode 100644 docs/manual/setup/deployment.md delete mode 100644 docs/manual/setup/deployment/strategies.md delete mode 100644 docs/manual/setup/deployment/topologies.md delete mode 100644 docs/manual/setup/getting-started.md delete mode 100644 docs/manual/setup/installation.md delete mode 100644 docs/manual/setup/installation/manual.md delete mode 100644 docs/manual/setup/installation/manual/from-archives.md delete mode 100644 docs/manual/setup/installation/manual/from-source.md create mode 100644 docs/package.json create mode 100644 docs/postcss.config.js delete mode 100644 docs/reference/installation/_interfaces/role_implementations/file_agent.cue delete mode 100644 docs/reference/installation/_interfaces/role_implementations/file_sidecar.cue delete mode 100644 docs/reference/installation/_interfaces/role_implementations/journald_agent.cue delete mode 100644 docs/reference/installation/_interfaces/role_implementations/vector_aggregator.cue delete mode 100644 docs/reference/installation/downloads.cue delete mode 100644 docs/reference/installation/downloads/aarch64-rpm.cue delete mode 100644 docs/reference/installation/downloads/aarch64-unknown-linux-gnu-tar-gz.cue delete mode 100644 docs/reference/installation/downloads/amd64-deb.cue delete mode 100644 docs/reference/installation/downloads/arm64-deb.cue delete mode 100644 docs/reference/installation/downloads/armhf-deb.cue delete mode 100644 docs/reference/installation/downloads/armv7-rpm.cue delete mode 100644 docs/reference/installation/downloads/armv7-unknown-linux-gnueabihf-tar-gz.cue delete mode 100644 docs/reference/installation/downloads/x64-msi.cue delete mode 100644 docs/reference/installation/downloads/x86_64-apple-darwin-tar-gz.cue delete mode 100644 docs/reference/installation/downloads/x86_64-pc-windows-msvc-zip.cue delete mode 100644 docs/reference/installation/downloads/x86_64-rpm.cue delete mode 100644 docs/reference/installation/downloads/x86_64-unknown-linux-gnu-tar-gz.cue delete mode 100644 docs/reference/installation/package_managers/apt.cue delete mode 100644 docs/reference/installation/package_managers/dpkg.cue delete mode 100644 docs/reference/installation/package_managers/helm.cue delete mode 100644 docs/reference/installation/package_managers/homebrew.cue delete mode 100644 docs/reference/installation/package_managers/msi.cue delete mode 100644 docs/reference/installation/package_managers/nix.cue delete mode 100644 docs/reference/installation/package_managers/rpm.cue delete mode 100644 docs/reference/installation/package_managers/yum.cue delete mode 100644 docs/reference/installation/platforms.cue delete mode 100644 docs/reference/installation/platforms/docker.cue delete mode 100644 docs/reference/installation/platforms/kubernetes.cue delete mode 100644 docs/reference/process.cue delete mode 100644 docs/reference/remap/concepts/event.cue delete mode 100644 docs/reference/remap/concepts/expression.cue delete mode 100644 docs/reference/remap/concepts/function.cue delete mode 100644 docs/reference/remap/concepts/program.cue delete mode 100644 docs/reference/services/gcp_cloud_monitoring.cue delete mode 100644 docs/reference/services/gcp_cloud_storage.cue delete mode 100644 docs/reference/services/gcp_operations_logs.cue delete mode 100644 docs/reference/services/gcp_pubsub.cue delete mode 100644 docs/reference/services/humio.cue delete mode 100644 docs/reference/services/loki.cue delete mode 100644 docs/reference/services/mongodb.cue delete mode 100644 docs/reference/services/new_relic_logs.cue delete mode 100644 docs/reference/services/nginx.cue create mode 100755 docs/scripts/cue.sh create mode 100644 docs/snippets/ack.md create mode 100644 docs/snippets/arc.md create mode 100644 docs/snippets/buffers-and-batches.md create mode 100644 docs/snippets/checkpointing.md create mode 100644 docs/snippets/guides/integrate/background/aws-cloudwatch-logs.md create mode 100644 docs/snippets/guides/integrate/background/aws-cloudwatch-metrics.md create mode 100644 docs/snippets/guides/integrate/background/aws-simple-queue-service.md create mode 100644 docs/snippets/guides/integrate/background/docker.md create mode 100644 docs/snippets/guides/integrate/background/kubernetes.md create mode 100644 docs/snippets/guides/integrate/data/logs.md create mode 100644 docs/snippets/guides/integrate/data/metrics.md create mode 100644 docs/snippets/guides/integrate/vector.md create mode 100644 docs/snippets/health-checks.md create mode 100644 docs/snippets/how-it-works/feature-flags.md create mode 100644 docs/snippets/how-it-works/schemas.md create mode 100644 docs/snippets/how-it-works/types.md create mode 100644 docs/snippets/librdkafka.md create mode 100644 docs/snippets/line-delimiters.md create mode 100644 docs/snippets/partitioning.md create mode 100644 docs/snippets/retry-policy.md create mode 100644 docs/snippets/stateless.md create mode 100644 docs/snippets/tls.md create mode 100644 docs/snippets/ui/start.md create mode 100644 docs/static/_redirects create mode 100644 docs/static/favicon.ico create mode 100644 docs/static/img/adaptive-concurrency.png create mode 100644 docs/static/img/architecture.svg create mode 100644 docs/static/img/aws-kinesis-firehose-to-vector.png create mode 100644 docs/static/img/blog/k8s-after.png create mode 100644 docs/static/img/blog/k8s-before.png create mode 100644 docs/static/img/blog/k8s-resources-after.png create mode 100644 docs/static/img/blog/k8s-resources-before.png create mode 100644 docs/static/img/blog/rate-limiting-loop.png create mode 100644 docs/static/img/blog/vector-api-public-playground.png create mode 100644 docs/static/img/blog/vector-top.png create mode 100644 docs/static/img/blog/vrl-quadrant-comparison.svg create mode 100644 docs/static/img/buffers-and-batches-partitioned.svg create mode 100644 docs/static/img/buffers-and-batches-serial.svg create mode 100644 docs/static/img/concurrency-model.svg create mode 100644 docs/static/img/data-model-event.svg create mode 100644 docs/static/img/data-model-log.svg create mode 100644 docs/static/img/data-model-metric.svg create mode 100644 docs/static/img/deployment.png create mode 100644 docs/static/img/guides/aws-kinesis-firehose-to-vector.png create mode 100644 docs/static/img/guides/merge-transform.svg create mode 100644 docs/static/img/hero-hex.svg create mode 100644 docs/static/img/logos/apple.svg create mode 100644 docs/static/img/logos/aws_cloudwatch.svg create mode 100644 docs/static/img/logos/aws_kinesis_firehose.svg create mode 100644 docs/static/img/logos/aws_kinesis_streams.svg create mode 100644 docs/static/img/logos/aws_s3.svg create mode 100644 docs/static/img/logos/clickhouse.svg create mode 100644 docs/static/img/logos/datadog.svg create mode 100644 docs/static/img/logos/docker.svg create mode 100644 docs/static/img/logos/elasticsearch.svg create mode 100644 docs/static/img/logos/file.svg create mode 100644 docs/static/img/logos/gcp_big_query.svg create mode 100644 docs/static/img/logos/gcp_cloud_storage.svg create mode 100644 docs/static/img/logos/gcp_pubsub.svg create mode 100644 docs/static/img/logos/gcp_stackdriver.svg create mode 100644 docs/static/img/logos/honeycomb.svg create mode 100644 docs/static/img/logos/http.svg create mode 100644 docs/static/img/logos/humio.svg create mode 100644 docs/static/img/logos/influxdb.svg create mode 100644 docs/static/img/logos/journald.svg create mode 100644 docs/static/img/logos/kafka.svg create mode 100644 docs/static/img/logos/kubernetes.svg create mode 100644 docs/static/img/logos/linux.svg create mode 100644 docs/static/img/logos/logdna.svg create mode 100644 docs/static/img/logos/logplex.svg create mode 100644 docs/static/img/logos/loki.svg create mode 100644 docs/static/img/logos/new_relic.svg create mode 100644 docs/static/img/logos/papertrail.svg create mode 100644 docs/static/img/logos/prometheus.svg create mode 100644 docs/static/img/logos/pulsar.svg create mode 100644 docs/static/img/logos/raspbian.svg create mode 100644 docs/static/img/logos/sematext.svg create mode 100644 docs/static/img/logos/socket.svg create mode 100644 docs/static/img/logos/splunk_hec.svg create mode 100644 docs/static/img/logos/statsd.svg create mode 100644 docs/static/img/logos/stdin.svg create mode 100644 docs/static/img/logos/syslog.svg create mode 100644 docs/static/img/logos/vector-logo-dark.svg create mode 100644 docs/static/img/logos/vector-logo-light.svg create mode 100644 docs/static/img/logos/vector.svg create mode 100644 docs/static/img/logos/windows.svg create mode 100644 docs/static/img/pipeline-model.svg create mode 100644 docs/static/img/roles/agent.svg create mode 100644 docs/static/img/roles/aggregator.svg create mode 100644 docs/static/img/roles/daemon.svg create mode 100644 docs/static/img/roles/service.svg create mode 100644 docs/static/img/roles/sidecar.svg create mode 100644 docs/static/img/runtime-model.svg create mode 100644 docs/static/img/topologies/centralized.svg create mode 100644 docs/static/img/topologies/distributed.svg create mode 100644 docs/static/img/topologies/stream-based.svg create mode 100644 docs/static/img/topology-centralized.svg create mode 100644 docs/static/img/topology-distributed.svg create mode 100644 docs/static/img/topology-stream-based.svg create mode 100644 docs/static/img/vector-open-graph.png create mode 100644 docs/tailwind.config.js create mode 100644 docs/yarn.lock create mode 100644 netlify.toml delete mode 100755 scripts/check-markdown.sh diff --git a/.editorconfig b/.editorconfig index 99a967b705cdb..ff7474b70932f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,6 +9,9 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +[docs/layouts/**/*.html] +insert_final_newline = false + [*.rs] indent_style = space indent_size = 4 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2afcefc738478..5d73b633e0604 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -35,48 +35,48 @@ # docs # -/docs/reference/components/sinks.cue @timberio/vector-integrations -/docs/reference/components/sinks/ @timberio/vector-integrations -/docs/reference/components/sinks/aws* @timberio/vector-integrations -/docs/reference/components/sinks/datadog* @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sinks/gcp* @timberio/vector-integrations -/docs/reference/components/sinks/http.cue @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sinks/kubernetes* @timberio/vector-kubernetes -/docs/reference/components/sinks/socket.cue @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sinks/vector.cue @timberio/vector-core @timberio/vector-integrations - -/docs/reference/components/sources.cue @timberio/vector-integrations -/docs/reference/components/sources/ @timberio/vector-integrations -/docs/reference/components/sources/aws* @timberio/vector-integrations -/docs/reference/components/sources/datadog* @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sources/gcp* @timberio/vector-integrations -/docs/reference/components/sources/host* @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sources/http.cue @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sources/internal_* @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sources/kubernetes* @timberio/vector-kubernetes -/docs/reference/components/sources/socket.cue @timberio/vector-core @timberio/vector-integrations -/docs/reference/components/sources/vector.cue @timberio/vector-core @timberio/vector-integrations - -/docs/reference/components/transforms.cue @timberio/vector-processing -/docs/reference/components/transforms/* @timberio/vector-processing -/docs/reference/components/transforms/aws* @timberio/vector-integrations -/docs/reference/components/transforms/gcp* @timberio/vector-integrations -/docs/reference/components/transforms/kubernetes* @timberio/vector-kubernetes - -/docs/reference/data_model.cue @timberio/vector-core @timberio/vector-processing -/docs/reference/data_model/ @timberio/vector-core @timberio/vector-processing - -/docs/reference/installation.cue @timberio/vector-integrations -/docs/reference/installation/ @timberio/vector-integrations -/docs/reference/installation/**/kubectl* @timberio/vector-kubernetes -/docs/reference/installation/**/helm* @timberio/vector-kubernetes -/docs/reference/installation/**/kubernetes* @timberio/vector-kubernetes - -/docs/reference/releases.cue @timberio/vector-releasing -/docs/reference/releases/ @timberio/vector-releasing - -/docs/reference/remap.cue @timberio/vector-processing -/docs/reference/remap/ @timberio/vector-processing +/docs/cue/reference/components/sinks.cue @timberio/vector-integrations +/docs/cue/reference/components/sinks/ @timberio/vector-integrations +/docs/cue/reference/components/sinks/aws* @timberio/vector-integrations +/docs/cue/reference/components/sinks/datadog* @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sinks/gcp* @timberio/vector-integrations +/docs/cue/reference/components/sinks/http.cue @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sinks/kubernetes* @timberio/vector-kubernetes +/docs/cue/reference/components/sinks/socket.cue @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sinks/vector.cue @timberio/vector-core @timberio/vector-integrations + +/docs/cue/reference/components/sources.cue @timberio/vector-integrations +/docs/cue/reference/components/sources/ @timberio/vector-integrations +/docs/cue/reference/components/sources/aws* @timberio/vector-integrations +/docs/cue/reference/components/sources/datadog* @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sources/gcp* @timberio/vector-integrations +/docs/cue/reference/components/sources/host* @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sources/http.cue @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sources/internal_* @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sources/kubernetes* @timberio/vector-kubernetes +/docs/cue/reference/components/sources/socket.cue @timberio/vector-core @timberio/vector-integrations +/docs/cue/reference/components/sources/vector.cue @timberio/vector-core @timberio/vector-integrations + +/docs/cue/reference/components/transforms.cue @timberio/vector-processing +/docs/cue/reference/components/transforms/* @timberio/vector-processing +/docs/cue/reference/components/transforms/aws* @timberio/vector-integrations +/docs/cue/reference/components/transforms/gcp* @timberio/vector-integrations +/docs/cue/reference/components/transforms/kubernetes* @timberio/vector-kubernetes + +/docs/cue/reference/data_model.cue @timberio/vector-core @timberio/vector-processing +/docs/cue/reference/data_model/ @timberio/vector-core @timberio/vector-processing + +/docs/cue/reference/installation.cue @timberio/vector-integrations +/docs/cue/reference/installation/ @timberio/vector-integrations +/docs/cue/reference/installation/**/kubectl* @timberio/vector-kubernetes +/docs/cue/reference/installation/**/helm* @timberio/vector-kubernetes +/docs/cue/reference/installation/**/kubernetes* @timberio/vector-kubernetes + +/docs/cue/reference/releases.cue @timberio/vector-releasing +/docs/cue/reference/releases/ @timberio/vector-releasing + +/docs/cue/reference/remap.cue @timberio/vector-processing +/docs/cue/reference/remap/ @timberio/vector-processing # # distribution diff --git a/.github/semantic.yml b/.github/semantic.yml index 8a0d05da02696..f630e430a97e8 100644 --- a/.github/semantic.yml +++ b/.github/semantic.yml @@ -15,7 +15,8 @@ types: - enhancement # Any user observable enhancement to an existing feature. - feat # Any user observable new feature, such as a new platform, source, transform, or sink. - fix # Any user observable bug fix. - - docs # A documentation change + - docs # A documentation change. + - website # A website change that isn't a docs content change (CSS, HTML templates, search, etc.). scopes: - new source @@ -213,3 +214,12 @@ scopes: - splunk_hec sink # Anything `splunk_hec` sink related - statsd sink # Anything `statsd` sink related - vector sink # Anything `vector` sink related + + # website + - blog # Anything related to the Vector blog + - css # Anything related to vector.dev's CSS and aesthetics + - guides # Anything related to Vector's guides + - highlights # Anything related to vector.dev highlights + - javascript # Anything related to the JavaScript functionality on vector.dev + - search # Anything related to the website's Algolia search indexing/config + - template # Anything related to website HTML and other templates diff --git a/.github/workflows/publish-docs.yml.bak b/.github/workflows/publish-docs.yml.bak deleted file mode 100644 index dfe6bd0c1380f..0000000000000 --- a/.github/workflows/publish-docs.yml.bak +++ /dev/null @@ -1,110 +0,0 @@ -name: Publish Docs If Updated - -on: - pull_request: - types: [closed, synchronize, opened, reopened] - branches: - - master - -jobs: - check-docs-diff: - runs-on: macos-latest - outputs: - diff: ${{ steps.git-diff.outputs.diff }} - steps: - - name: Checkout Vector - uses: actions/checkout@v2 - - - name: Check MD Diff - id: git-diff - uses: technote-space/get-diff-action@v3 - with: - PREFIX_FILTER: | - docs - - build: - runs-on: macos-latest - needs: check-docs-diff - if: ${{ needs.check-docs-diff.outputs.diff }} - steps: - - name: Clone Vector - uses: actions/checkout@v2 - with: - repository: timberio/vector - ref: ${{ github.ref }} - path: vector - - - name: Clone Vector Website - uses: actions/checkout@v2 - with: - # timberio/vector-website and gatsby-docs respectively - repository: timberio/vector-website - ref: gatsby-docs - path: vector-website - token: ${{ secrets.GH_ACCESS_TOKEN }} - - - name: Setup Cue - run: brew install cuelang/tap/cue - - - name: Setup Node - uses: actions/setup-node@v1 - - - name: Install Dependencies - working-directory: ./vector-website - run: | - npm config set '//registry.npmjs.org/:_authToken' "${{ secrets.NPM_TOKEN }}" - yarn install - cd ./plugins/gatsby-plugin-graphql-codegen && yarn install - - - name: Build Site - run: cd ./vector-website && yarn run build - - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: gatsby-build - path: ./vector-website/public - - preview: - runs-on: macos-latest - needs: build - if: github.event.action != 'closed' - steps: - - name: Download Build Artifact - uses: actions/download-artifact@v2 - with: - name: gatsby-build - - - name: Setup Node - uses: actions/setup-node@v1 - - - name: Install Dependencies - run: npm install -g netlify-cli - - - name: Deploy Preview - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - run: netlify deploy --dir=./ --message="Preview from vector:${{ github.head_ref }}@${{ github.sha }} With timberio/vector-website@gatsby-docs" - - publish: - runs-on: macos-latest - needs: build - if: github.event.action == 'closed' && github.event.pull_request.merged == true - steps: - - name: Download Build Artifact - uses: actions/download-artifact@v2 - with: - name: gatsby-build - - - name: Setup Node - uses: actions/setup-node@v1 - - - name: Install Dependencies - run: npm install -g netlify-cli - - - name: Deploy Production - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - run: netlify deploy --dir=./ --prod --message="Deploy from vector:${{ github.head_ref }}@${{ github.sha }} With timberio/vector-website@gatsby-docs" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 15b1fc97492a1..573bb4d5ca35f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,8 +36,6 @@ jobs: # Set job outputs to values from filter step outputs: source: ${{ steps.filter.outputs.source }} - docs: ${{ steps.filter.outputs.docs }} - markdown: ${{ steps.filter.outputs.markdown }} dependencies: ${{ steps.filter.outputs.dependencies }} internal_events: ${{ steps.filter.outputs.internal_events }} helm: ${{ steps.filter.outputs.helm }} @@ -64,10 +62,6 @@ jobs: - "rust-toolchain" deny: - 'deny.toml' - docs: - - 'docs/**' - markdown: - - '**/**.md' dependencies: - 'Cargo.toml' - 'Cargo.lock' @@ -332,12 +326,6 @@ jobs: run: echo "::add-matcher::.github/matchers/rust.json" - name: Make slim-builds run: make slim-builds - - name: Check markdown - if: needs.changes.outputs.markdown == 'true' || needs.changes.outputs.source == 'true' - run: make check-markdown - - name: Check Cue docs - if: needs.changes.outputs.docs == 'true' || needs.changes.outputs.source == 'true' - run: make check-docs - name: Check code format || needs.changes.outputs.source == 'true' if: needs.changes.outputs.source == 'true' run: make check-fmt diff --git a/Makefile b/Makefile index 05a8de375a5b7..b93d78cf593e4 100644 --- a/Makefile +++ b/Makefile @@ -648,7 +648,7 @@ check: ## Run prerequisite code checks .PHONY: check-all check-all: ## Check everything -check-all: check-fmt check-clippy check-style check-markdown check-docs +check-all: check-fmt check-clippy check-style check-docs check-all: check-version check-examples check-component-features check-all: check-scripts check-all: check-helm-lint check-helm-dependencies check-helm-snapshots diff --git a/README.md b/README.md index d301bc46282f0..e3b65ffdafba9 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ Vector**][docs.installation]. ### Administration -* [**Process management**][docs.administration.process-management] +* [**Management**][docs.administration.management] * [**Monitoring & observing**][docs.administration.monitoring] * [**Upgrading**][docs.administration.upgrading] * [**Validating**][docs.administration.validating] @@ -157,7 +157,7 @@ Vector is an end-to-end, unified, open data platform. [docs.about.concepts]: https://vector.dev/docs/about/concepts/ [docs.about.under-the-hood]: https://vector.dev/docs/about/under-the-hood/ [docs.administration.monitoring]: https://vector.dev/docs/administration/monitoring/ -[docs.administration.process-management]: https://vector.dev/docs/administration/process-management/ +[docs.administration.management]: https://vector.dev/docs/administration/management/ [docs.administration.upgrading]: https://vector.dev/docs/administration/upgrading/ [docs.administration.validating]: https://vector.dev/docs/administration/validating/ [docs.architecture.concurrency-model]: https://vector.dev/docs/about/under-the-hood/architecture/concurrency-model/ diff --git a/docs/.env.example b/docs/.env.example new file mode 100644 index 0000000000000..cb37a5c9ac648 --- /dev/null +++ b/docs/.env.example @@ -0,0 +1,5 @@ +# Algolia search +ALGOLIA_APP_ID="" +ALGOLIA_ADMIN_KEY="" +ALGOLIA_INDEX_NAME="" +ALGOLIA_INDEX_FILE="public/search.json" diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000000..686aac2483d9b --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,20 @@ +# Environment variables +.env + +# Hugo-generated assets +public/ +resources/ +hugo_stats.json +assets/jsconfig.json + +# JavaScript, Sass, CSS, etc. +node_modules/ + +# CUE-generated assets +data/docs.json + +# htmltest generated +tmp/ + +# Yarn errors +yarn-error.log diff --git a/docs/.htmltest.external.yml b/docs/.htmltest.external.yml new file mode 100644 index 0000000000000..3508294079c6f --- /dev/null +++ b/docs/.htmltest.external.yml @@ -0,0 +1,14 @@ +DirectoryPath: public +IgnoreDirectoryMissingTrailingSlash: true +CheckExternal: true +IgnoreAltMissing: true +IgnoreEmptyHref: true +IgnoreURLs: +# We have to ignore this due to rate limiting +- "github.com" +- "packages.timber.io" +- "localhost" +# Somehow this link allows shows up as broken, so we'll exclude it +- "https://www.microsoft.com/en-us/windows" +# Somehow these links always come up as 5xx even though they work fine in the browser +- "maxmind.com" diff --git a/docs/.htmltest.yml b/docs/.htmltest.yml new file mode 100644 index 0000000000000..e0a08a91fe5ad --- /dev/null +++ b/docs/.htmltest.yml @@ -0,0 +1,5 @@ +DirectoryPath: public +IgnoreDirectoryMissingTrailingSlash: true +CheckExternal: false +IgnoreAltMissing: true +IgnoreEmptyHref: true diff --git a/docs/Brewfile.netlify b/docs/Brewfile.netlify new file mode 100644 index 0000000000000..6a60369cec128 --- /dev/null +++ b/docs/Brewfile.netlify @@ -0,0 +1,2 @@ +brew "cuelang/tap/cue" +brew "htmltest" diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000000..d6f69568d9c5a --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,69 @@ +CUE = ./scripts/cue.sh + +clean: + rm -rf public resources + +setup: + yarn + +# Build JSON from CUE sources +cue-build: + ${CUE} build + +# Other CUE commands +cue-check: + ${CUE} check + +cue-fmt: + ${CUE} fmt + +cue-list: + ${CUE} list + +cue-vet: + ${CUE} vet + +serve: setup cue-build + hugo server \ + --buildDrafts \ + --buildFuture + +# Live site +production-build: + hugo \ + --minify + +ci-production-build: setup cue-build production-build run-link-checker algolia + +# Preview site +preview-build: + hugo \ + --baseURL $(DEPLOY_PRIME_URL) \ + --buildFuture \ + --minify + +ci-preview-build: setup cue-build preview-build algolia + +run-link-checker: + htmltest + +run-external-link-checker: + htmltest --conf ./.htmltest.external.yml + +# Check links without rebuilding the CUE sources. Optimal for fixing links locally. +check-links: production-build run-link-checker + +# Search +algolia: + yarn run algolia-config + yarn run algolia-index + +# Useful for locally debugging issues that arise only on the deployed production site +run-production-site-locally: + make setup cue-build production-build + python -m http.server 8000 --directory ./public --bind 127.0.0.1 + +# Full local builds without Algolia updates (for debugging, link checking, etc.) +local-production-build: clean setup cue-build production-build run-link-checker + +local-preview-build: clean setup cue-build preview-build run-link-checker diff --git a/docs/README.md b/docs/README.md index 7bd972e44e0e8..bcd7ea1393806 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,81 @@ -# The Vector documentation sources +# vector.dev -See [`CONTRIBUTING.md`][contrib] for more information about how the documentation sources in this -directory work. +This directory houses the assets used to build Vector's website and documentation, available at [vector.dev][vector]. -[contrib]: ../CONTRIBUTING.md#documentation +## Prerequisites + +In order to run the site locally, you need to have these installed: + +* The [Hugo] static site generator. Make sure to install the extended version (with [Sass] and [ESBuild] support), specifically the version specified in [`netlify.toml`][netlify_toml]. +* The [CUE] configuration and validation language. See the value of `CUE_VERSION` in [`amplify.yml`](./amplify.yml) to see which version of CUE is currently being used for the docs. +* The [Yarn] package manager (used for static assets). +* [htmltest] for link checking. + +## Run the site locally + +```shell +make serve +``` + +## Tasks + +### Add a new version of Vector + +1. Add the new version to the `versions` list in [`cue/reference/versions.cue`](./cue/reference/versions.cue). Make sure to preserve reverse ordering. +1. Generate a new CUE file for the release by running `make release-prepare` in the root directory of the Vector repo. +1. Add a new Markdown file to [`content/en/releases`](./content/en/releases), where the filename is `{version}.md` (e.g. `0.12.0.md`) and the file has metadata that looks like this: + + ```markdown + --- + title: Vector v0.13.0 release notes + weight: 19 + --- + ``` + + The `title` should reflect the version, while the `weight` should be the weight of the next most recent version plus 1. The file for version 0.8.1, for example, has a weight of 8, which means the weight for version 0.8.2 (the next higher version) is 9. This metadata is necessary because Hugo can't sort semantic versions, so we need to make the ordering explicit. If Hugo ever does allow for semver sorting, we should remove the `weight`s. + +## Redirects + +Redirects for vector.dev are defined in three difference places (depending on the use): + +1. Domain-level redirects, e.g. chat.vector.dev to our Discord server, are defined in [`netlify.toml`](../netlify.toml) in the repo root. +2. Splat-style redirects (which can't be defined as Hugo aliases) are defined in [`./static/_redirects`](./static/_redirects). +3. Redirects for specific pages are defined in the `aliases` field in that page's front matter. + +## Link checker + +vector.dev uses the [htmltest] link checker to sniff out broken links. Whenever the site is built in CI, be it the preview build or the production build, all internal links on the site are checked. If *any* link is broken, the build fails. If you push changes to the docs/site and your build yields a big red X but running the site locally works fine, scan the CI output for broken links. There's a good chance that that's your culprit. + +You can run the full CI builds locally, with link checking included: + +```shell +# Production +make local-production-build + +# Preview +make local-preview-build +``` + +The standard link checking configuration is in [`.htmltest.yml`](./.htmltest.yml). As you can see from this config, external links are *not* checked (`CheckExternal: false`). That's because external link checking makes builds highly brittle, as they become dependent upon external systems, i.e. if CloudFlare has an outage or an external site is down, the vector.dev build fails. The trade-off here, of course, is that broken external links can go undetected. The semi-solution is to periodically run ad hoc external link checks: + +```shell +make local-production-build +make run-external-link-checker +``` + +That second make command runs htmltest using the [`.htmltest.external.yml`](./htmltest.external.yml) configuration, which sets `CheckExternal` to `true`. We should strive to run this periodically in local environments to make sure we don't have too much drift over time. + +## Known issues + +* Tailwind's [typography] plugin is used to render text throughout the site. It's a decent library in general but is also rather buggy, with some rendering glitches in things like lists and tables that we've tried to compensate for in the `extend.typography` block in the [Tailwind config](./tailwind.config.js), but it will take some time to iron all of these issues out. + +[cue]: https://cue-lang.org +[esbuild]: https://github.com/evanw/esbuild +[htmltest]: https://github.com/wjdp/htmltest +[hugo]: https://gohugo.io +[netlify_toml]: ../netlify.toml +[sass]: https://sass-lang.com +[tailwind]: https://tailwindcss.com +[typography]: https://github.com/tailwindlabs/tailwindcss-typography +[vector]: https://vector.dev +[yarn]: https://yarnpkg.com diff --git a/docs/algolia.json b/docs/algolia.json new file mode 100644 index 0000000000000..b726d9c0412a3 --- /dev/null +++ b/docs/algolia.json @@ -0,0 +1,51 @@ +{ + "minWordSizefor1Typo": 4, + "minWordSizefor2Typos": 8, + "hitsPerPage": 10, + "maxValuesPerFacet": 100, + "searchableAttributes": [ + "title", + "description", + "content", + "section", + "summary", + "unordered(tags)" + ], + "numericAttributesToIndex": null, + "attributesToRetrieve": null, + "unretrievableAttributes": null, + "optionalWords": null, + "attributesForFaceting": null, + "attributesToSnippet": [ + "title:10", + "content:10" + ], + "attributesToHighlight": null, + "paginationLimitedTo": 1000, + "attributeForDistinct": null, + "exactOnSingleWordQuery": "attribute", + "ranking": [ + "typo", + "geo", + "words", + "filters", + "proximity", + "attribute", + "exact", + "custom" + ], + "customRanking": [ + "desc(level)", + "desc(ranking)" + ], + "separatorsToIndex": "", + "removeWordsIfNoResults": "none", + "queryType": "prefixLast", + "highlightPreTag": "", + "highlightPostTag": "", + "snippetEllipsisText": "…", + "alternativesAsExact": [ + "ignorePlurals", + "singleWordSynonym" + ] +} diff --git a/docs/assets/css/style.css b/docs/assets/css/style.css new file mode 100644 index 0000000000000..6b07a0fe9ce3b --- /dev/null +++ b/docs/assets/css/style.css @@ -0,0 +1,49 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --primary: #28d9f2; + --secondary: #f44af5; +} + +@layer components { + .search-input { + @apply bg-gray-200 dark:bg-gray-700 border border-transparent rounded-md sm:text-sm text-gray-800 dark:text-gray-400 placeholder-gray-400 leading-5 block w-full pl-10 pr-3 focus:outline-none focus:bg-white focus:text-gray-900; + } + + .search-results-list { + @apply grid grid-cols-2 md:grid-cols-3; + } + + .search-results-list .search-result { + @apply text-dark dark:text-gray-200 py-2 hover:text-secondary dark:hover:text-primary cursor-pointer; + } + + .code-sample-filename { + @apply font-semibold font-mono tracking-wide text-gray-200 dark:text-gray-200 bg-dark dark:bg-black py-1.5 px-2 rounded text-sm; + } +} + +[x-cloak] { + display: none !important; +} + +// Some rules that Tailwind can't really cover +.jump + .jump, .admonition + .admonition { + margin-top: 0.5rem; +} + +.svg svg { + max-width: 100%; + height: auto; +} + +// Algolia search stuff +.dark .ais-Highlight-highlighted { + color: var(--primary); +} + +.light .ais-Highlight-highlighted { + color: var(--secondary); +} diff --git a/docs/assets/images/diagram.svg b/docs/assets/images/diagram.svg deleted file mode 100644 index 867df7592e18d..0000000000000 --- a/docs/assets/images/diagram.svg +++ /dev/null @@ -1,1585 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/img/icons/chart.svg b/docs/assets/img/icons/chart.svg new file mode 100644 index 0000000000000..b07e1e0bfd82d --- /dev/null +++ b/docs/assets/img/icons/chart.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/img/icons/clock.svg b/docs/assets/img/icons/clock.svg new file mode 100644 index 0000000000000..f463bbac8bea0 --- /dev/null +++ b/docs/assets/img/icons/clock.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/img/icons/code.svg b/docs/assets/img/icons/code.svg new file mode 100644 index 0000000000000..ecce2a3aeda40 --- /dev/null +++ b/docs/assets/img/icons/code.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/img/icons/hex.svg b/docs/assets/img/icons/hex.svg new file mode 100644 index 0000000000000..24ddb57a44f2b --- /dev/null +++ b/docs/assets/img/icons/hex.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/img/icons/laptop.svg b/docs/assets/img/icons/laptop.svg new file mode 100644 index 0000000000000..a9e4dc67915be --- /dev/null +++ b/docs/assets/img/icons/laptop.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/img/icons/lock.svg b/docs/assets/img/icons/lock.svg new file mode 100644 index 0000000000000..6d40a51830ab4 --- /dev/null +++ b/docs/assets/img/icons/lock.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/assets/js/app.js b/docs/assets/js/app.js new file mode 100644 index 0000000000000..1745bc60ea73c --- /dev/null +++ b/docs/assets/js/app.js @@ -0,0 +1,126 @@ +{{ $latest := index site.Data.docs.versions 0 }} +{{ $defaultPlatformTab := index site.Home.Params.platform.tabs 0 }} +{{ $siteGeneration := site.Params.site_generation }} +import '@ryangjchandler/spruce'; +import 'alpinejs'; + +const sayHello = () => { + console.log('Welcome to the Vector website and documentation!'); +} + +const clearLocalStorageOnNewGeneration = () => { + const currentGeneration = {{ $siteGeneration }}; + const storedGeneration = localStorage.getItem('generation'); + + if ((storedGeneration != null) && (storedGeneration < currentGeneration)) { + ['__spruce:ui', '__spruce:global'].forEach((item) => localStorage.removeItem(item)); + } + + localStorage.setItem('generation', currentGeneration); +} + +/* Global state management */ +const manageState = () => { + // Persist global state in localStorage + const useLocalStorage = true; + + // Detect the user's dark mode preference and set that to the default + const darkModeDefault = window.matchMedia('(prefers-color-scheme: dark)').matches; + + window.Spruce.store('global', { + // Dark mode state + dark: darkModeDefault, + // Whether the top banner is showing (user can dismiss) + banner: true, + // The Vector version selected (for the download and releases pages) + version: '{{ $latest }}', + // A "backup" version for use in release toggling + versionBackup: '{{ $latest }}', + // Release version + release: 'stable', + + // Home page platform tab + platformTab: '{{ $defaultPlatformTab }}', + + isDark() { + return this.dark; + }, + + isLight() { + return !this.dark; + }, + + // Set release directly + setRelease(release) { + this.release = release; + }, + // Set a new version + setVersion(v) { + this.version = v; + + if (v === 'nightly') { + this.setRelease('nightly'); + } + + if (v != 'nightly') { + this.setRelease('stable'); + this.versionBackup = v; + } + }, + notLatest() { + return this.version != '{{ $latest }}'; + }, + setToLatest() { + this.setVersion('{{ $latest }}'); + }, + // Switch dark mode on and off + toggleDarkMode() { + this.dark = !this.dark; + }, + // Toggle between stable and nightly + toggleRelease() { + if (this.release === 'stable') { + this.release = 'nightly'; + this.setVersion('nightly'); + } else if (this.release === 'nightly') { + this.release = 'stable'; + this.setVersion(this.versionBackup); + } + }, + // Switch the banner on and off + toggleBanner() { + this.banner = !this.banner; + }, + // Boolean helpers + isNightly() { + return this.release === 'nightly'; + }, + isStable() { + return this.release === 'stable'; + }, + isCurrent(version) { + return this.version === version; + }, + }, useLocalStorage); + + window.Spruce.store('ui', { + // Management UI data + {{ range site.Data.docs.administration.ui.management.families }} + {{ .name }}_interface: '{{ (index .interfaces 0).title }}', + {{ end }} + + + platform: '{{ index site.Data.docs.administration.ui.management.family_names 0 }}', + interface: '{{ site.Data.ui.defaults.interface }}', + dockerVersion: '{{ site.Data.ui.default.dockerVersion }}', + dockerDistro: '{{ site.Data.ui.default.dockerDistro }}', + }, useLocalStorage); +} + +const main = () => { + sayHello(); + clearLocalStorageOnNewGeneration(); + manageState(); +} + +main(); diff --git a/docs/assets/js/below.js b/docs/assets/js/below.js new file mode 100644 index 0000000000000..50d0a210d2140 --- /dev/null +++ b/docs/assets/js/below.js @@ -0,0 +1,105 @@ +{{ $search := site.Params.search }} +{{ $algoliaAppId := $search.algolia_app_id }} +{{ $algoliaApiKey := $search.algola_public_api_key }} +{{ $algoliaIndex := cond hugo.IsProduction $search.algolia_index_prod $search.algolia_index_staging }} + +import algoliasearch from 'algoliasearch/lite'; +import instantsearch from 'instantsearch.js'; +import { connectHits, connectSearchBox } from 'instantsearch.js/es/connectors'; + +import 'tocbot/dist/tocbot'; + +// Algolia search +const searchClient = algoliasearch('{{ $algoliaAppId }}', '{{ $algoliaApiKey }}'); + +const search = instantsearch({ + indexName: '{{ $algoliaIndex }}', + searchClient +}); + +const renderSearchBox = (renderOptions, isFirstRender) => { + const { query, refine, widgetParams } = renderOptions; + + const container = widgetParams.container; + + // Make sure you add any Tailwind classes you apply here to the safeClasses list in postcss.config.js + if (isFirstRender) { + container.innerHTML = ` + + `; + + container.querySelector('#algolia-search-input').addEventListener('input', event => { + refine(event.target.value); + }); + } + + container.querySelector('#algolia-search-input').value = query; +} + +const renderHits = (renderOptions, _isFirstRender) => { + const { hits, widgetParams } = renderOptions; + + // Make sure you add any Tailwind classes you apply here to the safeClasses list in postcss.config.js + widgetParams.container.innerHTML = ` + + `; +}; + +const customHits = connectHits(renderHits); + +const customSearchBox = connectSearchBox(renderSearchBox); + +const searchInput = customSearchBox({ + container: document.querySelector('#algolia-search-box') +}); + +const searchResults = customHits({ + container: document.querySelector('#algolia-search-results') +}); + +search.addWidgets([ + searchInput, + searchResults +]); + +// Table of contents for documentation pages +const tableOfContents = () => { + if (document.getElementById('toc')) { + tocbot.init({ + tocSelector: '#toc', + contentSelector: '#page-content', + headingSelector: 'h1, h2, h3, h4, h5', + ignoreSelector: 'no-toc', + scrollSmoothDuration: 400 + }); + } +} + +const showCodeFilename = () => { + var els = document.getElementsByClassName("highlight"); + for (var i = 0; i < els.length; i++) { + if (els[i].title.length) { + var newNode = document.createElement("div"); + newNode.innerHTML = `${els[i].title}`; + els[i].parentNode.insertBefore(newNode, els[i]); + } + } +} + +document.addEventListener('DOMContentLoaded', () => { + search.start(); + + tableOfContents(); + showCodeFilename(); +}); diff --git a/docs/assets/js/countries.json b/docs/assets/js/countries.json new file mode 100644 index 0000000000000..a008ae3271f3e --- /dev/null +++ b/docs/assets/js/countries.json @@ -0,0 +1,3806 @@ +{ + "type": "Topology", + "arcs": [ + [ + [5058, 829], + [-24, -80], + [-182, 7], + [-76, 55], + [185, -11], + [97, 29] + ], + [ + [873, 874], + [-80, -11], + [-109, 86], + [104, 18], + [74, -55], + [11, -38] + ], + [ + [5664, 995], + [52, -36], + [24, -129], + [-300, -83], + [-99, 5], + [-48, 62], + [90, 23], + [134, 158], + [84, 18], + [63, -18] + ], + [ + [2469, 1373], + [81, -27], + [-98, -15], + [17, 42] + ], + [ + [2287, 1375], + [-15, -21], + [-58, 23], + [31, 17], + [42, -19] + ], + [ + [3403, 1504], + [84, -43], + [-160, -5], + [-42, 17], + [4, 49], + [114, -18] + ], + [ + [4685, 1585], + [-14, -101], + [-96, -28], + [-131, 12], + [-34, 58], + [75, 43], + [48, -3], + [14, 140], + [24, 39], + [61, -18], + [53, -142] + ], + [ + [5099, 2151], + [-84, -13], + [-80, -65], + [-3, -64], + [19, -27], + [-68, -26], + [-74, -90], + [-7, -31], + [37, -60], + [67, -46], + [71, -155], + [6, -77], + [28, -96], + [-5, -44], + [-48, -62], + [-56, -11], + [-44, -57], + [-229, -80], + [-34, -35], + [-279, -6], + [151, -100], + [-47, -26], + [-133, -13], + [-4, -67], + [112, -89], + [165, -36], + [136, -52], + [208, -36], + [262, -93], + [142, 50], + [162, 44], + [105, 2], + [187, -31], + [86, 60], + [106, 2], + [162, 36], + [245, 47], + [-47, 90], + [-250, -16], + [-6, 93], + [149, 57], + [140, 81], + [143, 33], + [179, 31], + [155, 65], + [77, 52], + [-32, 52], + [43, 61], + [89, 36], + [127, 120], + [121, -36], + [23, 64], + [56, -39], + [50, -5], + [107, 24], + [112, -11], + [137, 38], + [126, 50], + [101, 20], + [54, -69], + [48, 17], + [61, 55], + [106, -5], + [139, 12], + [93, -15], + [46, -52], + [47, 14], + [144, 5], + [237, 90], + [47, 73], + [44, -13], + [52, -49], + [44, 7], + [61, -51], + [57, 56], + [82, 42], + [90, 28], + [101, 55], + [39, -9], + [65, 52], + [74, 18], + [9, 29], + [69, 39], + [81, 20], + [77, -13], + [37, -59], + [63, -51], + [50, -9], + [63, -46], + [40, -5], + [70, 51], + [39, -18], + [164, -26], + [35, -87], + [-7, -59], + [-73, -52], + [47, -63], + [-41, -66], + [80, -34], + [49, 15], + [37, 63], + [49, 51], + [33, 70], + [159, 34], + [62, 95], + [153, 93], + [42, -8], + [156, 36], + [132, -30], + [41, 10], + [144, -5], + [32, -18], + [121, 23], + [44, -11], + [131, 140], + [59, -34], + [81, -80], + [80, -2], + [91, 21], + [63, 48], + [78, 21], + [84, -69], + [46, 4], + [79, -43], + [96, -1], + [61, 52], + [38, 6], + [82, -19], + [77, 13], + [76, -17], + [83, 28], + [90, 3], + [124, 30], + [31, -62], + [35, -15], + [141, 12], + [94, 1], + [103, -10], + [29, -26], + [19, -55], + [92, -41], + [154, -41], + [75, 26], + [106, -68], + [100, -18], + [20, -33], + [127, -62], + [144, -1], + [97, -18], + [117, -61], + [-81, -163], + [-55, -13], + [-79, -47], + [-78, -90], + [-28, -65], + [-3, -68], + [52, -93], + [95, -48], + [-220, -34], + [-83, -148], + [114, -93], + [269, -106], + [21, -41], + [276, -28], + [169, -46], + [0, -440], + [-15121, 0], + [0, 440], + [2, -1], + [234, 16], + [186, 54], + [123, -57], + [376, -67], + [121, 23], + [280, -43], + [228, 48], + [9, 39], + [-301, 23], + [-149, 50], + [31, 137], + [-102, 53], + [134, 34], + [61, -28], + [144, 55], + [19, 62], + [-116, 48], + [-244, 24], + [-114, 87], + [45, 60], + [136, 20], + [101, -28], + [156, 68], + [64, 8], + [-4, 92], + [79, -13], + [112, 37], + [117, 10], + [153, 56], + [124, 0], + [56, -15], + [113, 13], + [119, -16], + [240, 3], + [93, 37], + [53, -18], + [96, 44], + [69, -83], + [43, 25], + [156, -64], + [112, 20], + [178, -30], + [22, 36], + [-47, 57], + [-79, 38], + [-23, 93], + [141, -12], + [167, -71], + [164, 37], + [43, -19], + [125, 32], + [102, -6], + [34, -33], + [156, -31], + [50, 60], + [42, -32], + [57, 8], + [72, -46], + [142, 48], + [164, 32], + [66, 44], + [5, 70], + [-52, 128], + [2, 65], + [42, 98], + [-13, 68], + [71, 93], + [62, 51], + [17, 36], + [49, 44], + [131, 57], + [54, 47], + [42, -39], + [-42, -25] + ], + [ + [4715, 3009], + [54, -50], + [59, -21], + [-19, -41], + [-75, -9], + [-36, -26], + [-45, 10], + [-75, 37], + [-96, 91], + [-23, 76], + [59, -56], + [56, -30], + [35, 95], + [39, 35], + [30, -10], + [37, -101] + ], + [ + [5101, 3238], + [34, -38], + [-13, -29], + [-56, -25], + [-19, 29], + [-36, -37], + [-21, 37], + [50, 50], + [36, -21], + [25, 34] + ], + [ + [10512, 3353], + [-64, -5], + [8, 96], + [27, -26], + [40, -11], + [-11, -54] + ], + [ + [13668, 4096], + [40, -29], + [56, 27], + [25, -5], + [3, -99], + [-63, -131], + [-34, 7], + [-26, 71], + [-6, 55], + [-24, 73], + [29, 31] + ], + [ + [14828, 4085], + [9, -34], + [30, 34], + [12, -71], + [-81, -174], + [-36, -31], + [-35, -139], + [-54, -61], + [-39, 2], + [-27, 27], + [-46, 6], + [-7, 31], + [23, 61], + [53, 82], + [27, 16], + [66, 75], + [25, 44], + [41, 129], + [30, 39], + [9, -36] + ], + [ + [14895, 4482], + [30, -88], + [60, -56], + [28, -7], + [24, 32], + [22, -10], + [-23, -122], + [-32, 2], + [-8, -61], + [-42, -118], + [-33, -33], + [-25, 34], + [25, 68], + [-14, 46], + [-45, 34], + [1, 30], + [30, 29], + [5, 118], + [-36, 104], + [-33, 74], + [-17, 59], + [15, 7], + [23, -47], + [33, -21], + [12, -74] + ], + [ + [14580, 5647], + [-16, -20], + [-53, 60], + [-55, 102], + [12, 27], + [24, -28], + [88, -141] + ], + [ + [15053, 6048], + [14, -24], + [-7, -44], + [-26, -11], + [-23, 10], + [-4, 37], + [16, 28], + [30, 4] + ], + [ + [15094, 6093], + [-27, -18], + [-5, 31], + [59, 48], + [0, -41], + [-27, -20] + ], + [ + [3, 6117], + [-3, -4], + [0, 41], + [9, 4], + [-6, -41] + ], + [ + [14610, 6120], + [-13, -11], + [-14, 37], + [1, 22], + [26, -48] + ], + [ + [14579, 6248], + [7, -67], + [-20, 6], + [-7, 87], + [20, -26] + ], + [ + [9663, 6363], + [7, -100], + [11, -39], + [-12, -65], + [-29, -92], + [-3, -70], + [-37, -212], + [-26, -158], + [-16, -115], + [-19, -97], + [-35, -20], + [-36, -35], + [-58, 51], + [-11, 44], + [-3, 74], + [-15, 66], + [-4, 60], + [8, 60], + [39, 105], + [4, 53], + [-18, 92], + [-3, 77], + [15, 46], + [5, 53], + [21, 3], + [39, 32], + [19, 2], + [58, 98], + [48, 126], + [1, 50], + [14, 37], + [26, -71], + [10, -55] + ], + [ + [13590, 6345], + [16, -65], + [27, 31], + [34, -67], + [-5, -37], + [16, -113], + [10, -10], + [12, -71], + [-4, -44], + [13, -56], + [46, -43], + [58, -76], + [-6, -20], + [24, -53], + [16, -90], + [17, 19], + [27, -24], + [8, -88], + [49, -83], + [33, -67], + [12, -67], + [-2, -99], + [20, -71], + [-3, -73], + [-18, -113], + [-8, -108], + [-18, -75], + [-31, -41], + [-30, -106], + [-12, -72], + [-16, -41], + [-11, -62], + [-3, -84], + [-24, -29], + [-47, -3], + [-39, -34], + [-45, -68], + [-77, 79], + [-36, -60], + [-61, 35], + [-64, 31], + [-27, 51], + [-18, 105], + [-21, 34], + [-40, 10], + [14, 40], + [-10, 62], + [-21, -58], + [-15, 31], + [22, 89], + [-3, 62], + [-34, -71], + [-26, -29], + [-17, -66], + [-32, 34], + [1, 44], + [-41, 111], + [-54, 51], + [-29, 2], + [-40, 40], + [-76, -7], + [-102, -58], + [-40, 6], + [-44, -43], + [-37, -19], + [-23, -78], + [-62, -9], + [-38, 15], + [-59, -13], + [-78, -91], + [-59, 4], + [-67, 69], + [1, 47], + [21, 12], + [10, 106], + [-4, 50], + [-22, 84], + [-5, 95], + [-18, 78], + [-19, 34], + [-5, 65], + [-26, 142], + [33, -13], + [-35, 116], + [19, 111], + [-4, 48], + [20, -3], + [18, 57], + [34, 28], + [21, 35], + [32, 31], + [30, -4], + [33, 31], + [26, 9], + [17, 26], + [24, -2], + [44, 25], + [23, 37], + [10, 44], + [25, 42], + [3, 79], + [29, 71], + [18, -72], + [18, 16], + [-15, 40], + [13, 40], + [19, -18], + [5, 63], + [55, 112], + [58, 34], + [31, -38], + [23, -50], + [53, -8], + [-9, 46], + [33, 109], + [18, 48], + [25, 29], + [22, -10], + [35, 16], + [-1, 42], + [20, 19], + [22, -34], + [35, -21], + [12, 8], + [26, -26], + [51, 33], + [19, -41], + [-64, -197], + [3, -23], + [33, -46], + [33, -27], + [52, -78], + [33, -21], + [7, -26], + [40, -28], + [28, 28], + [34, 194], + [-7, 112], + [7, 107], + [18, 90], + [17, 55], + [11, -41], + [3, -52], + [28, -87], + [1, -78] + ], + [ + [14370, 6618], + [-18, -28], + [-16, 52], + [34, -24] + ], + [ + [12631, 6639], + [-18, -2], + [-56, 58], + [40, 17], + [36, -51], + [-2, -22] + ], + [ + [14317, 6669], + [-42, 7], + [-7, 46], + [28, -13], + [21, -40] + ], + [ + [14352, 6692], + [-7, -15], + [-31, 72], + [-9, 49], + [15, 0], + [15, -66], + [17, -40] + ], + [ + [12787, 6647], + [-36, -18], + [-1, 38], + [18, 51], + [42, 33], + [4, 19], + [37, 19], + [29, 3], + [14, -23], + [-79, -60], + [-28, -62] + ], + [ + [12513, 6817], + [15, -22], + [26, 7], + [10, -36], + [-78, -28], + [-8, 49], + [23, 1], + [12, 29] + ], + [ + [12723, 6817], + [-6, -46], + [-63, -24], + [-56, 11], + [0, 30], + [33, 17], + [26, -25], + [28, 7], + [38, 30] + ], + [ + [14276, 6797], + [-31, 19], + [-23, 30], + [-10, 36], + [54, -59], + [10, -26] + ], + [ + [14178, 6879], + [-27, 15], + [-17, 34], + [2, 14], + [42, -63] + ], + [ + [12123, 6927], + [80, -8], + [10, 34], + [78, -40], + [15, -54], + [63, -15], + [51, -50], + [-47, -31], + [-47, 33], + [-81, 4], + [-40, 15], + [-48, 32], + [-31, 8], + [-18, -10], + [-76, 34], + [-7, 36], + [-39, 6], + [29, 79], + [51, -5], + [51, -39], + [6, -29] + ], + [ + [13219, 6974], + [-21, -57], + [-4, 63], + [16, 58], + [9, -64] + ], + [ + [14108, 6923], + [-12, -8], + [-36, 85], + [14, 28], + [34, -105] + ], + [ + [13944, 7035], + [-73, -70], + [-22, 0], + [-59, 48], + [4, 25], + [37, -12], + [64, 11], + [35, 58], + [-4, 49], + [33, -12], + [-1, -46], + [-14, -51] + ], + [ + [12905, 7203], + [-15, -28], + [-29, 16], + [-9, 36], + [43, 4], + [10, -28] + ], + [ + [13041, 7233], + [15, -63], + [-36, 34], + [-35, 7], + [-52, -2], + [10, 45], + [51, 4], + [47, -25] + ], + [ + [13993, 7116], + [-13, -22], + [-25, 127], + [33, -61], + [5, -44] + ], + [ + [13195, 7395], + [12, -135], + [43, -49], + [35, 88], + [48, 50], + [38, 0], + [67, -59], + [45, -15], + [73, -58], + [77, -47], + [53, -85], + [6, -49], + [70, -51], + [10, -45], + [-38, -8], + [9, -56], + [37, -55], + [28, -88], + [24, 3], + [-2, -37], + [20, -30], + [45, -35], + [-5, -24], + [-28, -6], + [-10, 22], + [-79, 22], + [-56, 99], + [-22, 72], + [-55, 37], + [-61, -51], + [5, -62], + [-33, -28], + [-23, 14], + [-44, 3], + [-37, 68], + [-43, 17], + [-10, -24], + [-53, -2], + [18, 68], + [26, 23], + [-11, 90], + [-20, 70], + [-82, 71], + [-34, 7], + [-63, 76], + [-13, -40], + [-16, -7], + [-9, 66], + [-33, 41], + [72, 51], + [-61, 0], + [-17, 49], + [-38, 16], + [-17, 41], + [56, 20], + [22, 27], + [67, -34], + [7, -31] + ], + [ + [12821, 7609], + [-34, -82], + [-31, -16], + [-41, 16], + [-70, -4], + [-36, -12], + [-6, -63], + [37, -74], + [23, 37], + [56, 2], + [-18, -48], + [-37, -33], + [40, -106], + [-8, -29], + [38, -96], + [0, -55], + [-23, -24], + [-16, 29], + [20, 68], + [-41, -32], + [-5, 55], + [-30, 49], + [3, 81], + [-28, -25], + [5, -216], + [-27, -12], + [-18, 24], + [12, 77], + [-6, 80], + [-18, 1], + [-13, 57], + [17, 54], + [6, 66], + [30, 160], + [36, 62], + [33, -25], + [53, -11], + [48, 3], + [42, 61], + [7, -19] + ], + [ + [12966, 7585], + [-2, -73], + [-22, 9], + [-18, -52], + [-12, 106], + [8, 67], + [42, -23], + [4, -34] + ], + [ + [12005, 7004], + [-46, -2], + [-36, 70], + [-54, 68], + [-49, 118], + [-21, 62], + [-32, 117], + [-37, 69], + [-28, 137], + [-38, 52], + [-22, 71], + [-31, 47], + [-44, 92], + [-4, 42], + [92, -19], + [37, -82], + [56, -91], + [40, -89], + [42, -2], + [36, -57], + [24, -69], + [32, -38], + [-17, -68], + [39, -31], + [7, -58], + [15, -47], + [31, -7], + [20, -53], + [-10, -103], + [-2, -129] + ], + [ + [12512, 7643], + [47, -77], + [-50, -10], + [-14, -57], + [2, -75], + [-41, -57], + [-1, -83], + [-22, -97], + [-48, -38], + [-16, 51], + [-30, 5], + [-21, 26], + [-50, -30], + [-16, 41], + [-62, 5], + [-6, 111], + [-21, 24], + [-20, 71], + [-6, 73], + [5, 77], + [25, 55], + [30, -29], + [33, 16], + [8, 70], + [18, 16], + [51, 18], + [67, 150], + [36, 45], + [32, 58], + [21, 65], + [17, 1], + [22, -42], + [2, -37], + [62, -48], + [-3, -33], + [-28, -4], + [8, -40], + [-31, -29], + [-24, -75], + [31, -79], + [-7, -38] + ], + [ + [12869, 8191], + [6, -102], + [-14, -76], + [-15, 85], + [-20, -42], + [14, -62], + [-12, -39], + [-50, 49], + [-12, 60], + [13, 40], + [-27, 39], + [-13, -35], + [-19, 4], + [-32, -47], + [-7, 25], + [17, 70], + [49, 55], + [15, -38], + [32, 23], + [7, 37], + [30, 2], + [-3, 64], + [34, -39], + [7, -73] + ], + [ + [10972, 8007], + [-37, -19], + [-20, 66], + [-7, 120], + [19, 135], + [29, -47], + [20, -58], + [20, -87], + [-7, -87], + [-17, -23] + ], + [ + [5001, 8332], + [-35, -9], + [4, 64], + [33, 7], + [-2, -62] + ], + [ + [12768, 8346], + [-41, -104], + [-26, 57], + [19, 46], + [5, 52], + [47, 29], + [-4, -80] + ], + [ + [12538, 8266], + [-5, 31], + [25, 58], + [22, 82], + [8, -68], + [-28, -45], + [-22, -58] + ], + [ + [12680, 8481], + [25, -26], + [27, 0], + [-1, -35], + [-19, -35], + [-27, -25], + [1, 81], + [-6, 40] + ], + [ + [12832, 8503], + [12, -93], + [-33, 22], + [12, -79], + [-20, -18], + [-2, 58], + [-13, 4], + [-6, 51], + [24, 25], + [-26, 63], + [40, -2], + [12, -31] + ], + [ + [12665, 8579], + [-11, -72], + [-40, 105], + [36, -3], + [15, -30] + ], + [ + [12656, 9031], + [26, -24], + [24, -93], + [-11, -69], + [-24, -28], + [-7, -67], + [9, -66], + [41, 0], + [53, -46], + [-4, -45], + [13, -20], + [-4, -39], + [-33, 41], + [-26, 13], + [-27, 50], + [-38, -12], + [-21, 18], + [2, 35], + [-25, 58], + [-6, 36], + [15, 53], + [4, 130], + [14, 75], + [25, 0] + ], + [ + [4805, 9008], + [-10, -21], + [-56, -2], + [3, 47], + [56, -7], + [7, -17] + ], + [ + [4330, 8978], + [-12, -14], + [-48, 44], + [23, 25], + [38, -10], + [-1, -45] + ], + [ + [4512, 9145], + [36, -13], + [38, 14], + [44, -49], + [23, 1], + [38, -58], + [-16, -34], + [-20, 18], + [-33, 1], + [-23, -21], + [-21, 9], + [-17, -57], + [-12, 37], + [-28, 14], + [-46, 0], + [-19, -15], + [-23, 26], + [4, 27], + [70, -19], + [-4, 55], + [9, 64] + ], + [ + [12195, 9046], + [-36, -40], + [-35, 25], + [-1, 72], + [21, 38], + [46, 23], + [24, -2], + [9, -32], + [-18, -36], + [-10, -48] + ], + [ + [1027, 9079], + [-16, -2], + [-6, 54], + [12, 45], + [30, -32], + [10, -34], + [-30, -31] + ], + [ + [1005, 9209], + [-14, -6], + [-13, 30], + [19, -1], + [8, -23] + ], + [ + [976, 9254], + [-1, -9], + [-23, 2], + [4, 10], + [20, -3] + ], + [ + [939, 9266], + [-20, -1], + [4, 34], + [16, -33] + ], + [ + [868, 9321], + [-5, -9], + [-15, 16], + [9, 14], + [11, -21] + ], + [ + [4214, 9386], + [16, -31], + [40, 10], + [76, -109], + [39, -16], + [60, -61], + [-5, -19], + [-56, -15], + [-29, 7], + [-60, -8], + [28, 46], + [-17, 22], + [-27, 5], + [-25, 72], + [-24, -4], + [-51, 40], + [-55, 13], + [1, 37], + [-41, 4], + [-30, -43], + [-45, -30], + [14, 63], + [40, 35], + [42, 17], + [69, -7], + [40, -28] + ], + [ + [4304, 9469], + [-37, 67], + [22, 50], + [15, -69], + [0, -48] + ], + [ + [12650, 9388], + [-18, -68], + [-22, 70], + [-5, 62], + [25, 81], + [34, 63], + [19, -24], + [-33, -184] + ], + [ + [4292, 9703], + [-46, -13], + [-3, 31], + [48, 4], + [1, -22] + ], + [ + [4326, 9704], + [-7, -59], + [-8, 11], + [1, 43], + [14, 5] + ], + [ + [13216, 10333], + [5, -28], + [-24, -51], + [-17, 27], + [-21, -19], + [-12, -49], + [-27, 24], + [0, 39], + [24, 50], + [24, -10], + [17, 35], + [31, -18] + ], + [ + [9013, 10460], + [-29, -35], + [5, -23], + [-43, -34], + [-31, 45], + [29, 23], + [31, -1], + [38, 25] + ], + [ + [8556, 10463], + [23, -28], + [33, 4], + [53, -10], + [-5, -24], + [-61, 6], + [-51, 16], + [8, 36] + ], + [ + [8212, 10673], + [-15, -65], + [-2, -69], + [-112, 83], + [6, 42], + [49, -7], + [74, 16] + ], + [ + [7947, 10921], + [26, -59], + [-6, -110], + [-52, -1], + [-2, 101], + [34, 69] + ], + [ + [13482, 10582], + [-16, -66], + [7, -42], + [-21, -58], + [-54, -40], + [-74, -5], + [-60, -95], + [-28, 32], + [-2, 63], + [-73, -19], + [-50, -39], + [-49, -2], + [43, -61], + [-28, -141], + [-27, -35], + [-21, 32], + [11, 75], + [-27, 24], + [-17, 57], + [40, 26], + [22, 52], + [42, 43], + [31, 57], + [83, 25], + [45, -17], + [44, 148], + [28, -40], + [86, 116], + [26, 102], + [-7, 93], + [18, 53], + [44, 15], + [23, -115], + [-1, -68], + [-39, -84], + [1, -86] + ], + [ + [7962, 10999], + [-14, -64], + [-19, 17], + [-10, 56], + [36, 63], + [7, -72] + ], + [ + [13605, 11168], + [30, -18], + [29, 35], + [10, -93], + [-63, -23], + [-36, -83], + [-66, 57], + [-23, -91], + [-47, -1], + [-6, 83], + [21, 64], + [45, 4], + [25, 180], + [49, -86], + [32, -28] + ], + [ + [4886, 11365], + [31, -11], + [3, -37], + [-54, 35], + [20, 13] + ], + [ + [4964, 11578], + [-74, 25], + [30, 25], + [44, -50] + ], + [ + [2373, 11529], + [-21, -12], + [-69, 38], + [-58, 82], + [-43, 15], + [-13, 65], + [109, -40], + [35, -68], + [42, -34], + [18, -46] + ], + [ + [5203, 11710], + [13, -92], + [37, -23], + [19, 21], + [42, -26], + [17, -47], + [18, -96], + [-18, -73], + [-46, 13], + [9, 68], + [-12, 11], + [-44, -31], + [-40, 21], + [-127, -3], + [2, 77], + [35, 50], + [43, 132], + [26, 48], + [56, 25], + [-30, -75] + ], + [ + [1986, 11989], + [41, 7], + [-13, -95], + [-42, 36], + [14, 52] + ], + [ + [13594, 11715], + [42, -148], + [-62, 28], + [-26, -120], + [41, -86], + [-33, -8], + [-27, -64], + [-8, 70], + [5, 81], + [-5, 90], + [10, 63], + [1, 111], + [-24, 82], + [4, 113], + [38, 39], + [28, -85], + [-1, -82], + [17, -84] + ], + [ + [7275, 11841], + [-74, -49], + [-60, 12], + [34, 87], + [-21, 85], + [88, 104], + [36, 3], + [45, -51], + [-23, -57], + [7, -60], + [-32, -74] + ], + [ + [8094, 12120], + [-26, -68], + [-44, 47], + [-6, 35], + [62, 27], + [14, -41] + ], + [ + [1134, 12245], + [-42, -32], + [-28, 61], + [60, 42], + [46, -32], + [-36, -39] + ], + [ + [7434, 12371], + [-45, -90], + [89, 11], + [-11, -68], + [-38, -74], + [44, -5], + [41, -107], + [28, -14], + [38, -128], + [51, -15], + [-5, -54], + [-21, -24], + [16, -43], + [-37, -44], + [-57, 1], + [-71, -23], + [-20, 17], + [-27, -39], + [-39, 9], + [-30, -32], + [-22, 17], + [61, 87], + [-40, 65], + [44, 26], + [-23, 45], + [8, 55], + [63, -8], + [6, 48], + [-29, 53], + [-51, 14], + [-31, 44], + [-3, 80], + [-21, 42], + [15, 86], + [33, 68], + [84, 0] + ], + [ + [606, 12477], + [-26, -12], + [-53, 38], + [75, 6], + [4, -32] + ], + [ + [4231, 12665], + [-16, -44], + [-30, 32], + [46, 12] + ], + [ + [4121, 12711], + [-50, -46], + [-38, 24], + [31, 38], + [57, -16] + ], + [ + [347, 12800], + [52, -8], + [76, -33], + [-35, -26], + [-93, 67] + ], + [ + [3983, 12956], + [54, -46], + [94, -54], + [65, -61], + [-37, -26], + [-66, 20], + [-23, 37], + [-42, -44], + [-60, -43], + [-35, 82], + [20, 142], + [30, -7] + ], + [ + [6951, 13022], + [-10, -54], + [48, -56], + [-55, -64], + [-157, -72], + [-173, 39], + [42, 36], + [-92, 41], + [75, 16], + [-2, 25], + [-88, 19], + [28, 54], + [64, 13], + [65, -57], + [64, 45], + [53, -23], + [68, 44], + [70, -6] + ], + [ + [4374, 13080], + [-47, -4], + [-11, 41], + [18, 46], + [71, -11], + [-31, -72] + ], + [ + [209, 13033], + [19, 40], + [114, -13], + [82, -78], + [-41, -36], + [-69, -8], + [-1, -82], + [-56, -15], + [-88, 54], + [-10, 36], + [-90, 3], + [-23, 29], + [-46, -64], + [0, 332], + [213, -146], + [-4, -52] + ], + [ + [3543, 13243], + [-26, -29], + [-91, 16], + [-57, 37], + [66, 62], + [70, -38], + [38, -48] + ], + [ + [15121, 13387], + [-54, 22], + [54, 34], + [0, -56] + ], + [ + [55, 13392], + [-55, -5], + [0, 56], + [102, -20], + [-47, -31] + ], + [ + [3757, 13275], + [56, -19], + [50, -54], + [-12, -62], + [41, -56], + [43, 60], + [31, 72], + [2, 91], + [122, -18], + [56, -41], + [3, -42], + [-31, -44], + [29, -45], + [-5, -40], + [-82, -58], + [-115, -30], + [-52, -107], + [-49, -56], + [-60, -5], + [-33, -36], + [-3, -54], + [-49, -10], + [-51, -68], + [-46, -93], + [-16, -66], + [-3, -97], + [62, -13], + [39, -142], + [59, 17], + [78, -36], + [72, -71], + [97, -58], + [115, -13], + [-7, -72], + [13, -84], + [30, -93], + [63, -79], + [32, 27], + [23, 86], + [-22, 131], + [-30, 44], + [68, 39], + [47, 58], + [24, 58], + [-4, 56], + [-28, 71], + [-51, 62], + [49, 88], + [-18, 75], + [-14, 130], + [29, 19], + [115, -31], + [35, 22], + [91, -76], + [13, -32], + [75, -7], + [-2, -70], + [14, -105], + [39, -13], + [30, -49], + [61, 46], + [40, 92], + [28, 39], + [33, -74], + [101, -206], + [-17, -53], + [56, -47], + [37, -47], + [67, -22], + [27, -26], + [17, -71], + [33, -11], + [17, -31], + [3, -94], + [-61, -60], + [-69, -30], + [-53, -68], + [-71, -14], + [-90, 18], + [-106, -5], + [-36, -60], + [-53, -37], + [-61, -110], + [143, 115], + [63, 9], + [37, -41], + [-40, -56], + [27, -152], + [55, -42], + [69, 12], + [43, 94], + [2, -61], + [28, -30], + [-52, -54], + [-93, -50], + [-42, -34], + [-47, -60], + [-32, 6], + [-1, 71], + [72, 69], + [-113, -13], + [7, -27], + [-45, -41], + [-88, -53], + [-29, -68], + [7, -116], + [-51, -13], + [-3, -32], + [-59, -25], + [-27, 0], + [-8, -77], + [-38, -77], + [1, -32], + [-28, -38], + [-24, -2], + [1, -79], + [12, -6], + [11, -112], + [-27, -62], + [-43, -24], + [-28, -49], + [-21, -6], + [-27, -58], + [-46, -54], + [-44, -89], + [-6, -59], + [21, -129], + [19, -59], + [0, -36], + [20, -97], + [-3, -88], + [-11, -51], + [-33, 0], + [-23, 55], + [-41, 135], + [-7, 33], + [9, 55], + [-12, 46], + [-33, 70], + [-16, 12], + [-42, -37], + [-28, 43], + [-27, 20], + [-47, -10], + [-37, 9], + [-50, -17], + [8, -85], + [-62, -1], + [-31, 44], + [-37, -10], + [-30, 19], + [-62, -25], + [-38, -62], + [-42, -36], + [-32, -77], + [1, -97], + [8, -29], + [-23, -133], + [-7, -152], + [20, -86], + [8, -64], + [28, -62], + [26, -89], + [45, -22], + [17, -35], + [127, 61], + [27, 34], + [21, 143], + [72, 41], + [63, 4], + [9, -58], + [-23, -49], + [-2, -65], + [-17, -101], + [-12, -15], + [-10, -129], + [-24, -54], + [34, -16], + [21, 16], + [50, -8], + [18, 18], + [43, -1], + [26, -13], + [51, -70], + [-1, -57], + [-10, -28], + [-6, -70], + [3, -59], + [-16, -87], + [19, -82], + [51, -99], + [32, -35], + [20, 6], + [44, 38], + [14, 25], + [64, -30], + [29, -48], + [22, -3], + [32, 58], + [17, 9], + [8, 98], + [24, 38], + [30, 19], + [33, -7], + [49, 61], + [21, 40], + [26, -27], + [-10, -48], + [-24, -9], + [13, -38], + [0, -44], + [-19, -48], + [16, -66], + [18, 5], + [10, 61], + [-13, 29], + [-3, 63], + [53, 34], + [-6, 39], + [15, 26], + [15, -58], + [29, -2], + [28, -46], + [1, -28], + [83, 8], + [24, -37], + [32, -10], + [24, 47], + [102, 6], + [-35, -25], + [14, -39], + [34, -6], + [31, -41], + [7, -67], + [22, 2], + [44, -50], + [43, -99], + [39, -70], + [50, -17], + [39, 21], + [90, -51], + [66, -100], + [10, -46], + [24, -146], + [22, -13], + [2, -58], + [-32, -68], + [13, -26], + [74, -13], + [2, -83], + [32, 55], + [53, -30], + [69, -51], + [21, -49], + [-7, -46], + [49, 26], + [82, -44], + [62, 3], + [62, -69], + [54, -93], + [32, -24], + [36, -4], + [16, -26], + [21, -156], + [-17, -138], + [-21, -54], + [-60, -116], + [-26, -94], + [-31, -72], + [-11, -2], + [-12, -61], + [3, -156], + [-16, -183], + [-13, -33], + [-8, -111], + [-42, -109], + [-7, -86], + [-34, -36], + [-10, -50], + [-46, 0], + [-66, -32], + [-29, -37], + [-47, -24], + [-50, -66], + [-35, -83], + [-7, -62], + [7, -46], + [-17, -125], + [-29, -45], + [-47, -147], + [-65, -105], + [-20, -79], + [-27, -48], + [-19, -52], + [-47, -46], + [-31, 16], + [-23, -9], + [-39, 36], + [-56, 0], + [53, -71], + [-6, -58], + [26, -36], + [-2, -40], + [-40, -107], + [-62, -45], + [-85, -17], + [-46, 8], + [9, -49], + [-9, -63], + [8, -42], + [-25, -29], + [-43, -11], + [-40, 30], + [-17, -22], + [6, -83], + [29, -25], + [23, 27], + [12, -44], + [-39, -26], + [-33, -51], + [-16, -129], + [-40, 0], + [-33, -42], + [-12, -63], + [41, -61], + [40, -17], + [-14, -74], + [-50, -47], + [-27, -98], + [-38, -33], + [-18, -39], + [14, -86], + [28, -48], + [-55, 5], + [-58, -51], + [-7, -78], + [-65, 25], + [-48, 58], + [-52, 48], + [-14, 53], + [12, 48], + [-21, 56], + [-5, 142], + [18, 80], + [44, 64], + [-64, 24], + [40, 74], + [15, 138], + [46, -29], + [22, 172], + [-28, 22], + [-13, -103], + [-27, 11], + [28, 273], + [19, 57], + [-12, 82], + [-3, 93], + [17, 3], + [26, 134], + [29, 134], + [18, 124], + [-10, 124], + [13, 69], + [-5, 103], + [24, 101], + [8, 161], + [13, 173], + [13, 186], + [-3, 137], + [-8, 117], + [-42, 48], + [-4, 34], + [-83, 83], + [-76, 91], + [-32, 52], + [-17, 68], + [6, 24], + [-35, 110], + [-42, 153], + [-39, 166], + [-17, 38], + [-14, 61], + [-32, 54], + [-30, 34], + [13, 37], + [-20, 80], + [13, 58], + [34, 53], + [22, 62], + [-25, -3], + [-25, 37], + [8, 23], + [-7, 76], + [15, 13], + [23, 105], + [-3, 34], + [52, 51], + [10, 32], + [8, 72], + [21, 5], + [34, 96], + [-16, 20], + [8, 49], + [-9, 76], + [9, 21], + [-7, 71], + [-31, 68], + [-17, 101], + [-21, 23], + [-57, -76], + [20, -45], + [-37, -27], + [-35, 74], + [-28, 15], + [-24, -5], + [-32, 36], + [4, 32], + [-43, 47], + [-19, -5], + [-29, 49], + [3, 79], + [-43, 88], + [-49, 83], + [-24, 2], + [-56, 29], + [-33, 33], + [-27, 1], + [-41, 51], + [-48, 90], + [-56, 48], + [-23, -6], + [-55, -39], + [-61, 38], + [-40, 38], + [-31, 11], + [-48, 39], + [-45, 62], + [-67, 31], + [-17, 38], + [-45, 48], + [-32, 93], + [20, 53], + [-32, 141], + [-37, 83], + [-42, 65], + [-21, 52], + [-43, 54], + [6, 52], + [-46, 60], + [-11, 58], + [-22, 7], + [-44, 84], + [-40, 152], + [1, 32], + [-30, 33], + [-38, 20], + [-7, -34], + [11, -103], + [72, -144], + [8, -54], + [48, -93], + [14, -77], + [24, -76], + [3, -44], + [20, -2], + [32, -75], + [-26, -45], + [-11, 50], + [-28, 48], + [-51, 61], + [-5, 106], + [-49, 63], + [-42, 31], + [-5, 50], + [16, 31], + [1, 38], + [-32, 59], + [-25, 23], + [-50, 173], + [-24, 118], + [-52, 81], + [-38, 27], + [-39, 8], + [-16, 59], + [-41, 84], + [-52, 162], + [-32, 70], + [-6, 68], + [-23, 45], + [10, 69], + [-2, 72], + [-13, 64], + [16, 78], + [10, 151], + [-7, 112], + [-26, 110], + [5, 16], + [61, -29], + [26, 12], + [-20, 69], + [-111, 117], + [-76, 35], + [-24, 73], + [6, 52], + [-53, 35], + [-8, 67], + [-50, 60], + [-1, 43], + [-60, 58], + [-12, 73], + [-55, 67], + [-22, 79], + [-107, 7], + [-49, 24], + [-87, 86], + [-114, 46], + [-58, -7], + [-83, 38], + [-50, 36], + [-46, -18], + [8, -58], + [-71, -23], + [-84, -45], + [-8, 130], + [-28, -55], + [-61, -59], + [31, -41], + [-40, -59], + [-87, -61], + [-10, -36], + [-66, -43], + [-13, -39], + [-49, -36], + [-29, 6], + [-117, -79], + [-72, -24], + [-7, 14], + [88, 65], + [44, 45], + [52, 10], + [21, 34], + [99, 96], + [7, 63], + [21, 49], + [-84, -41], + [-55, 54], + [-68, -34], + [4, 80], + [-27, 30], + [-54, -16], + [-65, 59], + [0, 47], + [-32, 36], + [65, 137], + [63, -7], + [34, 40], + [63, 18], + [-8, 38], + [-63, 28], + [-105, -9], + [-62, 20], + [-71, 82], + [153, 75], + [29, -41], + [89, 3], + [-35, 52], + [-51, 31], + [-70, 77], + [-58, 27], + [23, 43], + [75, 3], + [53, 38], + [53, 80], + [120, 46], + [39, -5], + [65, 44], + [181, -63], + [107, -6], + [88, -26], + [113, -19], + [56, 14], + [64, -25], + [124, -32], + [66, -40], + [44, -7], + [88, 60], + [62, -10], + [132, 57], + [29, -34], + [69, 50], + [71, -75], + [62, -7], + [118, 33], + [65, -35], + [156, -44], + [41, 5], + [56, -42], + [-59, -41], + [76, -18], + [114, 10], + [35, 14], + [45, -50], + [46, 42], + [-43, 36], + [27, 28], + [85, 12], + [76, -65], + [47, 7], + [74, -38], + [127, 12], + [-5, 51], + [37, 15], + [92, -41], + [33, -2], + [19, 84], + [-94, 85], + [4, 92], + [49, 60], + [98, -50], + [57, -94], + [-37, -41], + [78, -17] + ], + [ + [2765, 13577], + [73, -14], + [58, -42], + [48, 43], + [101, 23], + [88, -47], + [40, -140], + [146, -81], + [-5, -36], + [-56, -70], + [-148, 36], + [-128, -33], + [-181, -21], + [-23, 40], + [-94, 13], + [-52, 66], + [93, 23], + [32, 30], + [-149, -5], + [-22, 31], + [33, 32], + [-74, 22], + [65, 95], + [112, 51], + [43, -16] + ], + [ + [3171, 13602], + [-37, -55], + [-65, 58], + [102, -3] + ], + [ + [4354, 13576], + [4, -23], + [-148, -2], + [-47, 44], + [22, 35], + [97, -9], + [72, -45] + ], + [ + [3925, 13580], + [178, 49], + [72, -86], + [-6, -54], + [83, 24], + [40, 33], + [151, -82], + [5, -36], + [78, 19], + [44, -53], + [101, -33], + [37, -34], + [40, -77], + [-78, -39], + [99, -55], + [67, -18], + [60, -76], + [67, -6], + [-14, -58], + [-73, -97], + [-52, 36], + [-66, 80], + [-54, -11], + [-6, -47], + [45, -49], + [74, -60], + [27, -83], + [-14, -59], + [-53, 22], + [-106, 67], + [104, -122], + [6, -29], + [-114, 33], + [-90, 48], + [-51, 41], + [15, 23], + [-124, 83], + [1, -24], + [-122, -13], + [-35, 29], + [28, 61], + [165, 12], + [-14, 30], + [69, 122], + [-28, 66], + [-64, 40], + [-103, 101], + [-92, 9], + [-77, -11], + [-152, 18], + [-157, 37], + [-35, 30], + [-29, 122], + [32, 75], + [43, 34], + [109, 22], + [-31, -54] + ], + [ + [3345, 13637], + [136, -31], + [-39, -40], + [64, -36], + [-8, -75], + [-69, -32], + [-174, 103], + [87, 16], + [-46, 55], + [49, 40] + ], + [ + [13592, 13585], + [-150, 8], + [86, 45], + [64, -53] + ], + [ + [3646, 13548], + [-45, -62], + [-48, 3], + [-26, 73], + [22, 77], + [42, 22], + [168, -23], + [-63, -74], + [-50, -16] + ], + [ + [2501, 13434], + [-111, -42], + [-22, 37], + [-97, 44], + [84, 151], + [-41, 51], + [142, 13], + [60, -18], + [107, -4], + [86, -59], + [-156, -80], + [-52, -58], + [0, -35] + ], + [ + [13892, 13740], + [-49, -32], + [-145, 40], + [10, 27], + [184, -35] + ], + [ + [3629, 13732], + [-23, -32], + [-112, 27], + [83, 60], + [52, -55] + ], + [ + [13655, 13780], + [-33, -62], + [-155, 3], + [-70, -20], + [-83, 54], + [22, 57], + [167, 12], + [152, -44] + ], + [ + [3423, 13877], + [32, -39], + [-17, -105], + [-115, 5], + [-25, 104], + [125, 35] + ], + [ + [3015, 13833], + [98, -19], + [-18, -80], + [-142, -13], + [-106, -36], + [-231, 67], + [97, 105], + [118, -29], + [75, -49], + [73, -6], + [-60, 79], + [96, -19] + ], + [ + [9977, 13377], + [-162, 4], + [-11, 37], + [-76, 22], + [-6, 45], + [43, 18], + [-2, 45], + [84, 71], + [-39, 10], + [101, 73], + [-12, 38], + [233, 98], + [140, 15], + [153, 42], + [1, -59], + [-277, -81], + [-130, -79], + [-129, -161], + [9, -69], + [80, -69] + ], + [ + [3584, 13908], + [129, -27], + [27, -58], + [74, -39], + [118, -10], + [67, 18], + [154, 1], + [54, -66], + [-89, -40], + [-53, 10], + [-207, -14], + [-179, 37], + [-20, 87], + [-42, 36], + [-136, 36], + [103, 29] + ], + [ + [2680, 13954], + [-6, -64], + [-150, -69], + [-124, 5], + [158, 117], + [122, 11] + ], + [ + [12054, 13898], + [49, -21], + [123, -1], + [128, -72], + [-10, -43], + [-188, -96], + [192, -49], + [67, 14], + [134, -14], + [11, -39], + [175, -12], + [3, 63], + [156, -14], + [68, -44], + [19, -53], + [-25, -35], + [53, -65], + [66, -34], + [41, 87], + [67, -37], + [71, 22], + [82, -26], + [31, 24], + [68, -12], + [-30, 77], + [56, 36], + [379, -54], + [36, -49], + [110, -64], + [169, 16], + [84, -14], + [35, -34], + [-5, -61], + [51, -24], + [131, 20], + [79, -17], + [80, 10], + [73, -74], + [52, 26], + [-34, 53], + [19, 37], + [134, -23], + [87, 5], + [121, -40], + [59, -36], + [0, -332], + [-54, -37], + [-17, -38], + [45, -91], + [-6, -56], + [-79, 18], + [-117, -63], + [-37, -9], + [-126, -110], + [-15, -38], + [-60, 58], + [-110, -66], + [-19, 31], + [-40, -35], + [-56, 11], + [-14, -55], + [-50, -80], + [1, -34], + [48, -19], + [-6, -121], + [-39, -3], + [-18, -69], + [18, -36], + [-74, -43], + [-14, -95], + [-63, -20], + [-12, -85], + [-61, -77], + [-15, 57], + [-18, 122], + [-24, 184], + [20, 116], + [36, 50], + [2, 39], + [65, 18], + [148, 190], + [75, 67], + [34, 117], + [-51, -7], + [-25, -68], + [-107, -92], + [-34, 103], + [-109, -29], + [-105, -139], + [35, -51], + [-159, -31], + [3, 61], + [-65, 12], + [-52, -41], + [-129, 15], + [-138, -25], + [-136, -162], + [-161, -197], + [66, -10], + [21, -52], + [41, -19], + [27, 42], + [46, -6], + [60, -91], + [2, -71], + [-33, -83], + [-4, -100], + [-19, -133], + [-63, -120], + [-14, -58], + [-57, -97], + [-84, -145], + [-56, -49], + [-26, -1], + [-26, 41], + [-79, -84], + [-31, -56], + [1, -60], + [-45, -58], + [-46, -36], + [-1, -36], + [36, -59], + [36, -98], + [10, -54], + [1, -96], + [-16, -46], + [-38, -16], + [-34, -35], + [-38, -7], + [-4, 46], + [7, 62], + [-18, 87], + [31, 14], + [-29, 71], + [-25, 0], + [-36, 30], + [28, 106], + [-47, 45], + [-59, -24], + [-31, -39], + [-31, 49], + [33, 55], + [-22, 44], + [-37, -29], + [-47, -58], + [-26, -54], + [-41, -4], + [-22, -39], + [22, -56], + [35, -14], + [1, -37], + [33, -24], + [47, 59], + [38, -32], + [27, -3], + [7, -43], + [-60, -23], + [-19, -45], + [-41, -42], + [-22, -58], + [45, -46], + [17, -82], + [25, -76], + [29, -64], + [-1, -62], + [-26, -23], + [10, -44], + [25, -26], + [-17, -134], + [-24, -7], + [-65, -200], + [-39, -99], + [-57, -77], + [-59, -70], + [-47, -9], + [-26, -37], + [-14, 27], + [-24, -42], + [-59, -41], + [-44, -13], + [-15, -88], + [-23, -5], + [-11, 61], + [10, 32], + [-56, 26], + [-20, -13], + [-56, -71], + [-35, -79], + [-9, -58], + [71, -196], + [38, -52], + [26, -67], + [19, -154], + [-6, -146], + [-35, -55], + [-48, -53], + [-34, -70], + [-53, -77], + [-15, 53], + [12, 57], + [-31, 47], + [-35, 12], + [-17, 43], + [-22, 86], + [-37, 39], + [-36, -2], + [6, 65], + [-37, 0], + [-3, -92], + [-37, -195], + [3, -60], + [27, -3], + [18, -76], + [7, -72], + [24, -47], + [25, -10], + [56, -101], + [18, -56], + [-2, -94], + [7, -78], + [15, -23], + [16, -73], + [-1, -28], + [-29, -6], + [-40, 62], + [-50, 66], + [-5, 42], + [-24, 56], + [-6, 69], + [-15, 45], + [5, 61], + [-26, 67], + [-7, 41], + [-43, 87], + [-15, -3], + [17, 132], + [-4, 62], + [13, 63], + [-14, 50], + [3, 90], + [-17, 43], + [-14, 100], + [-7, 105], + [-18, 69], + [-76, -101], + [-49, 27], + [14, 103], + [-9, 78], + [-33, 96], + [-49, 108], + [-12, 44], + [-10, 82], + [-18, 49], + [-38, 3], + [3, -34], + [-13, -47], + [-52, 19], + [-6, -31], + [-28, 1], + [-52, -17], + [2, -63], + [-22, -49], + [-61, -56], + [-47, -98], + [-31, -52], + [-42, -55], + [0, -38], + [-59, -50], + [-20, -5], + [-12, -63], + [11, -177], + [-18, -80], + [0, -141], + [-22, -4], + [-19, -63], + [13, -28], + [-39, -24], + [-14, -56], + [-17, -24], + [-39, 78], + [-36, 200], + [-37, 120], + [-18, 156], + [-38, 114], + [-30, 268], + [0, 101], + [-8, 77], + [-61, -49], + [-30, 10], + [-54, 101], + [20, 30], + [-13, 32], + [-49, 71], + [-31, 21], + [-12, 60], + [-33, 63], + [-77, -15], + [-68, -2], + [-59, -12], + [-79, 25], + [-94, 30], + [-18, 102], + [-20, 15], + [-32, -15], + [-42, -40], + [-52, 28], + [-42, 64], + [-40, 23], + [-29, 79], + [-31, 111], + [-22, -13], + [-27, 27], + [-16, -32], + [-24, 4], + [5, -56], + [30, -134], + [56, -84], + [-2, -62], + [18, -51], + [20, 57], + [24, -18], + [-8, -97], + [17, -51], + [33, 13], + [60, -4], + [60, 109], + [35, 23], + [5, -65], + [19, -57], + [24, -31], + [55, -26], + [46, -104], + [-22, -73], + [-18, -27], + [-16, -57], + [-19, 5], + [-15, -62], + [5, -56], + [-50, -41], + [-13, -58], + [-27, 1], + [-16, -21], + [0, -34], + [-20, -23], + [-23, 8], + [-28, -28], + [-50, -27], + [-9, -66], + [-42, -35], + [-67, -39], + [-38, -58], + [-31, 0], + [-24, -35], + [-27, -16], + [-46, -9], + [-27, -49], + [-63, -5], + [-11, 48], + [-22, 208], + [-2, 88], + [-16, 58], + [-22, 30], + [-22, 70], + [-12, 68], + [-29, 57], + [-19, 14], + [-28, 79], + [-3, 107], + [-24, 93], + [-42, 49], + [-23, 110], + [-76, 205], + [-21, -1], + [-30, -34], + [-24, 5], + [32, -130], + [29, -92], + [38, -93], + [-7, -68], + [56, -92], + [14, -82], + [-10, -15], + [6, -85], + [16, -100], + [39, -51], + [24, -96], + [12, -77], + [23, -40], + [57, -79], + [59, -124], + [31, -51], + [-1, -34], + [-24, -20], + [31, -38], + [28, -70], + [20, 0], + [40, 21], + [46, 10], + [73, 47], + [37, 4], + [42, 21], + [35, 29], + [-2, -115], + [-21, -120], + [-46, -200], + [-36, -122], + [-36, -93], + [-50, -113], + [-42, -68], + [-63, -82], + [-39, -64], + [-46, -101], + [-19, -63], + [-55, -74], + [-6, -59], + [-14, -33], + [-8, -56], + [-17, -27], + [-19, -103], + [2, -47], + [27, -30], + [-10, -72], + [-1, -65], + [32, -135], + [23, -55], + [-2, -83], + [5, -73], + [2, -130], + [7, -41], + [-29, -117], + [-26, -52], + [-86, -72], + [-48, -89], + [-16, -15], + [-46, -79], + [-4, -59], + [36, -133], + [-4, -169], + [-18, -29], + [-85, -74], + [-18, -30], + [14, -41], + [-19, -174], + [-11, -37], + [-37, -54], + [-53, -145], + [-77, -136], + [-32, -38], + [-71, -59], + [-25, 12], + [-21, -16], + [-45, 16], + [-43, -6], + [-44, -32], + [-36, -14], + [-45, -33], + [-32, 31], + [-25, 48], + [0, 49], + [-14, 56], + [14, 15], + [-1, 64], + [-28, 78], + [-51, 178], + [-31, 63], + [-17, 61], + [-19, 141], + [-14, 129], + [-1, 99], + [-6, 46], + [-38, 103], + [-31, 152], + [-34, 81], + [-7, 116], + [6, 73], + [17, 112], + [24, 109], + [37, 92], + [2, 109], + [-12, 30], + [-22, 100], + [15, 50], + [-21, 136], + [-34, 158], + [-35, 88], + [-43, 84], + [-27, 68], + [-26, 86], + [29, 177], + [-8, 13], + [21, 159], + [-16, 55], + [-20, 14], + [-18, 72], + [-76, -44], + [-34, 2], + [-22, 52], + [-14, 60], + [-30, 55], + [-68, -1], + [-69, -28], + [-66, -48], + [-23, -29], + [-38, -24], + [-37, 24], + [-49, 15], + [-77, -15], + [-70, -55], + [-19, 2], + [-44, 39], + [-38, 64], + [-36, 45], + [-28, 54], + [-42, 39], + [-21, 45], + [-13, 92], + [-35, 82], + [-21, 27], + [-11, 55], + [-34, 49], + [-18, 5], + [-22, 54], + [-10, 82], + [5, 37], + [-17, 64], + [-2, 46], + [30, 101], + [-4, 45], + [12, 41], + [5, 78], + [-9, 124], + [4, 41], + [-11, 40], + [-22, 36], + [4, 74], + [29, 66], + [-2, 28], + [14, 59], + [38, 66], + [12, 93], + [15, 51], + [28, 31], + [27, 85], + [21, 33], + [40, 9], + [54, 79], + [35, 69], + [-11, 104], + [22, 115], + [27, 57], + [73, 72], + [41, 137], + [31, 0], + [26, -35], + [40, 5], + [61, -19], + [41, 46], + [45, 14], + [27, 34], + [40, 26], + [141, 21], + [21, -12], + [40, 33], + [44, 0], + [17, -19], + [29, 5], + [46, 34], + [29, -10], + [-1, -42], + [18, -27], + [14, -59], + [-6, -72], + [-27, -42], + [8, -45], + [22, -1], + [10, -40], + [65, -42], + [53, -6], + [56, -38], + [20, -73], + [96, -51], + [45, -42], + [41, 60], + [-10, 64], + [13, 40], + [30, 39], + [29, 12], + [57, -17], + [15, -38], + [70, -24], + [10, -27], + [56, 1], + [102, -60], + [50, 51], + [37, 6], + [84, -44], + [33, -5], + [21, 21], + [20, 71], + [9, 63], + [22, 90], + [22, 62], + [-4, 63], + [10, 34], + [-25, 62], + [-35, 20], + [-29, -48], + [-64, -10], + [-34, 45], + [-45, 3], + [-10, -35], + [-29, -10], + [-41, 45], + [-45, -2], + [-25, 83], + [-31, 46], + [20, 65], + [-26, 40], + [46, 79], + [65, 4], + [18, 63], + [80, -11], + [50, 54], + [49, 23], + [70, 2], + [73, -59], + [60, -32], + [49, 13], + [36, -7], + [50, 43], + [6, 36], + [-10, 56], + [-48, 41], + [-69, 96], + [-48, 31], + [-36, 49], + [31, 13], + [34, 70], + [-23, 33], + [62, 34], + [-1, 18], + [-72, -20], + [-27, -27], + [-40, -5], + [-36, -31], + [2, -51], + [56, -45], + [-46, -15], + [-57, -48], + [-24, 17], + [10, 39], + [-46, 25], + [47, 43], + [-12, 19], + [-65, 21], + [-3, 31], + [-39, -10], + [-48, -107], + [-32, -32], + [-12, -100], + [-22, -35], + [-15, -59], + [18, -80], + [29, -47], + [-49, -4], + [-53, -71], + [-13, 56], + [-48, 10], + [-50, -22], + [29, -46], + [-45, -14], + [-21, -25], + [21, -39], + [-16, -18], + [45, -63], + [0, -47], + [-53, -29], + [16, -73], + [-28, -2], + [-34, 37], + [-23, 122], + [-38, 85], + [-11, 48], + [-23, 28], + [-4, 40], + [9, 82], + [-27, 47], + [-121, 102], + [-35, 61], + [-12, 70], + [-74, 55], + [-34, -30], + [-2, -65], + [13, -42], + [40, -42], + [21, -69], + [47, -67], + [32, 1], + [-1, -35], + [68, -56], + [10, -50], + [-37, 14], + [-18, -54], + [31, -31], + [-45, -119], + [0, 81], + [-29, 90], + [-30, 47], + [-27, 15], + [-18, 33], + [-31, 6], + [-33, 37], + [-67, 102], + [-13, 83], + [-55, 37], + [-99, -103], + [-83, 22], + [-61, -27], + [-3, -98], + [-40, -56], + [-53, -17], + [-30, -74], + [-16, -68], + [16, -48], + [-24, -37], + [-9, -54], + [-32, -17], + [-30, -64], + [-93, 1], + [-42, -61], + [-21, 7], + [-27, 76], + [-40, 13], + [-16, -22], + [-44, 3], + [6, 65], + [-4, 51], + [-29, 39], + [4, 55], + [16, 30], + [12, 84], + [-9, 65], + [0, 87], + [-17, 36], + [59, 60], + [52, -15], + [56, 1], + [45, -14], + [103, 1], + [21, 50], + [8, 166], + [-43, 87], + [-31, 42], + [-64, 32], + [-4, 61], + [54, 18], + [71, -21], + [-14, 94], + [40, -36], + [98, 65], + [12, 68], + [71, 34], + [21, 22], + [37, 123], + [58, 35], + [35, -3], + [79, 45], + [-11, 79], + [-17, 46], + [-2, 85], + [19, 47], + [37, 6], + [35, -24], + [5, -58], + [-30, -60], + [12, -73], + [85, -33], + [23, 23], + [68, -60], + [28, 25], + [119, 66], + [85, -35], + [10, 37], + [58, 27], + [-8, 132], + [21, 53], + [40, 28], + [33, -62], + [34, 1], + [13, 113], + [-43, 19], + [-3, 48], + [106, 36], + [89, -12], + [48, 46], + [-44, 40], + [-77, -7], + [-74, -30], + [-68, -18], + [-24, 46], + [-41, 27], + [9, 82], + [-20, 75], + [58, 101], + [124, 107], + [-4, 36], + [-58, 39], + [-73, -24], + [-40, -58], + [6, -51], + [-67, -67], + [-81, -71], + [-30, -117], + [29, -59], + [41, -46], + [-39, -94], + [-44, -20], + [-16, -139], + [-24, -78], + [-50, 8], + [-24, -66], + [-49, -4], + [-13, 79], + [-35, 94], + [-32, 118], + [-28, 51], + [-83, -96], + [-56, -20], + [-59, 42], + [-15, 90], + [-13, 192], + [39, 54], + [111, 69], + [83, 86], + [77, 116], + [101, 161], + [185, 167], + [92, 37], + [70, -5], + [64, 69], + [76, -4], + [76, 17], + [131, -61], + [-54, -22], + [46, -53], + [43, 29], + [69, -50], + [115, -20], + [159, -94], + [32, -39], + [3, -56], + [-47, -43], + [-68, -23], + [-188, 64], + [-31, -11], + [69, -61], + [5, -124], + [87, -47], + [6, 41], + [-27, 37], + [28, 30], + [102, -52], + [35, 21], + [-28, 60], + [98, 82], + [78, -34], + [24, 57], + [-35, 50], + [21, 50], + [-31, 51], + [117, -26], + [24, -47], + [-53, -10], + [0, -47], + [33, -28], + [65, 18], + [10, 53], + [88, 40], + [147, 71], + [-10, -54], + [52, -9], + [30, 28], + [79, 3], + [62, 34], + [48, -50], + [48, 55], + [-44, 48], + [22, 28], + [124, -25], + [210, -122], + [28, 44], + [-94, 70], + [14, 39], + [-24, 92], + [77, 75], + [28, 76], + [31, 16], + [111, -22], + [9, -46], + [-40, -67], + [40, -85], + [-10, -114], + [47, -51], + [-18, -56], + [-83, -118], + [48, -12], + [63, 51], + [48, 81], + [-25, 47], + [20, 55], + [-46, 7], + [-10, 46], + [34, 84], + [-55, 68], + [108, 71], + [167, 1], + [40, 22], + [-4, 89], + [73, 17], + [101, -4], + [91, 11], + [-34, 43], + [49, 55], + [130, 44], + [111, 11], + [14, 23], + [110, 7], + [34, -18], + [95, 44], + [77, -2], + [51, 72], + [100, 34], + [110, -60] + ], + [ + [9623, 10927], + [22, -59], + [-17, -127], + [-15, -19], + [14, -103], + [40, -17], + [29, -42], + [60, -14], + [65, 22], + [-3, 78], + [6, 87], + [-33, 28], + [11, 57], + [-28, 5], + [9, 70], + [40, -20], + [37, 26], + [-31, 50], + [-12, 48], + [-34, -21], + [-17, 77], + [-49, 28], + [-19, 75], + [16, 40], + [2, 61], + [36, 13], + [36, -12], + [8, 81], + [-8, 52], + [-42, -4], + [-35, 20], + [-49, -37], + [-39, -17], + [-19, -49], + [-41, -14], + [-42, -86], + [38, -79], + [-4, -56], + [68, -142] + ], + [ + [3619, 13943], + [-98, 3], + [-11, 23], + [84, -1], + [25, -25] + ], + [ + [2932, 13958], + [-78, -24], + [-62, 27], + [34, 26], + [106, -29] + ], + [ + [8599, 13971], + [-94, -34], + [-74, 19], + [4, 48], + [87, 17], + [77, -50] + ], + [ + [2954, 14033], + [-121, -16], + [44, 37], + [77, -21] + ], + [ + [3535, 13988], + [-96, 2], + [-21, 66], + [129, -38], + [-12, -30] + ], + [ + [3358, 14010], + [-53, -25], + [-172, 75], + [-3, 31], + [196, -41], + [32, -40] + ], + [ + [11974, 14009], + [-237, -32], + [77, 109], + [66, 4], + [106, -47], + [-12, -34] + ], + [ + [8327, 14125], + [138, -62], + [-105, -33], + [-60, -77], + [-20, -69], + [-51, -3], + [-90, 51], + [-25, 53], + [-82, 70], + [-33, 66], + [115, 29], + [160, 4], + [53, -29] + ], + [ + [8629, 14184], + [83, -30], + [-63, -45], + [-121, -9], + [-124, 14], + [-114, 62], + [233, 28], + [106, -20] + ], + [ + [9708, 14195], + [-194, -25], + [12, 44], + [182, -19] + ], + [ + [11758, 14056], + [-91, -10], + [-187, 56], + [-32, 60], + [-58, 16], + [200, 76], + [179, -123], + [-11, -75] + ], + [ + [3905, 14121], + [51, -27], + [-135, -87], + [-162, 5], + [-44, 64], + [-117, 87], + [83, 87], + [98, 4], + [54, -44], + [139, -34], + [33, -55] + ], + [ + [4683, 14408], + [203, -17], + [75, -45], + [-390, -213], + [-212, -65], + [35, -41], + [-184, -110], + [79, -36], + [-112, -50], + [-110, 23], + [-123, -12], + [-142, 14], + [-6, 40], + [78, 19], + [-21, 60], + [47, 71], + [86, 49], + [-105, 98], + [-74, 28], + [-93, 86], + [194, 32], + [321, 71], + [454, -2] + ], + [ + [6422, 14443], + [263, -66], + [-78, -32], + [-217, -18], + [304, -50], + [204, 32], + [126, -16], + [24, -36], + [-232, -97], + [-83, -114], + [1, -93], + [51, -54], + [-135, -30], + [77, -44], + [10, -71], + [-45, -8], + [55, -71], + [-59, -69], + [-117, -14], + [52, -56], + [-47, -46], + [55, -50], + [16, -67], + [-75, -17], + [-70, 24], + [-49, -44], + [169, -8], + [-113, -72], + [-114, -66], + [-123, -29], + [-46, 0], + [-44, -32], + [-58, -88], + [-90, -58], + [-146, -44], + [-36, -51], + [0, -59], + [-22, -54], + [-68, -67], + [17, -65], + [-41, -150], + [-59, -5], + [-62, 68], + [-84, 0], + [-40, 46], + [-28, 81], + [-73, 104], + [-22, 54], + [-5, 75], + [-58, 77], + [15, 61], + [-28, 29], + [41, 98], + [63, 31], + [26, 99], + [-109, -53], + [-51, 27], + [13, 101], + [125, -21], + [-110, 81], + [-77, 9], + [47, 78], + [-25, 31], + [-84, 145], + [-54, 33], + [1, 34], + [-113, 49], + [-304, -3], + [-122, 79], + [111, 26], + [-190, 60], + [6, 32], + [312, 80], + [17, 30], + [-114, 30], + [182, 92], + [44, 46], + [229, 35], + [129, 1], + [309, 35], + [141, 50], + [201, 27], + [484, -2] + ] + ], + "transform": { + "scale": [0.02380794920970836, 0.012014472135687088], + "translate": [-180, -90.00000000000003] + }, + "objects": { + "land": { + "type": "GeometryCollection", + "geometries": [ + { "arcs": [[0]], "type": "Polygon" }, + { "arcs": [[1]], "type": "Polygon" }, + { "arcs": [[2]], "type": "Polygon" }, + { "arcs": [[3]], "type": "Polygon" }, + { "arcs": [[4]], "type": "Polygon" }, + { "arcs": [[5]], "type": "Polygon" }, + { "arcs": [[6]], "type": "Polygon" }, + { "arcs": [[7]], "type": "Polygon" }, + { "arcs": [[8]], "type": "Polygon" }, + { "arcs": [[9]], "type": "Polygon" }, + { "arcs": [[10]], "type": "Polygon" }, + { "arcs": [[11]], "type": "Polygon" }, + { "arcs": [[12]], "type": "Polygon" }, + { "arcs": [[13]], "type": "Polygon" }, + { "arcs": [[14]], "type": "Polygon" }, + { "arcs": [[15]], "type": "Polygon" }, + { "arcs": [[16]], "type": "Polygon" }, + { "arcs": [[17]], "type": "Polygon" }, + { "arcs": [[18]], "type": "Polygon" }, + { "arcs": [[19]], "type": "Polygon" }, + { "arcs": [[20]], "type": "Polygon" }, + { "arcs": [[21]], "type": "Polygon" }, + { "arcs": [[22]], "type": "Polygon" }, + { "arcs": [[23]], "type": "Polygon" }, + { "arcs": [[24]], "type": "Polygon" }, + { "arcs": [[25]], "type": "Polygon" }, + { "arcs": [[26]], "type": "Polygon" }, + { "arcs": [[27]], "type": "Polygon" }, + { "arcs": [[28]], "type": "Polygon" }, + { "arcs": [[29]], "type": "Polygon" }, + { "arcs": [[30]], "type": "Polygon" }, + { "arcs": [[31]], "type": "Polygon" }, + { "arcs": [[32]], "type": "Polygon" }, + { "arcs": [[33]], "type": "Polygon" }, + { "arcs": [[34]], "type": "Polygon" }, + { "arcs": [[35]], "type": "Polygon" }, + { "arcs": [[36]], "type": "Polygon" }, + { "arcs": [[37]], "type": "Polygon" }, + { "arcs": [[38]], "type": "Polygon" }, + { "arcs": [[39]], "type": "Polygon" }, + { "arcs": [[40]], "type": "Polygon" }, + { "arcs": [[41]], "type": "Polygon" }, + { "arcs": [[42]], "type": "Polygon" }, + { "arcs": [[43]], "type": "Polygon" }, + { "arcs": [[44]], "type": "Polygon" }, + { "arcs": [[45]], "type": "Polygon" }, + { "arcs": [[46]], "type": "Polygon" }, + { "arcs": [[47]], "type": "Polygon" }, + { "arcs": [[48]], "type": "Polygon" }, + { "arcs": [[49]], "type": "Polygon" }, + { "arcs": [[50]], "type": "Polygon" }, + { "arcs": [[51]], "type": "Polygon" }, + { "arcs": [[52]], "type": "Polygon" }, + { "arcs": [[53]], "type": "Polygon" }, + { "arcs": [[54]], "type": "Polygon" }, + { "arcs": [[55]], "type": "Polygon" }, + { "arcs": [[56]], "type": "Polygon" }, + { "arcs": [[57]], "type": "Polygon" }, + { "arcs": [[58]], "type": "Polygon" }, + { "arcs": [[59]], "type": "Polygon" }, + { "arcs": [[60]], "type": "Polygon" }, + { "arcs": [[61]], "type": "Polygon" }, + { "arcs": [[62]], "type": "Polygon" }, + { "arcs": [[63]], "type": "Polygon" }, + { "arcs": [[64]], "type": "Polygon" }, + { "arcs": [[65]], "type": "Polygon" }, + { "arcs": [[66]], "type": "Polygon" }, + { "arcs": [[67]], "type": "Polygon" }, + { "arcs": [[68]], "type": "Polygon" }, + { "arcs": [[69]], "type": "Polygon" }, + { "arcs": [[70]], "type": "Polygon" }, + { "arcs": [[71]], "type": "Polygon" }, + { "arcs": [[72]], "type": "Polygon" }, + { "arcs": [[73]], "type": "Polygon" }, + { "arcs": [[74]], "type": "Polygon" }, + { "arcs": [[75]], "type": "Polygon" }, + { "arcs": [[76]], "type": "Polygon" }, + { "arcs": [[77]], "type": "Polygon" }, + { "arcs": [[78]], "type": "Polygon" }, + { "arcs": [[79]], "type": "Polygon" }, + { "arcs": [[80]], "type": "Polygon" }, + { "arcs": [[81]], "type": "Polygon" }, + { "arcs": [[82]], "type": "Polygon" }, + { "arcs": [[83]], "type": "Polygon" }, + { "arcs": [[84]], "type": "Polygon" }, + { "arcs": [[85]], "type": "Polygon" }, + { "arcs": [[86]], "type": "Polygon" }, + { "arcs": [[87]], "type": "Polygon" }, + { "arcs": [[88]], "type": "Polygon" }, + { "arcs": [[89]], "type": "Polygon" }, + { "arcs": [[90]], "type": "Polygon" }, + { "arcs": [[91]], "type": "Polygon" }, + { "arcs": [[92]], "type": "Polygon" }, + { "arcs": [[93]], "type": "Polygon" }, + { "arcs": [[94]], "type": "Polygon" }, + { "arcs": [[95]], "type": "Polygon" }, + { "arcs": [[96]], "type": "Polygon" }, + { "arcs": [[97]], "type": "Polygon" }, + { "arcs": [[98]], "type": "Polygon" }, + { "arcs": [[99]], "type": "Polygon" }, + { "arcs": [[100]], "type": "Polygon" }, + { "arcs": [[101]], "type": "Polygon" }, + { "arcs": [[102]], "type": "Polygon" }, + { "arcs": [[103]], "type": "Polygon" }, + { "arcs": [[104]], "type": "Polygon" }, + { "arcs": [[105]], "type": "Polygon" }, + { "arcs": [[106]], "type": "Polygon" }, + { "arcs": [[107]], "type": "Polygon" }, + { "arcs": [[108]], "type": "Polygon" }, + { "arcs": [[109]], "type": "Polygon" }, + { "arcs": [[110]], "type": "Polygon" }, + { "arcs": [[111]], "type": "Polygon" }, + { "arcs": [[112], [113]], "type": "Polygon" }, + { "arcs": [[114]], "type": "Polygon" }, + { "arcs": [[115]], "type": "Polygon" }, + { "arcs": [[116]], "type": "Polygon" }, + { "arcs": [[117]], "type": "Polygon" }, + { "arcs": [[118]], "type": "Polygon" }, + { "arcs": [[119]], "type": "Polygon" }, + { "arcs": [[120]], "type": "Polygon" }, + { "arcs": [[121]], "type": "Polygon" }, + { "arcs": [[122]], "type": "Polygon" }, + { "arcs": [[123]], "type": "Polygon" }, + { "arcs": [[124]], "type": "Polygon" }, + { "arcs": [[125]], "type": "Polygon" }, + { "arcs": [[126]], "type": "Polygon" }, + { "arcs": [[127]], "type": "Polygon" } + ] + } + } +} diff --git a/docs/assets/js/home.tsx b/docs/assets/js/home.tsx new file mode 100644 index 0000000000000..8db23b915f922 --- /dev/null +++ b/docs/assets/js/home.tsx @@ -0,0 +1,320 @@ +// Compatibility-related imports +//import "core-js/stable"; +//import "regenerator-runtime/runtime"; + +// Imports +import React, { useEffect, useState } from "react"; +import ReactDOM from "react-dom"; +import classnames from "classnames"; +import { useInterval } from "react-use"; +import { useSpring, animated } from "react-spring"; +import { geoOrthographic, geoPath, geoDistance } from "d3-geo"; +import { feature } from "topojson-client"; + +// types +import { Topology } from "@types/topojson-specification"; + +// countryData +import countryData from "./countries.json"; +import markerData from "./markers.json"; + +interface IGlobeProps { + size?: number; + lat?: number; + long?: number; + rotation?: number; + onClick?: () => void; +} + +const markers: GeoJSON.Point[] = markerData.map((m) => ({ + type: "Point", + coordinates: [m.coordinates[0], m.coordinates[1]], +})); + +const topo: unknown = countryData; +const topology = topo as Topology; +const geojson = feature( + topology, + topology.objects.land +) as GeoJSON.FeatureCollection; +const countries = geojson.features; + +export const Globe: React.FC = animated( + ({ size = 500, lat = 0, long = 0, rotation = 0, onClick }: IGlobeProps) => { + const svgRef = React.useRef(null); + + // create geo projection to render paths + const projection = React.useMemo(() => { + return geoOrthographic() + .translate([size / 2, size / 2]) + .scale(size / 2) + .clipAngle(90) + .rotate([rotation, 0]); + }, [size, rotation, lat, long]); + + // return coordinates based on the projection + const pathgen = geoPath().projection(projection); + + // find the center coordinates of the globe + const center: [number, number] = [size / 2, size / 2]; + + const colors = { + darkBlue: "#00a9bc", + lightBlue: "#28d9f2" + }; + + return ( +
+ + + + {countries.map((d, i) => ( + + ))} + {markers.map((m, i) => { + const coordinates: [number, number] = [ + m.coordinates[0], + m.coordinates[1], + ]; + const position = projection(coordinates); + const x = position ? position[0] : undefined; + const y = position ? position[1] : undefined; + const invertedCoordinates = + projection.invert && projection.invert(center); + + // hide the marker if rotated out of view + const hideMarker = + geoDistance(coordinates, invertedCoordinates || [0, 0]) > 1.4; + + return ( + + ); + })} + + +
+ ); + } +); + +export const RotatingGlobe: React.FC<{ size: number; duration?: number }> = ({ + size = 500, + duration = 50000, +}) => { + // globe positioning state + const [orientation, setOrientation] = React.useState({ + lat: 0, + long: 0, + degrees: 0, + }); + + // set up spring animation + const { lat, long, rotation } = useSpring({ + lat: orientation.lat, + long: orientation.long, + rotation: orientation.degrees, + config: { + duration, + }, + }); + + // globe click handler + // const onClick = React.useCallback(() => {}, []); + + // kick off the initial rotation + React.useEffect(() => { + setOrientation({ lat: 0, long: 0, degrees: 360 }); + }, []); + + // restart the animation every {duration} miliseconds + useInterval(() => { + setOrientation({ + lat: Math.floor(Math.random() * size), + long: Math.floor(Math.random() * size), + degrees: orientation.degrees + 360, + }); + }, duration); + + return ( + + ); +}; + +// Main page Vector diagram +function Diagram({className, height, width}) { + const [_, updateState] = useState(); + const defaultXPosition = 7; + const defaultTextLength = 60; + + useEffect(() => { + const timeout = setTimeout(() => { + updateState({}); + }, 100); + return () => clearTimeout(timeout); + }, []); + + if (!height) { + height = "294px"; + } + + if (!width) { + width = "900px"; + } + + return ( + + Vector Diagram + A lightweight and ultra-fast tool for building observability pipelines + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +// Place the components in the DOM +ReactDOM.render(, document.getElementById("globe")); +ReactDOM.render(, document.getElementById("diagram")); diff --git a/docs/assets/js/markers.json b/docs/assets/js/markers.json new file mode 100644 index 0000000000000..0060ceefff0b3 --- /dev/null +++ b/docs/assets/js/markers.json @@ -0,0 +1,162 @@ +[ + { + "name": "Tokyo", + "coordinates": [139.6917, 35.6895], + "population": 37843000 + }, + { + "name": "Jakarta", + "coordinates": [106.865, -6.1751], + "population": 30539000 + }, + { + "name": "Delhi", + "coordinates": [77.1025, 28.7041], + "population": 24998000 + }, + { + "name": "Manila", + "coordinates": [120.9842, 14.5995], + "population": 24123000 + }, + { + "name": "Seoul", + "coordinates": [126.978, 37.5665], + "population": 23480000 + }, + { + "name": "Shanghai", + "coordinates": [121.4737, 31.2304], + "population": 23416000 + }, + { + "name": "Karachi", + "coordinates": [67.0099, 24.8615], + "population": 22123000 + }, + { + "name": "Beijing", + "coordinates": [116.4074, 39.9042], + "population": 21009000 + }, + { + "name": "New York", + "coordinates": [-74.0059, 40.7128], + "population": 20630000 + }, + { + "name": "Guangzhou", + "coordinates": [113.2644, 23.1291], + "population": 20597000 + }, + { + "name": "Sao Paulo", + "coordinates": [-46.6333, -23.5505], + "population": 20365000 + }, + { + "name": "Mexico City", + "coordinates": [-99.1332, 19.4326], + "population": 20063000 + }, + { + "name": "Mumbai", + "coordinates": [72.8777, 19.076], + "population": 17712000 + }, + { + "name": "Osaka", + "coordinates": [135.5022, 34.6937], + "population": 17444000 + }, + { + "name": "Moscow", + "coordinates": [37.6173, 55.7558], + "population": 16170000 + }, + { + "name": "Dhaka", + "coordinates": [90.4125, 23.8103], + "population": 15669000 + }, + { + "name": "Greater Cairo", + "coordinates": [31.2357, 30.0444], + "population": 15600000 + }, + { + "name": "Los Angeles", + "coordinates": [-118.2437, 34.0522], + "population": 15058000 + }, + { + "name": "Bangkok", + "coordinates": [100.5018, 13.7563], + "population": 14998000 + }, + { + "name": "Kolkata", + "coordinates": [88.3639, 22.5726], + "population": 14667000 + }, + { + "name": "Buenos Aires", + "coordinates": [-58.3816, -34.6037], + "population": 14122000 + }, + { + "name": "Tehran", + "coordinates": [51.389, 35.6892], + "population": 13532000 + }, + { + "name": "Istanbul", + "coordinates": [28.9784, 41.0082], + "population": 13287000 + }, + { + "name": "Lagos", + "coordinates": [3.3792, 6.5244], + "population": 13123000 + }, + { + "name": "Shenzhen", + "coordinates": [114.0579, 22.5431], + "population": 12084000 + }, + { + "name": "Rio de Janeiro", + "coordinates": [-43.1729, -22.9068], + "population": 11727000 + }, + { + "name": "Kinshasa", + "coordinates": [15.2663, -4.4419], + "population": 11587000 + }, + { + "name": "Tianjin", + "coordinates": [117.3616, 39.3434], + "population": 10920000 + }, + { + "name": "Paris", + "coordinates": [2.3522, 48.8566], + "population": 10858000 + }, + { + "name": "Lima", + "coordinates": [-77.0428, -12.0464], + "population": 10750000 + }, + { + "name": "Ridgefield, WA", + "coordinates": [-122.6882, 45.8143], + "population": 7767 + }, + { + "name": "Soldotna, AK", + "coordinates": [-151.0583, 60.4878], + "population": 4649 + } +] diff --git a/docs/assets/sass/home.sass b/docs/assets/sass/home.sass new file mode 100644 index 0000000000000..10a2ecb8db84f --- /dev/null +++ b/docs/assets/sass/home.sass @@ -0,0 +1,197 @@ +// Main page Vector diagram +$spacing-vertical: 0 +$transition-fast: 0 + +// Main page globe icon +$globe-dark-mode-land: rgb(32, 32, 32) +$globe-dark-mode-water: rgb(66, 66, 98) +$globe-light-mode-land: rgb(168, 168, 168) +$globe-light-mode-water: rgb(216, 216, 216) + +@keyframes indexHeroInitial + 0% + background-size: 100% 100% + 90% + background-size: 250% 250% + 100% + background-size: 200% 200% + +@keyframes indexHeroPulsating + 0% + background-size: 200% 200% + 50% + background-size: 150% 150% + 100% + background-size: 200% 200% + +@keyframes diagramExplodeSource1 + 100% + opacity: 1 + transform: translate(82px, 56px) + +@keyframes diagramExplodeSource2 + 100% + opacity: 1 + transform: translate(0px, 122px) + +@keyframes diagramExplodeSource3 + 100% + opacity: 1 + transform: translate(82px, 182px) + +@keyframes diagramExplodeLogo + 40% + transform: translate(328px, 53px) + 100% + opacity: 1 + transform: translate(328px, 38px) + +@keyframes diagramExplodeStructure + 100% + opacity: 1 + transform: translate(29px, 74px) + +@keyframes diagramExplodeAggregate + 100% + opacity: 1 + transform: translate(29px, 194px) + +@keyframes diagramExplodeSink1 + 100% + opacity: 1 + transform: translate(1px, 58px) + +@keyframes diagramExplodeSink2 + 100% + opacity: 1 + transform: translate(81px, 124px) + +@keyframes diagramExplodeSink3 + 100% + opacity: 1 + transform: translate(0px, 184px) + +@keyframes diagramFadeIn + 0% + opacity: 0.01 + 100% + opacity: 1 + +@media (max-width: 480px) + html.dark .diagram-container, + .diagram-container + animation: none + background-image: none + min-height: auto + + .diagram + margin: spacing-vertical 0 0 0 + +.diagram + margin: calc($spacing-vertical * 2 ) 0 + max-height: 21em + height: auto + width: 100% + + .fade-in + animation: diagramFadeIn 1s ease-in + animation-delay: 1000ms + animation-fill-mode: forwards + opacity: 0.01 + + #Source-1 + animation: diagramExplodeSource1 700ms cubic-bezier(0, 1.5, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 0 + transform: translate(315px, 132px) + + #Source-2 + animation: diagramExplodeSource2 700ms cubic-bezier(0, 1.5, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 0 + transform: translate(315px, 132px) + + #Source-3 + animation: diagramExplodeSource3 700ms cubic-bezier(0, 1.5, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 0 + transform: translate(315px, 132px) + + #Logo + animation: diagramExplodeLogo 1050ms cubic-bezier(0, 5, 1, 4.1) + animation-delay: 250ms + animation-fill-mode: forwards + opacity: 1 + transform: translate(328px, 38px) + + #Structure + animation: diagramExplodeStructure 700ms cubic-bezier(0, 3, 1, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 1 + transform: translate(29px, 102px) + + #Aggregate + animation: diagramExplodeAggregate 700ms cubic-bezier(0, 3, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + transform: translate(29px, 166px) + + #Sink-1 + animation: diagramExplodeSink1 700ms cubic-bezier(0, 1.5, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 0 + transform: translate(-212px, 134px) + + #Sink-2 + animation: diagramExplodeSink2 700ms cubic-bezier(0, 1.5, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 0 + transform: translate(-212px, 134px) + + #Sink-3 + animation: diagramExplodeSink3 700ms cubic-bezier(0, 1.5, 0.32, 1.5) + animation-delay: 650ms + animation-fill-mode: forwards + opacity: 0 + transform: translate(-212px, 134px) + + a + circle + transition: all $transition-fast ease + + &:hover + circle + transform: scale(1.1) translate(-0.5%, -1%) + + #Structure, #Sample, #Aggregate + polygon + transform: scale(1.05) translate(-0.5%, -1%) + + #Structure, #Sample, #Aggregate + polygon + transition: all $transition-fast ease + +// Spinning globe in the main page community section +.dark + #globe-wrapper + #globe + svg + fill: $globe-dark-mode-water + + .land + fill: $globe-dark-mode-land + +.light + #globe-wrapper + #globe + svg + fill: $globe-light-mode-water + + .land + fill: $globe-light-mode-land diff --git a/docs/assets/sass/syntax.sass b/docs/assets/sass/syntax.sass new file mode 100644 index 0000000000000..0c3ef4324a7c0 --- /dev/null +++ b/docs/assets/sass/syntax.sass @@ -0,0 +1,714 @@ +// Code block highlighting + +@import variables + +// Global variables +$padding: 2ren + +// Light theme variables +$light-1: black +$light-2: $purple-300 +$light-3: $gray-200 +$light-4: grey +$light-5: red +$light-6: $gray-500 // Comments +$light-7: $pink-400 +$light-8: magenta +$light-9: purple +$light-10: $emerald-300 +$light-11: olive +$light-12: $blue-300 + +$light-bg-color: black +$light-default-text-color: $gray-200 + +// Dark theme variables +$dark-1: black +$dark-2: $purple-300 +$dark-3: $gray-200 +$dark-4: grey +$dark-5: red +$dark-6: $gray-500 // Comments +$dark-7: $pink-400 +$dark-8: magenta +$dark-9: purple +$dark-10: $emerald-300 +$dark-11: olive +$dark-12: $blue-300 + +$dark-bg-color: black +$dark-default-text-color: $gray-200 + +// Code blocks with no language specified +.chroma + padding: $padding + +// Light theme code blocks +.light + pre, .chroma + background-color: $light-bg-color + color: $light-default-text-color + + .chroma + // Background + background-color: $light-bg-color + + // Base text color + color: $light-default-text-color + + // Other + .x + + // Error + .err + color: $light-8 + //background-color: $sx-1 + + // LineTable TD + .lntd + vertical-align: top + padding: 0 + margin: 0 + border: 0 + + // LineTable + .lntable + border-spacing: 0 + padding: 0 + margin: 0 + border: 0 + width: auto + overflow: auto + display: block + + // LineHighlight + .hl + display: block + width: 100% + background-color: $light-5 + + // LineNumbersTable + .lnt + margin-right: 0.4em + padding: 0 0.4em 0 0.4em + color: $light-4 + + // LineNumbers + .ln + margin-right: 0.4em + padding: 0 0.4em 0 0.4em + color: $light-4 + + // Keyword + .k + font-weight: 600 + color: $light-2 + + // KeywordConstant + .kc + color: $light-2 + + // KeywordDeclaration + .kd + color: $light-2 + + // KeywordNamespace + .kn + color: $light-7 + + // KeywordPseudo + .kp + color: $light-2 + + // KeywordReserved + .kr + color: $light-2 + + // KeywordType + .kt + color: $light-2 + + // Name + .n + + // NameAttribute + .na + color: $light-3 + + // NameBuiltin + .nb + + // NameBuiltinPseudo + .bp + + // NameClass + .nc + color: $light-3 + + // NameConstant + .no + color: $light-2 + + // NameDecorator + .nd + color: $light-3 + + // NameEntity + .ni + + // NameException + .ne + color: $light-3 + + // NameFunction + .nf + color: $light-3 + + // NameFunctionMagic + .fm + + // NameLabel + .nl + + // NameNamespace + .nn + + // NameOther + .nx + color: $light-3 + + // NameProperty + .py + + // NameTag + .nt + color: $light-7 + + // NameVariable + .nv + + // NameVariableClass + .vc + + // NameVariableGlobal + .vg + + // NameVariableInstance + .vi + + // NameVariableMagic + .vm + + // Literal + .l + color: $light-10 + + // LiteralDate + .ld + color: $light-12 + + // LiteralString + .s + color: $light-12 + + // LiteralStringAffix + .sa + color: $light-12 + + // LiteralStringBacktick + .sb + color: $light-12 + + // LiteralStringChar + .sc + color: $light-12 + + // LiteralStringDelimiter + .dl + color: $light-12 + + // LiteralStringDoc + .sd + color: $light-12 + + // LiteralStringDouble + .s2 + color: $light-12 + + // LiteralStringEscape + .se + color: $light-10 + + // LiteralStringHeredoc + .sh + color: $light-12 + + // LiteralStringInterpol + .si + color: $light-12 + + // LiteralStringOther + .sx + color: $light-12 + + // LiteralStringRegex + .sr + color: $light-12 + + // LiteralStringSingle + .s1 + color: $light-12 + + // LiteralStringSymbol + .ss + color: $light-12 + + // LiteralNumber + .m + color: $light-10 + + // LiteralNumberBin + .mb + color: $light-10 + + // LiteralNumberFloat + .mf + color: $light-10 + + // LiteralNumberHex + .mh + color: $light-10 + + // LiteralNumberInteger + .mi + color: $light-10 + + // LiteralNumberIntegerLong + .il + color: $light-10 + + // LiteralNumberOct + .mo + color: $light-10 + + // Operator + .o + color: $light-7 + + // OperatorWord + .ow + color: $light-7 + + // Punctuation + .p + color: $light-2 + + // Comment + .c + color: $light-6 + + // CommentHashbang + .ch + color: $light-6 + + // CommentMultiline + .cm + color: $light-6 + + // CommentSingle + .c1 + color: $light-6 + + // CommentSpecial + .cs + color: $light-6 + + // CommentPreproc + .cp + color: $light-6 + + // CommentPreprocFile + .cpf + color: $light-6 + + // Generic + .g + + // GenericDeleted + .gd + color: $light-7 + + // GenericEmph + .ge + font-style: italic + + // GenericError + .gr + + // GenericHeading + .gh + + // GenericInserted + .gi + color: $light-3 + + // GenericOutput + .go + + // GenericPrompt + .gp + + // GenericStrong + .gs + font-weight: 700 + + // GenericSubheading + .gu + + // GenericSubheading + .gu + color: $light-9 + + // GenericTraceback + .gt + + // GenericUnderline + .gl + + // TextWhitespace + .w + +// Dark theme code blocks +.dark + pre, .chroma + background-color: $dark-bg-color + color: $dark-default-text-color + + .chroma + // Background + background-color: $dark-bg-color + + // Base text color + color: $dark-default-text-color + + // Other + .x + + // Error + .err + color: $dark-8 + //background-color: $sx-1 + + // LineTable TD + .lntd + vertical-align: top + padding: 0 + margin: 0 + border: 0 + + // LineTable + .lntable + border-spacing: 0 + padding: 0 + margin: 0 + border: 0 + width: auto + overflow: auto + display: block + + // LineHighlight + .hl + display: block + width: 100% + background-color: $dark-5 + + // LineNumbersTable + .lnt + margin-right: 0.4em + padding: 0 0.4em 0 0.4em + color: $dark-4 + + // LineNumbers + .ln + margin-right: 0.4em + padding: 0 0.4em 0 0.4em + color: $dark-4 + + // Keyword + .k + font-weight: 600 + color: $dark-2 + + // KeywordConstant + .kc + color: $dark-2 + + // KeywordDeclaration + .kd + color: $dark-2 + + // KeywordNamespace + .kn + color: $dark-7 + + // KeywordPseudo + .kp + color: $dark-2 + + // KeywordReserved + .kr + color: $dark-2 + + // KeywordType + .kt + color: $dark-2 + + // Name + .n + + // NameAttribute + .na + color: $dark-3 + + // NameBuiltin + .nb + + // NameBuiltinPseudo + .bp + + // NameClass + .nc + color: $dark-3 + + // NameConstant + .no + color: $dark-2 + + // NameDecorator + .nd + color: $dark-3 + + // NameEntity + .ni + + // NameException + .ne + color: $dark-3 + + // NameFunction + .nf + color: $dark-3 + + // NameFunctionMagic + .fm + + // NameLabel + .nl + + // NameNamespace + .nn + + // NameOther + .nx + color: $dark-3 + + // NameProperty + .py + + // NameTag + .nt + color: $dark-7 + + // NameVariable + .nv + + // NameVariableClass + .vc + + // NameVariableGlobal + .vg + + // NameVariableInstance + .vi + + // NameVariableMagic + .vm + + // Literal + .l + color: $dark-10 + + // LiteralDate + .ld + color: $dark-12 + + // LiteralString + .s + color: $dark-12 + + // LiteralStringAffix + .sa + color: $dark-12 + + // LiteralStringBacktick + .sb + color: $dark-12 + + // LiteralStringChar + .sc + color: $dark-12 + + // LiteralStringDelimiter + .dl + color: $dark-12 + + // LiteralStringDoc + .sd + color: $dark-12 + + // LiteralStringDouble + .s2 + color: $dark-12 + + // LiteralStringEscape + .se + color: $dark-10 + + // LiteralStringHeredoc + .sh + color: $dark-12 + + // LiteralStringInterpol + .si + color: $dark-12 + + // LiteralStringOther + .sx + color: $dark-12 + + // LiteralStringRegex + .sr + color: $dark-12 + + // LiteralStringSingle + .s1 + color: $dark-12 + + // LiteralStringSymbol + .ss + color: $dark-12 + + // LiteralNumber + .m + color: $dark-10 + + // LiteralNumberBin + .mb + color: $dark-10 + + // LiteralNumberFloat + .mf + color: $dark-10 + + // LiteralNumberHex + .mh + color: $dark-10 + + // LiteralNumberInteger + .mi + color: $dark-10 + + // LiteralNumberIntegerLong + .il + color: $dark-10 + + // LiteralNumberOct + .mo + color: $dark-10 + + // Operator + .o + color: $dark-7 + + // OperatorWord + .ow + color: $dark-7 + + // Punctuation + .p + color: $dark-2 + + // Comment + .c + color: $dark-6 + + // CommentHashbang + .ch + color: $dark-6 + + // CommentMultiline + .cm + color: $dark-6 + + // CommentSingle + .c1 + color: $dark-6 + + // CommentSpecial + .cs + color: $dark-6 + + // CommentPreproc + .cp + color: $dark-6 + + // CommentPreprocFile + .cpf + color: $dark-6 + + // Generic + .g + + // GenericDeleted + .gd + color: $dark-7 + + // GenericEmph + .ge + font-style: italic + + // GenericError + .gr + + // GenericHeading + .gh + + // GenericInserted + .gi + color: $dark-3 + + // GenericOutput + .go + + // GenericPrompt + .gp + + // GenericStrong + .gs + font-weight: 700 + + // GenericSubheading + .gu + + // GenericSubheading + .gu + color: $dark-9 + + // GenericTraceback + .gt + + // GenericUnderline + .gl + + // TextWhitespace + .w diff --git a/docs/assets/sass/toc.sass b/docs/assets/sass/toc.sass new file mode 100644 index 0000000000000..2705017e4bb2d --- /dev/null +++ b/docs/assets/sass/toc.sass @@ -0,0 +1,76 @@ +// Table of Contents provided by Tocbot (https://github.com/tscanlin/tocbot) +// Our implementation uses the Tocbot JavaScript to build the HTML for the TOC but doesn't use Tocbot's CSS +// Instead, we use the Sass/CSS here in this file +@import variables + +.dark, .light + #toc + overflow-y: scroll + padding-top: $y-padding + padding-bottom: $y-padding + line-height: 110% + + .toc-list // h2 + padding-left: $toc-indent-lg + font-size: $h2-font-size + + .toc-list // h3 + font-size: $h3-font-size + padding-top: $h3-toc-spacing + padding-bottom: $h3-toc-spacing + padding-left: $toc-indent-sm + + .toc-list // h4 + font-size: $h4-font-size + padding-top: $h4-toc-spacing + padding-bottom: $h4-toc-spacing + padding-left: $toc-indent-sm + + & > .toc-list + overflow: hidden + position: relative + + li + list-style: none + +// Dark mode +.dark + .is-active-link + color: $vector-blue + + #toc + border-left: 2px solid $gray-700 + + .toc-list + color: $gray-200 + + .toc-list + color: $gray-300 + + +// Light mode +.light + .is-active-link + color: $vector-purple + + #toc + border-left: 2px solid $gray-200 + + .toc-list + color: $gray-800 + + .toc-list + color: $gray-500 + +a.toc-link + color: currentColor + height: 100% + + +.is-active-link + font-weight: 700 + +// Get rid of the annoying border on Chrome when a link is selected +.prose + *:focus + outline: none diff --git a/docs/assets/sass/unpurged.sass b/docs/assets/sass/unpurged.sass new file mode 100644 index 0000000000000..92e8a91318d75 --- /dev/null +++ b/docs/assets/sass/unpurged.sass @@ -0,0 +1,61 @@ +@import toc +@import syntax + +// SVG-specific variables +$svg-gray: #001b3d +$svg-white: white +$svg-primary: #28d9f2 +$dark-mode-gray: rgb(224, 235, 247) +$dark-mode-black: #191927 + +// SVG theme compatibility +svg + [fill="#000000"], + [fill="black"] + fill: $svg-gray + + [stroke="#000000"], + [stroke="black"] + stroke: $svg-gray + + [stop-color="#000000"], + [stop-color="black"] + stop-color: $svg-gray + + [fill="#FFFFFF"], + [fill="white"] + fill: $svg-white + + [stroke="#FFFFFF"], + [stroke="white"] + stroke: $svg-white + + [fill="#10E7FF"], + [fill="white"] + fill: $svg-primary + + [stroke="#10E7FF"], + [stroke="white"] + stroke: $svg-primary + +// SVG dark mode compatibility +html + &.dark + svg + [fill="#000000"] + fill: $dark-mode-gray + [stroke="#000000"] + stroke: $dark-mode-gray + [stop-color="#000000"] + stop-color: $dark-mode-gray + [fill="#FFFFFF"], + [fill="#FFF"] + fill: $dark-mode-black + [stroke="$FFFFFF"] + stroke: $dark-mode-black + +// Install icons on the main page +.install-icon + &:hover + [fill="#000000"] + fill: $svg-primary diff --git a/docs/assets/sass/variables.sass b/docs/assets/sass/variables.sass new file mode 100644 index 0000000000000..7422c47f02670 --- /dev/null +++ b/docs/assets/sass/variables.sass @@ -0,0 +1,25 @@ +$vector-blue: #28d9f2 +$vector-purple: #98f + +// Colors borrowed from Tailwind +$blue-300: #93C5FD +$emerald-300: #6EE7B7 +$gray-200: #E5E7EB +$gray-300: #D1D5DB +$gray-400: #9CA3AF +$gray-500: #6B7280 +$gray-700: #374151 +$gray-800: #1F2937 +$pink-400: #F472B6 +$pink-500: #EC4899 +$purple-300: #C4B5FD + +// TOC variables +$toc-indent-lg: 0.75rem +$toc-indent-sm: 0.6rem +$h2-font-size: 0.9rem +$h3-font-size: 0.75rem +$h4-font-size: 0.7rem +$h3-toc-spacing: 0.35rem +$h4-toc-spacing: 0.2rem +$y-padding: 0.25rem diff --git a/docs/babel.config.js b/docs/babel.config.js new file mode 100644 index 0000000000000..c683354b91987 --- /dev/null +++ b/docs/babel.config.js @@ -0,0 +1,34 @@ +module.exports = function (api) { + api.cache(true); + + const presets = [ + [ + require('@babel/preset-env'), + { + "useBuiltIns": 'entry', + "corejs": 3 + } + ], + [ + require("@babel/preset-react"), + { + "flow": false, + "typescript": true + } + ], + [ + require("@babel/preset-typescript"), + { + "isTSX": true, + "allExtensions": true + } + ] + ]; + + const plugins = []; + + return { + presets, + plugins + }; +} diff --git a/docs/config.toml b/docs/config.toml new file mode 100644 index 0000000000000..b7e223c507cde --- /dev/null +++ b/docs/config.toml @@ -0,0 +1,382 @@ +title = "Vector" +baseURL = "/" +disableKinds = ["taxonomy", "term"] +copyright = "Datadog, Inc." +languageCode = "en-us" + +[build] +writeStats = true + +[minify] +disableSVG = true + +# Syntax highlighting +[markup.highlight] +noClasses = false + +# Markup config overrides +[markup.goldmark.renderer] +unsafe = true + +# Language configuration +defaultContentLanguage = "en" + +[languages.en] +title = "Vector" +contentDir = "content/en" +weight = 1 + +[params] +description = "A lightweight, ultra-fast tool for building observability pipelines" +tagline = "Take control of your observability stack" +undertagline = "Collect, transform, and route all your observability data with one simple tool" +subtagline = "Vector is deployed over 1,000,000 times per month by Fortune 500 companies and startups" +alpine_js_version = "2.8.2" +ionicons_version = "5.4.0" +site_logo = "img/vector-open-graph.png" +favicon = "favicon.ico" + +# Update this every time there's a new "generation" of the site. Incrementing this forces the browser to refresh any +# state persisted in localStorage. You should do that whenever there's some change in the front-end logic that requires +# wiping out the user's localStorage, for example a new news banner that we want to show. Think of it as cache +# invalidation that we control. +site_generation = 1 + +# Search +[outputFormats.SEARCH] +baseName = "search" +isPlainText = true +mediaType = "application/json" +notAlternative = true + +[params.search] +algolia_app_id = "EOIG7V0A2O" +# Note that it's okay to use this on the front end: https://www.algolia.com/doc/guides/security/api-keys/#search-only-api-key +algola_public_api_key = "5f712eef8e5dcf4ac4bbbd0099960626" + +algolia_index_prod = "vector_docs_prod" +algolia_index_staging = "vector_docs_staging" + +# Outputs (including search.json and _redirects files) +[outputs] +home = ["HTML", "RSS", "SEARCH"] + +# CSS generation +[[params.css]] +input = "css/style.css" +output = "css/style.css" +postcss = true +post_process = true + +[[params.css]] +input = "sass/unpurged.sass" +output = "css/unpurged.css" + +[[params.css]] +input = "sass/home.sass" +output = "css/home.css" +home_page_only = true + +[params.social] +twitter_handle = "vectordotdev" +github_repo = "timberio/vector" +discord = "https://chat.vector.dev" + +## Menus + +# Main page doc links +[[languages.en.menus.doc_quick_links]] +name = "Quickstart" +url = "/docs/setup/quickstart" +params = { emphasis = true, ionicon = "rocket-outline" } +weight = 1 + +[[languages.en.menus.doc_quick_links]] +name = "Vector Remap Language" +url = "/docs/reference/vrl" +params = { ionicon = "map-outline" } +weight = 2 + +[[languages.en.menus.doc_quick_links]] +name = "Components" +url = "/components" +params = { ionicon = "link-outline" } +weight = 3 + +# Navbar menu +[[languages.en.menus.navbar]] +name = "Docs" +url = "/docs" +params = { flyout = true } +weight = 1 + +[[languages.en.menus.navbar]] +name = "Guides" +url = "/guides" +weight = 2 + +[[languages.en.menus.navbar]] +name = "Components" +url = "/components" +weight = 3 + +[[languages.en.menus.navbar]] +name = "Download" +url = "/download" +weight = 4 + +[[languages.en.menus.navbar]] +name = "Blog" +url = "/blog" +weight = 5 + +# Footer menu +[[languages.en.menus.footer]] +name = "About" +identifier = "about" +weight = 1 + +[[languages.en.menus.footer]] +name = "What is Vector?" +url = "/docs/about" +parent = "about" +weight = 1 + +[[languages.en.menus.footer]] +name = "Contact us" +url = "/community" +parent = "about" +weight = 2 + +[[languages.en.menus.footer]] +name = "Components" +url = "/components" +identifier = "components" +weight = 2 + +[[languages.en.menus.footer]] +name = "Sources" +url = "/docs/reference/configuration/sources" +parent = "components" +weight = 1 + +[[languages.en.menus.footer]] +name = "Transforms" +url = "/docs/reference/configuration/transforms" +parent = "components" +weight = 2 + +[[languages.en.menus.footer]] +name = "Sinks" +url = "/docs/reference/configuration/sinks" +parent = "components" +weight = 3 + +[[languages.en.menus.footer]] +name = "Setup" +url = "/docs/setup" +identifier = "setup" +weight = 3 + +[[languages.en.menus.footer]] +name = "Installation" +url = "/docs/setup/installation" +parent = "setup" +weight = 1 + +[[languages.en.menus.footer]] +name = "Deployment" +url = "/docs/setup/deployment" +parent = "setup" +weight = 2 + +[[languages.en.menus.footer]] +name = "Configuration" +url = "/docs/reference/configuration" +parent = "setup" +weight = 3 + +[[languages.en.menus.footer]] +name = "Administration" +url = "/docs/administration" +parent = "setup" +weight = 4 + +[[languages.en.menus.footer]] +name = "Community" +url = "/community" +identifier = "community" +weight = 4 + +[[languages.en.menus.footer]] +name = "GitHub" +url = "https://github.com/timberio/vector" +parent = "community" +weight = 1 + +[[languages.en.menus.footer]] +name = "Twitter" +url = "https://twitter.com/vectordotdev" +parent = "community" +weight = 2 + +[[languages.en.menus.footer]] +name = "Chat" +url = "https://chat.vector.dev" +parent = "community" +weight = 3 + +# Extra links under the "Meta" section in the docs +[[languages.en.menus.meta]] +name = "Privacy" +url = "https://github.com/timberio/vector/blob/master/PRIVACY.md" +weight = 1 + +[[languages.en.menus.meta]] +name = "Release" +url = "https://github.com/timberio/vector/blob/master/RELEASING.md" +weight = 2 + +[[languages.en.menus.meta]] +name = "Security" +url = "https://github.com/timberio/vector/security/policy" +weight = 3 + +# Buttons in "community" section on main page +[[languages.en.menus.community]] +name = "View GitHub repo" +params = { color = "black", dark = "white", icon = "github" } +url = "https://github.com/timberio/vector" +weight = 1 + +[[languages.en.menus.community]] +name = "Chat with us on Discord" +params = { color = "discord-purple", icon = "discord" } +url = "https://chat.vector.dev" +weight = 2 + + +# Mini icons in navbar and footer +[[languages.en.menus.comms]] +name = "Twitter" +params = { color = "twitter-blue", icon = "twitter" } +url = "https://twitter.com/vectordotdev" +weight = 1 + +[[languages.en.menus.comms]] +name = "GitHub" +params = { color = "black", dark = "white", icon = "github" } +url = "https://github.com/timberio/vector" +weight = 2 + +[[languages.en.menus.comms]] +name = "Chat" +params = { color = "discord-purple", icon = "discord" } +url = "https://chat.vector.dev" +weight = 3 + +[[languages.en.menus.comms]] +name = "RSS" +params = { color = "rss-orange", icon = "rss" } +url = "/blog/index.xml" +weight = 4 + +# Links in subfooter +[[languages.en.menus.subfooter]] +name = "Security policy" +url = "https://github.com/timberio/vector/blob/master/PRIVACY.md" +weight = 1 + +[[languages.en.menus.subfooter]] +name = "Privacy policy" +url = "https://github.com/timberio/vector/blob/master/PRIVACY.md" +weight = 2 + +[[languages.en.menus.flyout]] +name = "Documentation" +identifier = "docs" +url = "/docs" +weight = 1 + +[[languages.en.menus.flyout]] +name = "Quickstart" +parent = "docs" +url = "/docs/setup/quickstart" +weight = 1 + +[[languages.en.menus.flyout]] +name = "Components" +identifier = "components" +url = "/components" +weight = 2 + +[[languages.en.menus.flyout]] +name = "Sources" +parent = "components" +url = "/docs/reference/configuration/sources" +weight = 1 + +[[languages.en.menus.flyout]] +name = "Transforms" +parent = "components" +url = "/docs/reference/configuration/transforms" +weight = 2 + +[[languages.en.menus.flyout]] +name = "Sinks" +parent = "components" +url = "/docs/reference/configuration/sinks" +weight = 3 + +[[languages.en.menus.flyout]] +name = "Vector Remap Language" +identifier = "vrl" +url = "/docs/reference/vrl" +weight = 3 + +[[languages.en.menus.flyout]] +name = "Functions" +parent = "vrl" +url = "/docs/reference/vrl/functions" +weight = 1 + +[[languages.en.menus.flyout]] +name = "Errors" +parent = "vrl" +url = "/docs/reference/vrl/errors" +weight = 2 + +[[languages.en.menus.flyout]] +name = "Examples" +parent = "vrl" +url = "/docs/reference/vrl/examples" +weight = 3 + +[[languages.en.menus.flyout]] +name = "Expressions" +parent = "vrl" +url = "/docs/reference/vrl/expressions" +weight = 4 + +[[languages.en.enus.flyout]] +name = "Pages" +identifier = "pages" +weight = 4 + +[[languages.en.menus.flyout]] +name = "Download" +parent = "pages" +url = "/download" +weight = 1 + +[[languages.en.menus.flyout]] +name = "Releases" +parent = "pages" +url = "/releases" +weight = 2 + +[[languages.en.menus.flyout]] +name = "Highlights" +parent = "pages" +url = "/highlights" +weight = 3 diff --git a/docs/content/en/_index.md b/docs/content/en/_index.md new file mode 100644 index 0000000000000..eade67220dadf --- /dev/null +++ b/docs/content/en/_index.md @@ -0,0 +1,146 @@ +--- +# The main page at https://vector.dev +title: Vector + +# What is Vector (with animated diagram) +what: + title: Take control of your observability data + description: Collect, transform, and route *all* your logs and metrics with *one* simple tool. + +# Items listed in the "Why Vector?" section. Markdown is supported in the descriptions. +why: +- title: "Ultra fast and reliable" + description: "Built in [Rust](https://rust-lang.org), Vector is blistering fast, memory efficient, and designed to handle the most demanding environments." + icon: "clock.svg" +- title: "End to end" + description: "Vector strives to be the only tool you need to get observability data from A to B, [deploying](/docs/setup/deployment) as an [daemon](/docs/setup/deployment/roles/#daemon)), [sidecar](/docs/setup/deployment/roles/#sidecar), or [aggregator](/docs/setup/deployment/roles/#aggregator)." + icon: "chart.svg" +- title: "Unified" + description: "Vector supports [logs](/docs/about/under-the-hood/architecture/data-model/log) and [metrics](/docs/about/under-the-hood/architecture/data-model/metric), making it easy to collect and process all your observability data." + icon: "hex.svg" +- title: "Vendor neutral" + description: "Vector doesn't favor any storage and fosters a fair, open ecosystem with your best interest in mind. Lock-in free and future proof." + icon: "lock.svg" +- title: "Programmable transforms" + description: "[Programmable transforms](/docs/reference/configuration/transforms) give you the full power of programmable runtimes. Handle complex use cases without limitation." + icon: "code.svg" +- title: "Clear guarantees" + description: "Guarantees matter, and Vector is [clear on its guarantees](/docs/about/under-the-hood/guarantees), helping you to make the appropriate trade offs for your use case." + icon: "laptop.svg" + +# Platform section +platform: + title: A complete, end-to-end platform. + description: | + Deploy Vector in a variety of roles to suit your use case. +
+ Get data from point A to point B without patching tools together. + # Selectable tabs with associated SVGs + tabs: + - Distributed + - Centralized + - Stream based + +# Configuration section +configure: + title: "Easy to configure" + description: "A simple, composable format enables you to build flexible pipelines" + filename: "/etc/vector/vector.toml" + below: "Configuration examples are in [TOML](https://toml.io) but Vector also supports [YAML](https://yaml.org) and [JSON](https://json.org)" + example_configs: + - title: Parse NGINX logs + config: | + [sources.nginx_error_log] + type = "file" + include = ["/var/log/nginx*.log"] + start_at_beginning = false + ignore_older = 86400 + + [transforms.nginx_error_parser] + inputs = ["nginx_error_log"] + type = "remap" + source = ''' + # TODO + ''' + - title: Something else + config: | + [sources.do_something_else] + type = "other" + + [sinks.out] + inputs = ["in"] + type = "console" + encoding.codec = "text" + - title: Other thing entirely + config: | + [sources.do_other_thing_entirely] + type = "other" + + [sinks.out] + inputs = ["in"] + type = "console" + encoding.codec = "text" + - title: And yet another + config: | + [sources.and_yet_another] + type = "other" + + [sinks.out] + inputs = ["in"] + type = "console" + encoding.codec = "text" + +# Installation section +installation: + title: Installs everywhere + description: Packaged as a single binary. No dependencies, no runtime, and memory safe. + logos: + - logo: "kubernetes.svg" + url: "/docs/setup/installation/platforms/kubernetes" + - logo: "docker.svg" + url: "/docs/setup/installation/platforms/docker" + - logo: "linux.svg" + url: "/docs/setup/installation/operating-systems" + - logo: "raspbian.svg" + url: "/docs/setup/installation/operating-systems/raspbian" + - logo: "windows.svg" + url: "/docs/setup/installation/operating-systems/windows" + - logo: "apple.svg" + url: "/docs/setup/installation/operating-systems/macos" + features: + - title: "Single binary" + ionicon: "cube-outline" + - title: "X86_64, ARM64/v7" + ionicon: "hardware-chip-outline" + - title: "No runtime" + ionicon: "flash-outline" + - title: "Memory safe" + ionicon: "shield-outline" + methods: + - title: "Platforms" + url: "/docs/setup/installation/platforms" + - title: "Package managers" + url: "/docs/setup/installation/package-managers" + - title: "Operating systems" + url: "/docs/setup/installation/operating-systems" + - title: "Manual" + url: "/docs/setup/installation/manual" + +# Component cloud +components: + title: Highly flexible processing topologies + description: A wide range of sources, transforms, and sinks to choose from + +# Community section +community: + title: Backed by a strong open source community + stats: + - title: "GitHub stars" + figure: "7.4k+" + - title: "Contributors" + figure: "150" + - title: "Downloads" + figure: "30m+" + - title: "Countries" + figure: "40" +--- diff --git a/docs/content/en/blog/_index.md b/docs/content/en/blog/_index.md new file mode 100644 index 0000000000000..bc30f10e370be --- /dev/null +++ b/docs/content/en/blog/_index.md @@ -0,0 +1,5 @@ +--- +title: The Vector blog +short: Blog +description: Thoughts on monitoring and observability from the Vector team +--- diff --git a/docs/content/en/blog/adaptive-request-concurrency.md b/docs/content/en/blog/adaptive-request-concurrency.md new file mode 100644 index 0000000000000..3c3cb380c7268 --- /dev/null +++ b/docs/content/en/blog/adaptive-request-concurrency.md @@ -0,0 +1,162 @@ +--- +title: Adaptive request concurrency. Resilient observability at scale. +short: Adaptive request concurrency +description: Improving reliability and performance across your entire observability infrastructure +authors: ["lucperkins"] +date: "2020-11-24" +badges: + type: announcement + domains: ["networking", "performance", "reliability"] +tags: ["arc", "adaptive request concurrency", "networking", "concurrency", "http", "rate limiting"] +--- + +Observability pipelines have become critical infrastructure in the current technological landscape, which is why we've built [Vector] to provide extremely high throughput with the tiniest resource footprint we can manage ([Rust] is a huge help here). But this is not enough in the real world: your observability pipeline needs to provide optimal performance and efficiency while *also* being a good infrastructure citizen and playing nicely with services like [Elasticsearch] and [Clickhouse]. + +And so we're excited to announce that Vector version 0.11 includes support for **Adaptive Request Concurrency** (ARC) in all of its HTTP-based [sinks]. This feature does away with static rate limits and automatically optimizes HTTP concurrency limits based on downstream service responses. The underlying [mechanism](#how-it-works) is a feedback loop inspired by TCP congestion control algorithms. + +## The lead-up + +One of the most common support questions we get about Vector involves logs like this: + +```log +TRACE tower_limit::rate::service: rate limit exceeded, disabling service +``` + +Users typically have two questions about this: + +1. What does it mean? +1. How can I fix it? + +The answer to the first question is simple: Vector has _internally_ rate-limited processing to respect user-configured limits—[`request.rate_limit_duration_secs`][rate_limit_duration_secs] and [`request.rate_limit_num`][rate_limit_num]—for that particular [sink][sinks]. In other words, Vector has intentionally reduced performance to stay within static limits. + +The answer to the second question—how to fix it—is more complex because it depends on a variety of factors that change over time (covered in more detail [below](#rate-limiting-problem)). Telling the user to raise their limits would be irresponsible since we'd then risk overwhelming the downstream service and causing an outage; but not changing them could mean limiting performance in a dramatic way. + +{{< quote >}} +In one case, we found that rate limits were limiting performance by over 80%. +{{< /quote >}} + +The crux of the matter is that Vector's high throughput presents a major challenge for HTTP-based sinks like [Elasticsearch] because those services can't always handle event payloads as quickly as Vector can send them. And when data services are heavily interdependent—which is almost always!—letting Vector overhwelm one of them can lead to system-wide performance degradation or even cascading failures. + +In versions of Vector prior to 0.11, you could address this problem by setting [**rate limits**][rate limit] on outbound HTTP traffic to downstream services. Rate limiting certainly *does* help prevent certain worst-case scenarios but customer feedback and our own internal QA has revealed that this approach also has deep limitations. + +## The problem: rate limiting is not a panacea {#rate-limiting-problem} + +Rate limiting is nice to have as a fallback but it's a blunt instrument, a static half-solution to a dynamic problem. The core problem is that configuring your own rate limits locks you into a perpetual loop: + +![The rate limiting decision loop](/img/blog/rate-limiting-loop.png) + +Within this vicious loop, you need to constantly avoid two outcomes: + +* You set the limit too high and thus **compromise system reliability** by overwhelming your services. Time to lower the limit and re-assess. +* You set the limit too low and **waste resources**. Your Elasticsearch cluster may be capable of handling more concurrency than you're providing—at least for now. Time to raise the limit and re-assess. + +Not only do you need to perform this balancing act on a per-sink basis and on each Vector instance—that may be a *lot* of application points in your system—but the optimal rate is an elusive target that shifts along with changes in a number of factors: + +* The number of Vector instances currently sending traffic +* The current capacity of downstream services +* The volume of data you're currently sending + +These changes are especially pronounced in highly elastic environments, like [Kubernetes], that are essentially *designed* to let you tweak cluster topologies, configuration, and much more with very little friction, which compounds the problem. + +And don't forget, of course, that this chasing-the-dragon decision loop has its own cognitive and operational costs. + +## The solution: Adaptive Request Concurrency + +We feel strongly that Vector's **Adaptive Request Concurrency** (ARC) feature provides a qualitatively better path than rate limiting. With ARC [enabled](#the-role-of-configuration) on any given sink, Vector determines the optimal network concurrency based on current environment conditions and continuously re-adjusts in light of new information. + +Here's how that plays out in some example scenarios: + +Change | | Response +:------|:-:|:-------- +**You deploy more Vector instances** | ➔ |Vector automatically redistributes HTTP throughput across both current and new instances +**You scale up your Elasticsearch cluster** | ➔ | Vector automatically increases concurrency to take full advantage of the new capacity +**You scale your Elasticsearch cluster back down** | ➔ | Vector lowers concurrency to avoid any risk of destabilizing the cluster (while still taking full of advantage of the now-decreased bandwidth) +**Your Elasticsearch cluster experiences a temporary outage** | ➔ |Vector lowers concurrency dramatically and provides backpressure by [buffering][buffer] events + +With ARC, these scenarios require no human intervention. Vector quietly hums along making these decisions for you with a speed and granularity that rate limits simply cannot provide. + +## How it works + +ARC in Vector is based on a decision-making process that’s fairly simple at a high level. When Vector POSTs data to downstream services via HTTP, it continuously keeps track of downstream service performance and uses that information to make precise concurrency decisions. + +The diagram below shows Vector's decision chart: + +![The Adaptive Request Concurrency decision chart](/img/adaptive-concurrency.png) + +With ARC enabled, Vector watches for significant movements in two things: the round-trip time (RTT) of requests and HTTP response codes (failure vs. success). + +* If the RTT is declining/constant and/or response codes are consistently successful (200-299), Vector sees 🟢 and increases the throughput linearly. This is the "additive increase" in AIMD. +* If the RTT is increasing and/or response codes consistently indicate failure—codes like `429 Too Many Requests` and `503 Service Unavailable`—Vector sees 🟡 and exponentially decreases concurrency. This is the "multiplicative decrease" in AIMD. + +This decision tree is always active and Vector always "knows" what to do, even in extreme cases like total service failure. + +### The role of configuration + +Vector never stops quietly making the linear up vs. exponential down decision in the background, and it works out of the box with zero configuration beyond enabling the feature, which is currently on an opt-in basis in version 0.11. You can enable ARC in an HTTP sink by setting the [`request.concurrency`][request_concurrency] parameter to `adaptive`. Here's an example for a Clickhouse sink: + +```toml +[sinks.clickhouse_internal] +type = "clickhouse" +inputs = ["log_stream_1", "log_stream_2"] +host = "http://clickhouse-prod:8123" +table = "prod-log-data" +request.concurrency = "adaptive" +``` + +There's also room for fine-tuning if you find yourself needing additional knobs: + +* **Buffering**. What happens when Vector needs to lower concurrency and thus throttle the output? What happens to data that needs to be sent later? Vector lets you choose between an on-disk and an in-memory [buffer] and to set a [max_size] for that buffer. The `memory` buffer is the default, which maximizes performance, but you can always choose `disk` if your use case requires stronger durability guarantees. As always, this can be configured on a per-sink basis. +* **The adaptive concurrency algorithm itself**. In general, you shouldn't need to adjust the algorithm, but in case you need to resort to that, there are three parameters available: + * `decrease_ratio` — This determines how rapidly Vector lowers the limit in response to failures or higher latency. + * `ewma_alpha` — Vector uses an exponentially weighted moving average (EWMA) of past RTT measurements as a reference to compare with the current RTT. The `ewma_alpha` parameter determines how heavily new measurements are weighted compared to older ones. + * `rtt_threshold_ratio` — The minimal change in RTT necessary for the algorithm to respond and adjust concurrency; changes below that threshold are ignored. + +The defaults should work just fine for these parameters in most cases, but we know that some scenarios may call for a highly targeted approach. + +## How we built it + +The development process behind ARC was highly methodical and data-driven. To summarize: + +* Customer feedback has pinpointed concurrency management as a pain point since very early in the life of Vector. +* The initial foray in addressing the problem came in [RFC 1858], which called for a qualitatively better option for users and [gestured toward][prior_art] some possible inspirations. +* Our engineers ultimately opted for a solution deeply inspired by analogous work on the Netflix engineering team, which is beautifully summarized in the [Performance Under Load] piece on their blog. Our respective approaches utilize an [additive-increase/multiplicative-decrease][aimd] (AIMD) algorithm inspired by TCP [congestion control] algorithms. We'll have a lot more to say about this here on the blog next week. If you want to see the in-depth discussion that drove this process, see GitHub [issue #3255][issue_325] on the Vector repo. There you'll see a pretty epic back and forth within our engineering team along with a slew of visualizations. It's quite the read. +* As Netflix is largely a Java shop and there was nothing immediately usable "off the shelf" in the Rust ecosystem, we needed to create our own Rust implementation, which you can see in the [adaptive_concurrency] module. Of special importance is the concurrency [Controller], which is responsible for the linear up/exponential down decision that I alluded to above. +* For testing, the team mostly relied on our in-house [http_test_server], a pretty straightforward but highly customizable HTTP server written in Go. + +It took several months, some hefty PRs, and even a handful of [dead ends], but we think that both the process and the end result are wholly consistent with the fastidious approach we strive for in building Vector. + +## More to come + +Next week, we'll follow up on this announcement with a post from Timber's [Bruce Guenter], the lead engineer behind ARC, that provides a far more in-depth look at how this feature was implemented. Bruce has quite an intricate story to tell and some great visualizations, so we urge you to tune in. + +Going forward, we'll continue listening to Vector users and incorporating their feedback on concurrency management into Vector's roadmap. We're fully open to refining the underlying algorithm and providing more configuration knobs in a future release if that serves our users. There's currently an [open issue], for example, that calls for exploration of an alternative gradient algorithm (also inspired by Netflix's work), and some lively internal discussions are already pointing the way to next steps. + +For now, we're quite confident that ARC in Vector 0.11, even in its initial state, should immediately improve the experience of users that rely on downstream HTTP services. + +[aimd]: https://en.wikipedia.org/wiki/Additive_increase/multiplicative_decrease +[adaptive_concurrency]: https://github.com/timberio/vector/tree/master/src/sinks/util/adaptive_concurrency +[bruce guenter]: https://github.com/bruceg +[buffer]: /docs/reference/configuration/sinks/http/#buffer +[clickhouse]: /docs/reference/configuration/sinks/clickhouse +[congestion control]: https://en.wikipedia.org/wiki/TCP_congestion_control +[controller]: https://github.com/timberio/vector/blob/master/src/sinks/util/adaptive_concurrency/controller.rs#L23-L31 +[dead ends]: https://github.com/timberio/vector/pull/3671 +[elasticsearch]: /docs/reference/configuration/sinks/elasticsearch +[http_test_server]: https://github.com/timberio/http_test_server +[issue_325]: https://github.com/timberio/vector/issues/3255 +[kubernetes]: https://kubernetes.io +[max_size]: /docs/reference/configuration/sinks/http/#buffer.max_size +[open issue]: https://github.com/timberio/vector/issues/3887 +[performance under load]: https://medium.com/@NetflixTechBlog/performance-under-load-3e6fa9a60581 +[prior_art]: https://github.com/timberio/vector/blob/master/rfcs/2020-04-06-1858-automatically-adjust-request-limits.md#prior-art +[rate limit]: /docs/reference/configuration/sinks/http/#rate-limits-adapative-concurrency +[rate_limit_duration_secs]: /docs/reference/configuration/sinks/http/#request.rate_limit_duration_secs +[rate_limit_num]: /docs/reference/configuration/sinks/http/#request.rate_limit_num +[request_concurrency]: /docs/reference/configuration/sinks/http/#request.concurrency +[rfc 1858]: https://github.com/timberio/vector/blob/master/rfcs/2020-04-06-1858-automatically-adjust-request-limits.md +[rust]: https://rust-lang.org +[sinks]: /docs/reference/configuration/sinks +[sources]: /docs/reference/configuration/sources +[splunk]: https://splunk.com +[transforms]: /docs/reference/configuration/transforms +[vector]: / diff --git a/docs/content/en/blog/datadog-acquisition.md b/docs/content/en/blog/datadog-acquisition.md new file mode 100644 index 0000000000000..d541843da5b49 --- /dev/null +++ b/docs/content/en/blog/datadog-acquisition.md @@ -0,0 +1,23 @@ +--- +title: "Accelerating Vector with Datadog" +description: "Timber (and Vector) have been acquired by Datadog" +date: "2021-02-11" +authors: ["binarylogic", "zsherman"] +badges: + type: announcement +tags: ["datadog", "acquisition"] +--- + +We're excited to announce that Timber and Vector are now officially part of [Datadog][datadog]! + +When we started building Vector, we set out to provide an entirely new kind of data pipeline. We were guided by a belief that when it comes to collecting, transforming, and routing observability data, teams shouldn’t have to accept trade-offs between cost, performance, reliability, and security. They also shouldn’t have to stitch together disparate tools just to get their data from point A to B; the ideal solution should be simple, yet robust, and unify the entire pipeline. We’ve dedicated ourselves to that challenge, and we’re proud of the platform we’ve created. + +We started talking to the team at Datadog back in 2017. They have a unique ability to take deep technical innovation and make it accessible to engineering teams through an intuitive and seamless user experience. We’ve always admired their focus on solving real customer problems and engineering excellence, and the breadth of their quality integrations—something we’ve sought to emulate through our work with Vector. + +Since we launched the project in 2019, Vector has grown beyond our expectations. It is currently downloaded millions of times per month and used by hundreds of forward-thinking enterprises to collect, process, and take control of their observability data. This growth has significantly intensified the demands on the project and our team, dramatically increasing our integration count, creating unprecedented performance challenges, and adding complex enterprise requirements. + +Joining Datadog means that Vector now has a safe, sustainable, long-term home where we can continue to evolve the project to meet the ever-changing needs of modern engineering teams at scale. We will have the resources to expand the team and execute on an ambitious roadmap, all while drawing on the years of observability experience that the Datadog team brings to the table. We plan to double down on Vector’s reliability and performance, solidifying it as the fastest and most reliable observability data platform, and to introduce numerous features designed for enterprise scale deployments of mission-critical observability pipelines. + +Without the Vector community, this project would not be what it is today. You all have contributed heavily to the life of this project, providing us with more feedback, GitHub issues, pull requests, feature requests, and lively Discord discussions than we can count. We give our sincere thanks to everyone who has taken part in building something that we can all be proud of, and hope to have you with us as we enter this next chapter. + +[datadog]: https://www.datadoghq.com diff --git a/docs/content/en/blog/graphql-api.md b/docs/content/en/blog/graphql-api.md new file mode 100644 index 0000000000000..661b1c618b9a9 --- /dev/null +++ b/docs/content/en/blog/graphql-api.md @@ -0,0 +1,238 @@ +--- +title: "The new GraphQL API for Vector" +description: "Extending observability into your own apps and infrastructure." +date: "2020-12-08" +authors: ["leebenson"] +badges: + type: announcement + domains: ["graphql api", "observability"] +tags: ["graphql", "api", "metrics"] +--- + +Although Vector is an observability tool, it's nonetheless important to be able +to observe Vector itself, especially in production environments where it serves +as critical infrastructure. That's why we're excited to announce the new [Vector +GraphQL API](https://vector.dev/docs/reference/api/), available in +[v0.11.0](https://vector.dev/releases/0.11.0/). + +The API enables ad-hoc querying of: + +- Your Vector topology, including + [`sources`](https://vector.dev/docs/reference/sources/), + [`transforms`](https://vector.dev/docs/reference/transforms/) and + [`sinks`](https://vector.dev/docs/reference/sinks/). +- Uptime and health information. +- Event processing, byte processing, and error metrics, both per component and + in aggregate across the Vector instance. +- Changes to your pipeline configuration, in real time. + +This is just the beginning. In the near future, the API will enable you to both +observe _and_ control Vector remotely, programmatically, and on demand. Stay +tuned! + +## Take it for a spin in our live playground + +Try our new [**GraphQL public playground +today**](https://playground.vector.dev:8686/playground), which enables you to +execute queries against a live Vector instance that we host and manage: + +![Vector GraphQL API Public Playground](/img/blog/vector-api-public-playground.png) + +Here are a few queries you can try: + +### Health and uptime + +See how long it's been since Vector last restarted, with streaming uptime that +updates every second: + +```graphql +subscription { + uptime { + seconds + timestamp + } +} +``` + +### Get configured topology + metrics + +Get sources, transforms, and sinks configured by +[`vector.toml`](https://vector.dev/docs/setup/configuration/), along with total +events, bytes, and errors processed per component: + +```graphql +query { + components { + __typename + name + processedEventsTotal { + processedEventsTotal + } + ... on Sink { + processedBytesTotal { + processedBytesTotal + } + } + } +} +``` + +### Hardware metrics + +Get insight into the hardware Vector's running on, from memory and CPU usage to +network activity and more. + +```graphql +query { + hostMetrics { + memory { + totalBytes + freeBytes + usedBytes + activeBytes + availableBytes + inactiveBytes + buffersBytes + cachedBytes + sharedBytes + wiredBytes + } + network { + receiveBytesTotal + receiveErrsTotal + receivePacketsTotal + transmitBytesTotal + transmitErrsTotal + transmitPacketsDropTotal + transmitPacketsTotal + } + filesystem { + freeBytes + totalBytes + usedBytes + } + cpu { + cpuSecondsTotal + } + swap { + freeBytes + totalBytes + usedBytes + swappedInBytesTotal + swappedOutBytesTotal + } + loadAverage { + load1 + load5 + load15 + } + disk { + readBytesTotal + readsCompletedTotal + writtenBytesTotal + writesCompletedTotal + } + } +} +``` + +## Enabling the Vector GraphQL API + +The API is an opt-in feature that spawns an HTTP server to accept queries. + +To enable, open your `vector.toml`, and add the following: + +```toml +[api] + enabled = true + address = "127.0.0.1:8686" # optional. Change IP/port if required +``` + +After restarting Vector, you can access an API playground at +[http://localhost:8686/playground](http://localhost:8686/playground). + +## Why we chose GraphQL + +The Vector API uses [GraphQL](https://graphql.org), a simple, type-safe, +flexible query language. + +We chose GraphQL over REST or gRPC for a few reasons: + +- It's type safe. Clients can introspect schema and discern whether a query is + valid before it's executed. +- Relational data (like Vector topology) is natural to model and query for. +- Data can be streamed via subscriptions over WebSockets, making it ideal for + high-frequency metrics and a pub/sub pattern for observing topology changes. +- Data is returned in pure JSON, making it simple, readable, and easy to parse. +- There's [great language/library + tooling](https://github.com/chentsulin/awesome-graphql), making it trivial to + interop with existing applications. +- Compile-time type safety in Rust, via + [async-graphql](https://github.com/async-graphql/async-graphql) (server) and + [graphql-client](https://github.com/graphql-rust/graphql-client). +- Universal browser support, making it an ideal protocol for web usage (or + apps!). + +## Our first API clien: `top` + +To help you visualize your Vector instance in action, +[v0.11.0](https://vector.dev/releases/0.11.0/) also brings you `vector top`, our +new terminal dashboard CLI tool powered by the Vector GraphQL API. + +To enable it, run: + +```bash +vector top # pass --url for remote observability +``` + +On Linux, Windows and macOS, you'll get an interface like this: + +![Vector top](/img/blog/vector-top.png) + +This will display your configured components and metrics, updating +every second (pass a millisecond `--interval` to adjust). If you run Vector in +[watch mode](https://vector.dev/docs/reference/cli/#vector_watch_config), it'll +even pick up topology changes automatically. + +I'll be telling you more about `vector top` soon in a dedicated blog post. + +## What's next? + +This release introduces the API and a sample client, but we're just getting +started. In future releases, we'll be expanding the API's capabilities to +include: + +- Validating and changing configuration programmatically. So far, all of our + queries have been read-only. Future versions will include GraphQL mutations + that allow changes to a running Vector pipeline (think: HTTP POST-style + requests). + +- An exciting new web UI for visualising and interacting with topology. + +- Component-specific types and metrics that can provide much deeper and more + granular insight into what's happening in your topology + +Follow us at [@vectordotdev](https://twitter.com/vectordotdev) to be notified of +updates. + +## Further reading + +GraphQL is an API protocol introduced by Facebook. You can learn more at +[https://graphql.org](https://graphql.org) + +For clients and language support, check out [Awesome +GraphQL](https://github.com/chentsulin/awesome-graphql), a curated list of +libraries and other helpers. + +For a deeper dive into the currently supported fields in the Vector API, your +best source of information is the "Docs" sidebar in the API playground. As a +type-safe interface, GraphQL is self-documenting. Review the inline comments to +learn more about what a field returns. We'll eventually add to this with +dedicated API docs, but this is a great way to get started. + +In future posts we'll be exploring the GraphQL ecosystem in more detail and +explaining the mechanics of what made GraphQL a winning choice for the Vector +API, over some of the alternatives such as REST or gRPC ‐ including a deep +dive into Rust libs and code snippets. + +Stay tuned! diff --git a/docs/content/en/blog/how-we-test-vector.md b/docs/content/en/blog/how-we-test-vector.md new file mode 100644 index 0000000000000..e44bfeab401be --- /dev/null +++ b/docs/content/en/blog/how-we-test-vector.md @@ -0,0 +1,391 @@ +--- +title: "How we test Vector" +description: "A survey of techniques we've found useful" +date: "2020-07-13" +authors: ["lukesteensen"] +badges: + type: post +tags: ["testing", "tests"] +--- + +When we set out to build Vector, we knew that reliability and performance were +two of our top priorities. We also knew that even the best of intentions would +not be enough to make certain those qualities were realized and reflected in our +users' production deployments. Since then, we've been continuously evolving and +expanding our approach to achieving that level of quality. + + + +There are a few factors that make ensuring robustness a particularly difficult +task for software like Vector: + +1. It's relatively new and not as "battle tested" as more widely deployed + software. +1. The vast majority of its functionality lives at the edges, interfacing with + various external systems. +1. Instead of a monolithic application designed for a single task, it is + a collection of components that can be assembled into a near-infinite number + of configurations. + +This challenge has given us a unique opportunity to apply wide variety of +testing techniques: + +* Example-based testing + * Unit tests + * Integration tests +* Generative testing + * Property-based testing + * Model-based testing + * Fuzz testing +* Black-box testing + * Performance tests + * Correctness tests + * Reliability tests + +While there's no one perfect solution to overcome these difficulties, we've +found that the combination of these techniques at different layers of the stack +has given us a good level of confidence in Vector's behavior. + +In this post, we'll discuss briefly how we're using each of these types of +tests, their strengths and weaknesses, as well as any tips we have for using +them effectively. + +## Example-based testing + +We'll start off with the types of tests you're likely most familiar with, the +humble unit and integration tests. These are the bread and butter of almost +every test suite, and for good reason. + +We group them into "example-based" because they both follow the same general +pattern. As the developer, you come up with an example input, you have your code +process that example, and then you assert that the outcome is what you expected. + +A great deal has been written on these types of tests already, so we'll try to +keep this section brief and focused on situations where these techniques start +to break down. + +### Unit tests + +A unit test is generally defined by the idea of isolation. This can mean +different things to different people, but a common definition is that the test +is both isolated from the outside world (i.e. no network calls, reading files, +etc) and exercises a single component of the system (e.g. one function, class, +etc). + +In Vector, we've found unit tests to be a particularly great fit for our +transforms. This makes sense, since transforms are effectively isolated +functions that take events in and return events out. For the same reason, we +tend to use unit tests extensively around the encoder portions of our sinks. + +For other types of components, so much of the functionality is focused on +communication with external systems that it can be difficult to isolate logic +enough for a unit test. As much as possible, we try to critically assess that +difficulty and use it to help find ways we can refactor the design to be more +modular and therefore amenable to unit testing. Unit tests are an excellent +source of design feedback, so we want to feel that pain and refactor when +they're difficult to write. + +That being said, there are two specific places we often run into the limitations +of unit tests. The first and more obvious is around pieces of code that are +fundamentally not isolated. The second situation has to do with the size of the +input space and number of potential paths through the component under test. As +an example-based testing strategy, the effectiveness of unit tests comes down to +the developer's ability to provide a thorough set of example inputs. This +becomes exponentially more difficult with each logical branch, and requires +recognizing paths you weren't considering when you initially wrote the code. + +Takeaways: + +* Isolation makes unit tests simple, fast, and reliable. +* If something is difficult to unit test, refactor until it's easy. +* As a human, be wary of your ability to think up exhaustive example inputs. + +### Integration tests + +The category of integration tests is a bit of a catch-all. Roughly defined, +they're example-based tests that are explicitly not isolated and focus on the +interaction between two or more components. + +Given Vector's focus on integrating with a wide variety of external systems, we +have a higher ratio of integration tests than your average system. Even once +we've done all we can to isolate logic into small, unit-testable functions, we +still need to ensure the component as a whole does what it's supposed to. If +unit tests tell you that something works in theory, integration tests tell you +that it _should_ work in practice. + +Similar to unit tests, there are two major downsides to integration tests. The +first is the same problem unit tests have with exhaustiveness, but intensely +magnified. Because they often cover the interaction of multiple whole systems, +integration tests will virtually never cover the combinatorial explosion of +potential execution paths. Second, integration tests are often simply a pain to +write and maintain. Given their dependence on external systems, they can be +tedious to write, slow to run, and often flaky if their environment isn't set up +just so. + +Takeaways: + +* While they can be a pain, integration tests are a valuable sanity check that + your system will actually work for users. +* Don't overuse them trying to cover every possible scenario, because you can't. + +## Generative testing + +The idea of generative testing is a direct response to the shared shortcoming of +example-based strategies like unit and integration testing. Humans are bad at +visualizing very large state spaces, and the state space of your code's possible +inputs and execution paths is enormous. You also bring all the same biases when +writing tests as you did when writing the original code. + +Generative tests address these issues by taking the human out of the equation +and having the computer generate millions of example inputs. The trade-off is +that since you aren't simply hard-coding a list of inputs and their expected +outputs anymore, you're forced to come up with more creative ways of identifying +failures. + +### Property-based tests + +A simple way to think about property-based tests is that they are unit tests +where the computer comes up with random example inputs. Since the test author +can no longer provide the expected output along with those example inputs, they +instead declare certain _properties_ that must hold true across any combination +of input and output. A classic example is testing a function that reverses +a list against the property that any list reversed twice must be equal to +itself. + +While this is something you could do with no tooling support at all, there are +some pretty advanced libraries that make things easier (e.g. the venerable +[quickcheck][1] and more recent [hypothesis][2]). Beyond simple random input +generation, these tools often include valuable features like customizable +generators and shrinking, which attempts to simplify failing inputs as much as +possible before presenting them to you. + +In Vector, we use property-based tests to exercise our internal data +serialization logic. We want to make sure that arbitrary input events can go +through the full serialization and deserialization process without losing any +information along the way. We use the Rust [proptest][3] library to generate +input events and then test that the output event is equal to the input after +a full round trip through the system. Since this is an isolated, deterministic +function, we can quickly and easily run millions of iterations of this test. + +While property-based tests are certainly better at covering the input space than +unit tests, simple random generation of possible inputs can become a limitation. +Without some sense of what makes an input "interesting", property-based tests +have no way of intelligently exploring the space. In some cases, this can +meaning burning a lot of CPU without necessarily finding any new failures. + +Takeaways: + +* Property-based tests help uncover more edge cases in your system's logic. +* Like unit tests, they're most effective when applied to isolated components. +* They can't directly test "correctness", only that your given set of invariants + is upheld. + +### Model-based testing + +One particularly interesting application of property-based test tooling is +something we've seen called [model-based testing][4]. The basic idea is that you +implement a simplified model of your system (e.g. a hashmap is a simple model of +a key-value store), and then assert that for all possible inputs, your system +should produce the same output as the model. + +Vector inherited some of these tests from [cernan][5], where its file tailing +module originated (thanks [Brian][6]!). It works by generating random sequences +of file writes, reads, rotations, truncations, etc, and applying them to both +a simple in-memory model of a file system as well as the actual file system being +tailed by our file watcher implementation. It then verifies that the lines +returned by our watcher are the same as those returned from the simplified +simulation. + +In this strategy, the model is acting as an oracle and the quality of the test +depends on that oracle actually behaving correctly. That makes it a good match +for components with a relatively simple API but deeper inner complexity due to +performance optimizations, persistence, etc. Like normal property-based tests, +they may have trouble efficiently exploring the state space of especially +complex components. + +Takeaways: + +* Model-based tests are a good match for components with deep implementations + but relatively shallow APIs. +* They rely on a model implementation simple enough to be "obviously correct", + which is not possible for all systems. + +### Fuzz testing + +At its most simplistic, fuzz testing is just feeding your program random data +and seeing if it breaks. In that sense, you can think of it as a kind of +external property-based testing, where the property is that your system should +not crash. This might not sound terribly interesting on its own, but modern +tools (e.g. [american fuzzy lop][7]) have developed a superpower that gives them +a massive advantage over traditional property-based testing: using code-coverage +information to guide input generation. + +With this critical feedback loop in place, tools can see when a particular input +led to a new execution path. They can then intelligently evolve these +interesting inputs to prioritize finding even more new paths, zeroing in far +more efficiently on potential edge cases. + +This is a particularly powerful technique for testing parsers. Where normal +property-based tests might repeatedly attempt to parse random strings and never +happen upon anything remotely valid, a fuzz testing tool can gradually "learn" +the format being parsed and spend far more time exploring productive areas of +the input space. + +Many of the parsers we use in Vector are pre-built for various data formats and +have seen some fuzz testing in their upstream library. We did, however, write +our `tokenizer` parser from scratch and it's unique in that it's not for +a specific format. Instead, it gives a best-effort attempt at breaking the input +up into logical fields. We've found it to be a great fit for fuzz testing +because the way that it handles strange and misshapen inputs is less important +than that fact that it will not panic and crash the program. + +One of the limitations of AFL-style fuzzing is the focus on random byte strings +as inputs. This matches up really well with parsers, but maybe not that many +other components in your system. The idea of [structure-aware][12] fuzzers looks +to address this. One such tool is [fuzzcheck][8], which we've been starting to +explore. Instead of byte strings, it works directly with the actual types of +your program. It also runs in-process with your system, making it simpler to +detect not just panics but also things like simple test failures. In many ways, +it has the potential to combine the best of both fuzz testing and property-based +testing. + +Takeaways: + +* Feedback loops allow fuzz testing to efficiently explore extremely large input + spaces, like those of a parser. +* Tools are advancing rapidly, making fuzz tests more convenient for more types + of situations. + +## Black-box testing + +Even if all of the above testing strategies worked flawlessly and got us to 100% +branch coverage, we still wouldn't know for certain that Vector was performing +at the level we expect. To answer that question, we need to run it as users run +it and observe things like throughput, memory usage, CPU usage, etc. + +This is where the [`vector-test-harness`][9] comes in. These are high-level, +black-box tests where we run various Vector configurations on deployed hardware, +generating load and capturing metrics about its performance. And since they're +black-box tests (i.e. they require no access to or knowledge of Vector +internals), we can also provide configurations for similar tools to see how they +compare. + +### Performance tests + +The performance tests in our harness focus on generating as much load as the +given configuration can handle and measuring throughput, memory use, etc. These +tests capture our real-world performance in way that micro-benchmarks can't, and +they give us a very useful point of comparison with other tools that may have +made different design decisions. If one of the metrics looks way off, that gives +us a starting point to investigate why we're not performing as well as we think +we should. + +Since these tests are almost completely automated, we'll soon be looking to +start running them on a nightly basis and graphing the results over time. This +should give us an early warning signal in the case of a serious performance +regression, and help us visualize our progress in making Vector faster and more +efficient over time. + +Takeaways: + +* Behavior under load is an important part of the user experience and deserves + a significant testing investment. +* Regular, automated testing can generate valuable data for catching performance + issues before they reach users. + +### Correctness tests + +Alongside those performance tests, we also have a set of tests we call +correctness tests. The setup is quite similar to the performance tests, but the +focus is different. Instead of generating as much load as we can and watching +things like throughput and system resource use, we instead run each +configuration through different interesting scenarios to see how they behave. + +For example, we have correctness tests around various flavors of file rotation, +disk persistence across restarts, nested JSON messages, etc. While these are +behaviors that we also test at various lower levels (e.g. unit and integration +tests), covering a handful of important cases at this level of abstraction gives +us some extra confidence that we are seeing exactly what our users will see. + +The ability to compare behaviors across competing tools is another bonus. Going +through the process of setting up those tests gets us valuable experience +working with those other tools. We can see what works well in their +configuration, documentation, etc, and identify areas where we can improve +Vector as a result. + +Takeaways: + +* Taking time to "zoom out" and test your system as a user would can help + uncover blind spots and sanity-check behavior. +* Evaluating similar tools can help build a better understanding of user + expectations. + +### Reliability tests + +A third category that we're currently working to integrate into +`vector-test-harness` is something we're calling reliability tests. These are +similar to performance and correctness tests, except that they're designed to +run continuously and flush out errors that may occur only in rare environmental +circumstances. + +In a way, they're like simple, integration-level fuzz tests where changes in the +environment over time provide input randomness. For example, running a week-long +reliability test of our S3 sink exposed a bug where a specific kind of network +failure could lead to duplicate data when the retried request crossed +a timestamp boundary. That is not the type of failure we expect to be able to +induce in a local integration test, and the relevant factors (time and network +conditions) were not those exercised by standard fuzzing or property-based +testing. + +The main challenge with these kinds of tests, aside from getting the requisite +environment and harnesses up and running, is capturing sufficient context about +the environment at the time of the failure that you stand a chance at +understanding and reproducing it. This task itself is a great test for our +internal observability, and any issue we can't reproduce is a sign that our +logging and metrics data needs to be improved. + +Another issue with these tests is that the vast majority of the time, nothing +particularly interesting is happening. Since we want to find bugs as quickly as +possible, we can supplement the randomness of the environment by injecting +various types of faults on our own. There are a variety of tools for this, such +as [Toxiproxy][10] and [Namazu][11]. + +Takeaways: + +* The environment is an important source of uncertainty in your system that is + difficult to simulate accurately. +* Observing bugs from a user's perspective incentivizes good internal + observability tooling + +## Conclusion + +Even with all of the above in place, we're continuously exploring ways to +further increase our confidence in the reliability and performance of Vector. +That could mean anything from expanding our current test suites to be more +thorough to adopting entirely new techniques to help cover more possible +executions (e.g. [simulation][15] or [metamorphic][16] testing). + +With some users running a Vector process on nearly every host in their +infrastructure, ensuring an extremely high level of robustness and efficiency is +paramount. At the same time, those needs must be balanced with increasing +Vector's functional capabilities. Finding the right balance is an ongoing +challenge as the project grows and matures. + + + +[1]:http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html +[2]: https://hypothesis.works/articles/what-is-property-based-testing/ +[3]: https://github.com/AltSysrq/proptest +[4]: https://medium.com/@tylerneely/reliable-systems-series-model-based-property-testing-e89a433b360 +[5]: https://github.com/postmates/cernan +[6]: https://github.com/blt +[7]: http://lcamtuf.coredump.cx/afl/ +[8]: https://github.com/loiclec/fuzzcheck-rs +[9]: https://github.com/timberio/vector-test-harness/ +[10]: https://github.com/Shopify/toxiproxy +[11]: https://github.com/osrg/namazu +[12]: https://github.com/google/fuzzing/blob/master/docs/structure-aware-fuzzing.md +[13]: https://github.com/rust-fuzz/cargo-fuzz +[14]: https://github.com/timberio/vector/blob/9fe1eeb4786b27843673c05ff012f6b5cf5c3e45/src/transforms/tokenizer.rs#L240-L249 +[15]: https://www.youtube.com/watch?v=4fFDFbi3toc +[16]: https://www.hillelwayne.com/post/metamorphic-testing/ diff --git a/docs/content/en/blog/introducing-vector.md b/docs/content/en/blog/introducing-vector.md new file mode 100644 index 0000000000000..2ef5c74998d76 --- /dev/null +++ b/docs/content/en/blog/introducing-vector.md @@ -0,0 +1,43 @@ +--- +title: Introducing Vector +description: "Hello World. Bringing Vector to life." +date: "2020-07-13" +authors: ["lukesteensen"] +badges: + type: announcement +tags: ["vector", "timber", "observability"] +--- + +Today we're very excited to open source the Vector project! Vector is a tool for building flexible and robust pipelines for your logs and metrics data. We're still in the early stages, but our goal with Vector is to dramatically simplify your observability infrastructure while making it easy to get more value from your data. + + + +## Why build Vector? + +We decided to build Vector because we believe that **existing tools take too narrow a view of the problem of building observability infrastructure**. Whether they're limited to working with a single storage system, not performant enough to handle your volume of data, or simply not flexible enough to let you do all the things you want with your data, the tools available today inevitably end up as a small part of a larger pipeline that your team must build and maintain. + +Assembling and maintaining these pipelines piecemeal can be a tough and unrewarding job. There's a dizzying array of tools that all seem to cover unique subsets of the overall capabilities you're looking to implement and there's no guarantee that any given two of them will work well together. Faced with this, teams tend towards one (or a combination!) of three rough directions: (1) vendor-first, (2) trusted open source stacks, and (3) build your own. + +**Vendor-first** is tempting, but usually expensive and invasive. The vendor provides their custom collectors and client libraries for you to integrate, and you simply ship them all your data. In the end, you're limited to their capabilities, locked in to their ecosystem, and paying more and more every month as your data volume grows. + +**Trusted open source stacks** give you a bit more flexibility, but with a significantly higher maintenance burden. You have to pick the right implementation of each sub-component (eight years ago there were already at least [20 implementations of statsd][statsd]), ensure they'll work together well, and then maintain and scale them for the lifetime of the infrastructure. Adding new capabilities or changing storage backends generally means adding a whole new set of components to run, often overlapping with some you're already running. + +Finally, there are teams with the resources and organizational willpower to **build their own solutions**. This gives you an enormous amount of flexibility and power, but with an equally impressive price tag in engineering time. + +## What is Vector? + +So what exactly is Vector and how is it a better solution to this problem? At first glance, Vector looks a lot like some other logging infrastructure tools you might be familiar with. It can ingest data in a number of ways (tailing files, syslog messages over the network, etc), it can process that data in flight (regex and JSON parsing, filtering, sampling, etc), and it can send the raw or processed data to a variety of external systems for storage and querying. Whether it's rsyslog, logstash, fluentd, or another example, it's more likely than not that something with this basic set of features is running in your infrastructure. + +On top of this basic functionality, Vector adds a few important enhancements: + +1. A **richer data model**, supporting not only logs but aggregated metrics, fully structured events, etc +2. **Programmable transforms** written in lua (or eventually wasm) that let you parse, filter, aggregate, and otherwise manipulate your data in arbitrary ways +3. **Uncompromising performance and efficiency** that enables a huge variety of deployment strategies + +The end result is a tool that can **be** your pipeline, rather than just another component in it. We hope to enable the full flexibility and power of a custom built solution with a tiny fraction of the required investment. There have been a few other projects aimed in this direction (heka and cernan are two big inspirations), but with Vector we think we can take the ease of use and breadth of capabilities to another level. + +## Try it out! + +We're still very early in the process of building Vector, but it's already at a stage where we believe it's competitive with existing tools and ready to be trialled for production use. Not every feature mentioned above is present yet, but we're happy with the foundation and working quickly to flesh everything out. If you're interested in giving it a try, check out the project on GitHub, our docs, and please reach out! We'd love to hear about your use cases and are excited to see where we can take this project together. + +[statsd]: https://joemiller.me/2011/09/list-of-statsd-server-implementations diff --git a/docs/content/en/blog/kubernetes-integration.md b/docs/content/en/blog/kubernetes-integration.md new file mode 100644 index 0000000000000..64ae6a5a77e87 --- /dev/null +++ b/docs/content/en/blog/kubernetes-integration.md @@ -0,0 +1,127 @@ +--- +title: "First-class Kubernetes integration for Vector" +description: "Vector is now the backbone of observability on Kubernetes" +date: "2020-11-26" +authors: ["binarylogic"] +badges: + type: announcement + domains: ["kubernetes", "deployment", "ops"] +tags: ["kubernetes", "k8s", "aggregator"] +--- + +After months of development, [over 100 pull requests][pulls], and intensive QA in clusters producing over 20 terabytes of event data a day, we're pleased to announce our first-class [Kubernetes] integration for Vector in [version 0.11][v_0_11]. We strove to make even this initial integration rock solid and production ready because we aim to make Vector the default pipeline for all Kubernetes observability data. + +To cut straight to the chase, checkout the [installation instructions][install], otherwise read on for the details. + +## A new source for Kubernetes log data + +The crux of our Kubernetes integration for Vector is the new [`kubernetes_logs`][kubernetes_logs] source. This source does all of the following: + +* Automatically collects logs from all [Nodes][node_logging] in your cluster +* Automatically merges logs that are split due to the 16kb limit imposed by Docker +* Communicates with the Kubernetes API to [enrich][enriching] logs with Kubernetes metadata, including: + * Container name and image + * Pod uid, name, namespace, and labels + * Node name +* Provides robust filtering options for including and excluding Pods and individual containers within Pods + +This simple Vector configuration, for example, would suffice to send logs from *all* of your Nodes/Pods to [Elasticsearch]: + +```toml title="vector.toml" +[sources.k8s_all] +type = "kubernetes_logs" + +[sinks.es_out] +type = "elasticsearch" +inputs = ["k8s_all"] +host = "http://your-elasticsearch-cluster:9200" +index = "vector-k8s-%F" +``` + +Using this simple topology as a starting point, you can [transform][transforms] your log data in a wide variety of ways, ship it to [other sinks][sinks], and much more. + +## Adaptive concurrency + +Vector 0.11 also includes a feature called **Adaptive Request Concurrency** (ARC). ARC uses a battle-tested algorithm to automatically optimize concurrency limits for HTTP [sinks] based on downstream service responses. The benefit of ARC is that it enables you to safely move beyond static rate limiting when using systems like [Elasticsearch] and [Clickhouse]. Simply enable ARC with a single line of configuration and you can fully utilize your services' bandwidth while ensuring that Vector doesn't over-tax those systems. + +ARC isn't specific to Kubernetes but it *is* particularly useful in highly elastic Kubernetes environments, where static rate limiting runs the risk of underutilizing system resources and/or jeopardizing system reliability. For more info on ARC, check out our [announcement post][arc]. + +## Installing Vector in your Kubernetes cluster + +To install Vector in your Kubernetes cluster, check out our [Kubernetes installation documentation][install], which includes instructions for: + +* Standard installation using [kubectl] and [Kustomize] + +* Deployment using [Helm] + +Both installation options enable you to easily deploy Vector [agents][agent] to your Nodes. In an upcoming release, we'll also provide support for deploying Vector as a centralized [aggregator]. + +## Why Vector for your Kubernetes cluster? + +We all know that the Kubernetes ecosystem is _packed_ with options. The now-infamous CNCF landscape includes [over 90][tools] observability tools. Amidst such plenty, it's not surprising that many Kubernetes clusters run multiple observability tools side by side, often on the same Node or even in the same Pod. But when you run ever-more resource-hungry processes side by side, that can lead to **agent fatigue**, a costly problem that Vector tackles head-on. + +To give a real-world example of agent fatigue, let's look at a telecom enterprise before and after adopting Vector. + +### Before Vector + +Prior to adopting Vector, the company deployed four or more agents (!) on each of their Kubernetes Nodes: + +![The crowded Kubernetes Node](/img/blog/k8s-before.png) + +That's one agent for each of the following: logs, metrics, traces, and security (e.g. breach detection). And then on top of four agents per Node, they needed to run a cluster of observability data aggregators for cross-Node analysis and batching/archiving as well as a Kafka cluster in front of those aggregators (to address reliability and durability concerns). + +All together, those four agents consumed ~30% of the Node's computing resources, while Kafka/aggregator combination was the company's largest services in terms of resource usage (what!?). In total, a whopping ~40% of their resources were dedicated to observability infrastructure. And this resource intensity doesn't even include in the engineering time and effort required to deploy and manage all of it: + +![The crowded Kubernetes Node](/img/blog/k8s-resources-before.png) + +Although this is an extreme case, we'd bet that you can relate to some—though hopefully not all!—of these troubles. What makes this problem so pernicious is that it happens over time. This heavy resource usage was not the result of an elaborate master plan by these engineers; it was the byproduct of evolving company needs, fast-paced engineering, fragmentation in the observability space, and vendor lock-in. That last one can be a real killer. + +### After Vector + +By switching to Vector, the telecom company from the "before" scenario was able to consolidate the logs, metrics, and tracing agents: + +![The quiet Kubernetes Node](/img/blog/k8s-after.png) + +This reduced observability resource usage by 90%. This brought resource usage from 40% of the total down to 5%. In addition, Vector reduced Splunk data volume through sampling and cleaning, afforded by using AWS S3 as the system of record. All in all, Vector significantly reduced the overall observability costs. The result looked like this: + +![The quiet Kubernetes Node](/img/blog/k8s-resources-after.png) + +To summarize, adopting the new Vector-based architecture meant: + +* One observability tool +* One workflow to deploy and manage that tool +* Reduced infrastructure cost +* Reduced Splunk cost +* Reduced engineering and operations time +* Reduced lock-in, as the company can now modify their observability setup by re-configuring Vector rather than swapping out agents + +## More to come + +We're confident that this initial integration is up to the task of dramatically reducing observability costs and headaches in your Kubernetes cluster. But we do have more on the way here, including native tracing support for [OpenTelemetry]-compliant traces and a variety of new [Prometheus]-related features. + +We want Vector to become the backbone of observability in Kubernetes. If you share our vision of a single, ultra-fast, ultra-reliable, open-source observability platform, give us a try! As a user-first company, our entire engineering team is [actively engaged][chat] with our community and eager to work with you. + +{{< jump "/docs/setup/installation/platforms/kubernetes" >}} + +[agent]: /docs/setup/deployment/topologies/#distributed +[aggregator]: /docs/setup/deployment/topologies/#centralized +[arc]: /blog/adaptive-request-concurrency +[chat]: https://chat.vector.dev +[clickhouse]: /docs/reference/configuration/sinks/clickhouse +[enriching]: /docs/reference/configuration/sources/kubernetes_logs/#output +[elasticsearch]: /docs/reference/configuration/sinks/elasticsearch +[helm]: https://helm.sh +[install]: /docs/setup/installation/platforms/kubernetes/#install +[kubectl]: https://kubernetes.io/docs/reference/kubectl/kubectl +[kubernetes]: https://kubernetes.io +[kubernetes_logs]: /docs/reference/configuration/sources/kubernetes_logs/ +[kubernetes_logs_config]: /docs/reference/configuration/sources/kubernetes_logs/#configuration +[kustomize]: https://kustomize.io +[node_logging]: https://kubernetes.io/docs/concepts/cluster-administration/logging/#logging-at-the-node-level +[opentelemetry]: https://opentelemetry.io +[prometheus]: https://prometheus.io +[pulls]: https://github.com/timberio/vector/pulls?q=is%3Apr+sort%3Aupdated-desc+kubernetes+is%3Aclosed +[sinks]: /docs/reference/configuration/sinks/ +[tools]: https://landscape.cncf.io/card-mode?category=observability-and-analysis +[transforms]: /docs/reference/configuration/transforms/ +[v_0_11]: /releases/0.11.0/ diff --git a/docs/content/en/blog/vector-remap-language.md b/docs/content/en/blog/vector-remap-language.md new file mode 100644 index 0000000000000..d85ce7ac968c5 --- /dev/null +++ b/docs/content/en/blog/vector-remap-language.md @@ -0,0 +1,508 @@ +--- +title: Vector Remap Language +short: VRL +description: A fast and safe way to transform observability data +authors: ["binarylogic"] +date: "2021-02-15" +badges: + type: announcement + domains: ["remap"] +tags: ["vector remap language", "vrl", "dsl", "expression oriented"] +--- + +**Vector Remap Language** (VRL) is an [expression-oriented][expression_oriented] +language designed to work with observability data (logs and metrics) in a *safe* +and *performant* manner. It features a [simple syntax][vrl_expressions], a rich +set of [built-in functions][vrl_functions] tailored to observability use cases, +and [numerous features](#features) that set it far apart from other options. +This [0.12][0_12] release of Vector marks the official release of the language. + + + +VRL has been under intense but careful development for several months. We made +it available in beta beginning with the [0.11][0_11] release, but as of this +[0.12][0_12] release VRL is now generally available (GA). We're confident that +it's a *major* step forward for Vector and its users and the observability space +in general. Special thanks to [Jean Mertz][jean] and [Stephen Wakely][stephen] +for spearheading the VRL project. + +*To jump right into the language, [skip to the solution section](#solution). +Otherwise, read on for why we created the language.* + +## Preamble + +I know what you may be thinking: another custom language? With so many out +there, some of them poorly done, challenging to learn, and just plain +unnecessary, you can be forgiven for being wary of another one on the pile. Rest +assured that we decided to create VRL only when it became clear that a new +language was the best way to improve upon our existing story for transforming +data. + +But it's important to know at the outset that VRL is *not a programming +language* in the fullest sense. It lacks a wide range of programming constructs +that you find in all-purpose languages, such as loops, classes, modules, custom +functions, and IO access. This simplicity is *intentional*. We're confident that +Vector users will not chafe at the limitations of VRL and will in fact embrace +them as guarantors of sound design. + +## The problem + +Up to the 0.12 release, Vector has provided two types of transforms: **static +transforms** and **runtime transforms**. + +* Static transforms do exactly *one* particular thing and are configuration + based. The now-deprecated `remove_fields` transform, for example, would remove + the fields that you specify in your Vector configuration. + +* Runtime transforms enable you to modify event data using full-blown language + runtimes, such as [Lua][lua] and [WebAssembly][wasm] (Wasm). + +Both of these options have enabled our users to transform their data +successfully, but they have severe limitations that we needed to address with +VRL: + +1. Static transforms, while fast, are rigid, limited, and hard to manage. They + leverage a configuration syntax for expressing data transformations. As a + result, we've witnessed otherwise simple pipelines turn into hundreds of + lines of configuration. + +2. Runtime transforms are very robust, but users pay a steep performance and + safety cost when using them. The robustness of using full-blown programming + languages makes it very easy to write slow and error-prone programs that are + difficult to collaborate on across a team. + +The classic quadrant analysis looks something like this: + +{{< svg "/img/blog/vrl-quadrant-comparison.svg" >}} + +VRL eliminates this trade-off. Let's dig deeper on each of these points. + +### Configuration languages are bad at expressing data transformations {#config-languages} + +It's commonplace for observability pipelines to offer a rigid list of *static* +transforms that leverage a configuration syntax. Some call them "transforms", +others call them "filters" or "functions". If you zoom in, they make more sense +-- they perform a single task and make it difficult for users to do the wrong +thing. If you zoom out, they start to look like poorly designed programming +languages trying to be both a configuration *and* data transformation language. + +{{< quote >}} +If you zoom out, they start to look like poorly designed programming languages, +trying to be both a configuration *and* data transformation language. +{{< /quote >}} + +If you've worked with observability pipelines, it's not uncommon to have +hundreds of lines of configuration for relatively simple pipelines. + +To demonstrate, let's transform a common-log (Apache) coming from Docker, a very +common use case: + +```json +{ + "time": "2021-02-03T21:13:54.713161211Z", + "stream": "stdout", + "log": "5.86.210.12 - zieme4647 [03/Feb/2021:21:13:55 -0200] \"GET /embrace/supply-chains/dynamic/vertical HTTP/1.0\" 201 20574" +} +``` + +Parsing this log, without VRL, looks like this: + +{{< tabs default="Vector" >}} +{{< tab title="Vector" >}} +```toml title="vector.toml" +# ... sources ... + +# Parse the internal Syslog log +[transforms.parse_syslog] +type = "regex_parser" +inputs = ["parse_docker"] +patterns = ['^(?P\S+) (?P\S+) (?P\S+) \[(?[\w:/]+\s[+\-]\d{4})\] "(?\S+) (?.+?) (?\S+)" (?\d{3}) (?\S+)$'] +field = "log" + +# Remove Docker time and log fields since they are duplicative +[transform.remove_log] +type = "remove_fields" +inputs = ["parse_syslog"] +fields = ["time", "log"] + +# Coerce parsed fields +[transforms.coerce_fields] +type = "coercer" +inputs = ["remove_log"] +types.timestamp = "timestamp" +types.status = "int" +types.bytes_out = "int" + +# ... sinks ... +``` +{{< /tab >}} +{{< tab title="Logstash" >}} +```text title="logstash.conf" +# ... inputs ... + +filter { + grok { + match => { "message" => ["%{IPORHOST:[apache2][access][remote_ip]} - %{DATA:[apache2][access][user_name]} \[%{HTTPDATE:[apache2][access][time]}\] \"%{WORD:[apache2][access][method]} %{DATA:[apache2][access][url]} HTTP/%{NUMBER:[apache2][access][http_version]}\" %{NUMBER:[apache2][access][response_code]} %{NUMBER:[apache2][access][body_sent][bytes]}( \"%{DATA:[apache2][access][referrer]}\")?( \"%{DATA:[apache2][access][agent]}\")?", + "%{IPORHOST:[apache2][access][remote_ip]} - %{DATA:[apache2][access][user_name]} \\[%{HTTPDATE:[apache2][access][time]}\\] \"-\" %{NUMBER:[apache2][access][response_code]} -" ] } + remove_field => "message" + } + mutate { + remove_field => [ "time", "log" ] + } + date { + match => [ "[apache2][access][time]", "dd/MMM/YYYY:H:m:s Z" ] + remove_field => "[apache2][access][time]" + } + mutate { + coerce => { + "[apache2][access][body_sent][bytes]" => "integer" + "[apache2][access][response_code]" => "integer" + } + } +} + +# ... outputs ... +``` +{{< /tab >}} +{{< tab title="Fluentd" >}} +```text title="fluentd.conf" + + # ... source options ... + format apache2 + tag apache.access + + + + @type regexp + expression /^(?[^ ]*) [^ ]* (?[^ ]*) \[(? + + + @type record_transformer + remove_keys time,log + + +# ... outputs ... +``` +{{< /tab >}} +{{< /tabs >}} + + +Which results in this general output: + +```json +{ + "bytes_out": 20574, + "host": "5.86.210.12", + "method": "GET", + "resource": "/embrace/supply-chains/dynamic/vertical", + "protocol": "HTTP/1.0", + "status": 201, + "timestamp": "2021-02-03T23:13:55Z", + "client": "-", + "user": "zieme4647" +} +``` + +As you can see, configuration languages become verbose for even simple +pipelines, making them non-ideal for expressing data transformations. This is +because they have competing concerns: the better a language is at configuration, +the worse it is at data transformation. + +{{< quote >}} +The better a language is at configuration, the worse it is at data +transformation. +{{< /quote >}} + +Instead of conflating these concerns, like Logstash, Fluentd, and others, Vector +separates them, allowing you to choose your preferred configuration language +(TOML, YAML, or JSON) while offering a purpose-built language for data +transformation (VRL). But is VRL really necessary? Couldn't you leverage Lua, +Javascript, or any other existing language? + +### Runtime transforms are slow and unsafe {#runtime-problems} + +**Runtime** transforms enable you to modify event data using the full power of a +programming language runtime, such as Lua or Javascript. They're robust enough +to handle even the thorniest use cases, but they have significant downsides that +make them high-risk for critical infrastructure like observability pipelines: + +1. First, you pay a **significant performance penalty**. For example, on + average, Lua is about 60% slower than Vector's Rust-based static transforms, + and other runtimes like Javascript are even slower. + +2. Second, there are **severe security and safety risks** that make them show + stoppers for critical infrastructure like observability pipelines. Things + like the lack of memory-safety, dynamic code evaluation, access to IO, + unaudited dependency trees, lack of sandboxing, and all of the security risks + that come with that language runtime. + +3. Finally, the extreme optionality presents **easy foot-guns** that manifest + into real-world performance and reliability problems, making them difficult + to manage. + +Runtime transforms acted as robust escape hatches for Vector users, unblocking +exotic use cases and allowing us to learn more about the many ways people use +Vector. Still, we've seen the dark side of using them: + +* Unexpected malformed data bringing pipelines down and waking operators up in + the middle of the night. + +* A poorly managed dependency tree introducing severe security risks, + compromising their most sensitive data. + +* Slow performance unable to keep up with data volume fluctuations. + +* Complicated code leaving pipelines in an unmanageable state. + +Because of these risks we recommend static transforms if given the choice, but +you shouldn't have to choose... + +## Our solution: Vector Remap Language {#solution} + +Before I dive into the specifics of VRL, let's look at the Docker, common-log +(Apache) example from above. If you skipped to this section we'll be parsing the +following log: + +```json +{ + "time": "2021-02-03T21:13:54.713161211Z", + "stream": "stdout", + "log": "5.86.210.12 - zieme4647 [03/Feb/2021:21:13:55 -0200] \"GET /embrace/supply-chains/dynamic/vertical HTTP/1.0\" 201 20574" +} +``` + +Which can be achieved with the following VRL program: + +```ruby +. = parse_common_log!(.log) +.total_bytes = del(.size) +.internal_request = ip_cidr_contains("5.86.0.0/16", .host) ?? false +``` + +Resulting in this output: + +```json +{ + "host": "5.86.210.12", + "internal_request": true, + "user": "zieme4647", + "timestamp": "2021-02-03T23:13:55Z", + "message": "GET /embrace/supply-chains/dynamic/vertical HTTP/1.0", + "method": "GET", + "path": "/embrace/supply-chains/dynamic/vertical", + "protocol": "HTTP/1.0", + "total_bytes": 20574, + "status": 201 +} +``` + +As you can see, the above configuration is *significantly* easier to write, +read, and manage. Also, it maintains optimal performance and doesn't present the +[various security and safety](#runtime-problems) problems that come with runtime +transforms like Lua and Javascript. You'll notice we threw in an extra field, +`internal_request`, to demonstrate how VRL solves otherwise difficult tasks for +static transforms. + +The syntax was originally inspired by [jq] (note the `.` based paths), but +evolved into a simple multi-line language. For a deep dive into the language +constructs, check out the [reference documentation][vrl_reference]. Here you +will find a comprehensive list of [expressions][vrl_expressions], +[functions][vrl_functions], and [examples][vrl_examples]. + +### VRL principles and features {#features} + +VRL was designed to exploit two principles: *safety* and *performance*, while +maintaining flexibility. This makes VRL ideal for always-up, +performance-sensitive infrastructure like observability pipelines. To illustrate +how we achieve this, below is a VRL feature matrix across these two principles: + +| Feature | Safety | Performance | +|:--------------------------|:------:|:-----------:| +| [Progressive type safety] | ✅ | | +| [Fail safety] | ✅ | | +| [Memory safety] | ✅ | | +| [Ergonomic safety] | ✅ | ✅ | +| [Vector/Rust native] | ✅ | ✅ | +| [Stateless] | ✅ | ✅ | + +For more info on each click on the feature, but for the purposes of +demonstrating how VRL is unique, let's touch on the first two: *progressive type +safety* and *fail safety*. + +### Progressive type and fail safety + +A unique design decision behind VRL is its implementation of type and fail +safety. After seeing many users deal with pipeline instability due to runtime +errors, we made type and fail safety cornerstones. This makes VRL programs +**infallible**, ensuring that they will work as expected in production. Let's +demonstrate with an example, using the same Docker, common-log (Apache) example +from above. + +Given this log: + +```json +{ + "time":"2021-02-03T21:13:54.713161211Z", + "stream": "stdout", + "log": "5.86.210.12 - zieme4647 [03/Feb/2021:21:13:55 -0200] \"GET /embrace/supply-chains/dynamic/vertical HTTP/1.0\" 201 20574" +} +``` + +We want to parse it into this result: + +```json +{ + "host": "5.86.210.12", + "user": "zieme4647", + "timestamp": "2021-02-03T23:13:55Z", + "message": "GET /embrace/supply-chains/dynamic/vertical HTTP/1.0", + "method": "GET", + "path": "/embrace/supply-chains/dynamic/vertical", + "protocol": "HTTP/1.0", + "total_bytes": 20574, + "status": 201 +} +``` + +Someone new to VRL might write the following VRL program: + +```ruby +. = parse_common_log(.log) +.total_bytes = del(.size) +``` + +And they'll be greeted with this thoughtful error message at compile-time +(Vector boot): + +```rust +error[E103]: unhandled fallible assignment + ┌─ :1:5 + │ +1 │ . = parse_common_log(.log) + │ --- ^^^^^^^^^^^^^^^^^^^^^^ + │ │ │ + │ │ this expression is fallible + │ │ update the expression to be infallible + │ or change this to an infallible assignment: + │ ., err = parse_common_log(.log) + │ + = see documentation about error handling at https://errors.vrl.dev/#handling + = learn more about error code 103 at https://errors.vrl.dev/103 + = see language documentation at https://vrl.dev +``` + +As you can see, VRL requires the user to handle any expression that can result +in a runtime error. In our case, `.log` might not be a string, so we need to +either specify the type of the `.log` field or handle the error in the event +that `.log` is not a string. To resolve this error, the user must do one of +three things: + +1. **Handle the error** + + ```ruby + ., err = parse_common_log(.log) + if err != null { + .malformed = true + log("Failed to parse common-log: " + err, level: "error") + } else { + .total_bytes = del(.size) + } + ``` + + While subtle, this has valuable implications! If the event is malformed + (`.log` is not a formatted common-log string), then we forgo log an error + and add a `.malformed` field. This preserves the original data and makes it + easy to [route][route_transform] the malformed data for inspection. Not + handling this error is a *very* common mistake that would otherwise result + in data loss and downtime. + +2. **Raise the error and abort** + + ```ruby + . = parse_common_log!(.log) + .total_bytes = del(.size) + ``` + + In some cases, malformed data is unacceptable and the program must be + aborted. In this case VRL offers *fallible function variants*. This is a + fancy way of saying that suffixing your function call with `!` will raise an + error upon failure and abort the program. Vector itself will continue on to + process the next event, but will also log an error message to alert + operators. Again, this forces the users to decide how to handle errors + instead of being surprised by them. + +3. **Specify types** + + ```ruby + .log = to_string!(.log) + + ., err = parse_common_log(.log) + if err != null { + # This error only occurs for malformed *strings* + log("Failed to parse common-log: " + err, level: "error") + } else { + .total_bytes = del(.size) + } + ``` + + Finally, a caveat of the two examples above is that it's hard to discern + between a type error and a parsing error. Perhaps you want to abort on type + errors and handle parsing errors? You can achieve this through *progressive + type safety*. As a VRL program evaluates, it builds up type information + about your fields. Once the type is known, subsequent usage of that field + forgoes runtime type errors. Therefore, in the above example we know that + the only possible way an error can occur is if parsing fails. + +We're just scratching the surface on the language. For more information, check +out the VRL [reference][vrl_reference], [expressions][vrl_expressions], +[functions][vrl_functions], and [examples][vrl_examples]. + +## Should I start using VRL? + +The short answer is an emphatic **yes**. For the use cases that VRL can +cover—and that should be most use cases—it should be seen as the preferred +option beginning with this release. If you aren't sure if your use case is +covered, don't ever hesitate to visit us [on Discord][chat]. + +## Coming soon + +Although VRL should be considered ready for production use cases, there's more +on the way in the next few releases: + +* The initial lineup of VRL functions can ably cover many use cases but we do + have more functions in the pipeline. + +* Expect major new features for simple object traversal. + +* A web playground that enables you to experiment with VRL in the browser. + +* Improved type safety and ergonomics through event schemas. + +So stay tuned for much more work in this area. But for now, we strongly +encourage to explore the [VRL documentation][vrl_reference] and get in touch +with us [on Discord][chat] if you have any issues, comments, or suggestions. + +[0_11]: /releases/0.11.0 +[0_12]: /releases/0.12.0 +[Affine type system]: /docs/reference/vrl/#affine-type-system +[chat]: https://chat.vector.dev +[Ergonomic safety]: /docs/reference/vrl/#ergonomic-safety +[expression_oriented]: https://en.wikipedia.org/wiki/Expression-oriented_programming_language +[Fail safety]: /docs/reference/vrl/#fail-safety +[jean]: https://github.com/JeanMertz +[jq]: https://stedolan.github.io/jq/ +[lua]: https://vector.dev/docs/reference/transforms/lua/ +[Memory safety]: /docs/reference/vrl/#memory-safety +[Progressive type safety]: /docs/reference/vrl/#progressive-type-safety +[route_transform]: /docs/reference/configuration/transforms/route/ +[wasm]: /docs/reference/configuration/transforms/wasm/ +[Stateless]: /docs/reference/vrl/#stateless +[stephen]: https://github.com/FungusHumungus +[Vector/Rust native]: /docs/reference/vrl/#vector-rust-native +[vrl_examples]: /docs/reference/vrl/examples/ +[vrl_expressions]: /docs/reference/vrl/expressions/ +[vrl_functions]: /docs/reference/vrl/functions/ +[vrl_reference]: /docs/reference/vrl/ diff --git a/docs/content/en/community/_index.md b/docs/content/en/community/_index.md new file mode 100644 index 0000000000000..39383f5e62098 --- /dev/null +++ b/docs/content/en/community/_index.md @@ -0,0 +1,67 @@ +--- +title: Vector Community +description: > + Join the Vector community. Connect with other Vector users and help make Vector better. +buttons: +- title: Discord chat + description: Ask questions and get help + ionicon: logo-discord + icon_classes: text-discord-purple + url: https://chat.vector.dev +- title: "@vectordotdev" + description: Follow us in real time + ionicon: logo-twitter + icon_classes: text-twitter-blue + url: https://twitter.com/vectordotdev +- title: timberio/vector + description: Issues, code, and development + ionicon: logo-github + icon_classes: text-dark dark:text-gray-200 + url: https://github.com/timberio/vector +aliases: ["/mailing_list"] +--- + +### How do I contribute to Vector? + +Vector is [open source][oss] and welcomes contributions. A few guidelines to help you get started: + +1. Read our [contribution guide][contribution]. + +1. Start with [good first issues][first_issues]. + +1. Join our [chat] if you have any questions. We are happy to help! + +### What is Vector's governance model? + +Vector's high-level governance model is designed around the requirements and best practices of the CNCF/Linux Foundation Core Infrastructure Initiative best practice targeting a silver badge status. + +1. [CNCF CII best practices][cncf] + +1. [Linux Foundation][lf] + +### What is the Vector project model? + +Vector's project/product management model is designed around the Linux kernel development practices and processes. + +1. [Linux Kernel CII best practices][kernel] + +1. [Linux Foundation][linux] + +### What is the Vector community model? + +Vector has adopted the Rust community model and practices for engaging with people and ensuring that all contributors and stakeholders respect the code of conduct. + +1. [Rust Language Organization][rust_lang] + +1. [Rust community standards][rust_community] + +[chat]: https://chat.vector.dev +[cncf]: https://bestpractices.coreinfrastructure.org/en +[contribution]: https://github.com/timberio/vector/blob/master/CONTRIBUTING.md +[first_issues]: https://github.com/timberio/vector/contribute +[kernel]: https://bestpractices.coreinfrastructure.org/en/projects/34 +[lf]: https://www.linuxfoundation.org +[linux]: https://www.kernel.org +[oss]: https://github.com/timberio/vector +[rust_community]: https://www.rust-lang.org/community +[rust_lang]: https://www.rust-lang.org diff --git a/docs/content/en/components/_index.md b/docs/content/en/components/_index.md new file mode 100644 index 0000000000000..a4c18da633f1c --- /dev/null +++ b/docs/content/en/components/_index.md @@ -0,0 +1,13 @@ +--- +title: Vector Components +description: Components enable you to collect, transform, and route data with ease +short: Components +criteria: [ + { "Event Types": ["Log", "Metric"] }, + { "Guarantees": ["At-lease-once", "stable"] }, + { "Source functions": ["Collect", "Generate", "Receive"] }, + { "Transform functions": ["Convert", "Enrich", "Filter", "Program", "Reduce", "Route"] }, + { "Sink functions": ["Exposes", "Send"] }, + { "Operating systems": ["Linux", "Windows", "macOS"] } +] +---- diff --git a/docs/content/en/docs/_index.md b/docs/content/en/docs/_index.md new file mode 100644 index 0000000000000..6e34e711fec36 --- /dev/null +++ b/docs/content/en/docs/_index.md @@ -0,0 +1,20 @@ +--- +title: The Vector documentation +description: Your gateway to the world of Vector +short: Docs home +weight: 1 +--- + +Welcome to the documentation for **Vector**! Vector is a lightweight and ultra-fast tool for building observability pipelines. + +If you'd like to familiarize yourself with Vector's core concepts, we recommend reading up on Vector's core concepts: + +{{< jump "/docs/about/concepts" >}} + +If you feel comfortable with the concepts, we recommend our quickstart guide, which takes you through a practical example: + +{{< jump "/docs/setup/quickstart" >}} + +## Sections + +{{< sections >}} diff --git a/docs/content/en/docs/about/_index.md b/docs/content/en/docs/about/_index.md new file mode 100644 index 0000000000000..9f5bed74193e5 --- /dev/null +++ b/docs/content/en/docs/about/_index.md @@ -0,0 +1,15 @@ +--- +title: About +weight: 1 +tags: ["about"] +--- + +This section covers Vector's basic concepts and provides a foundation for the rest of the documentation. + +## Pages + +{{< pages >}} + +## Sections + +{{< sections >}} diff --git a/docs/content/en/docs/about/concepts.md b/docs/content/en/docs/about/concepts.md new file mode 100644 index 0000000000000..8d1cec6ae02b5 --- /dev/null +++ b/docs/content/en/docs/about/concepts.md @@ -0,0 +1,84 @@ +--- +title: Concepts +weight: 2 +tags: ["concepts", "meta", "events", "logs", "metrics", "components", "sources", "transforms", "sinks", "pipeline", "roles", "agent", "aggregator", "topology"] +--- + +In order to understand Vector, you must first understand the fundamental concepts. The following concepts are ordered progressively, starting with the individual unit of data ([events]) and broadening all the way to Vector's deployment models ([pipelines]). + +## Events + +**Events** represent the individual units of data in Vector. + +{{< jump "/docs/about/under-the-hood/architecture/data-model" >}} + +### Logs + +A **log** event is a generic key/value representation of an event. + +{{< jump "/docs/about/under-the-hood/architecture/data-model/log" >}} + +### Metrics + +A **metric** event represents a numerical operation performed on a time series. Vector's metric events are fully interoperable. + +{{< jump "/docs/about/under-the-hood/architecture/data-model/metric" >}} + +## Components + +**Component** is the generic term for [sources], [transforms], and [sinks]. Components ingest, transform, and route events. You compose components to create [topologies]. + +{{< jump "/components" >}} + +### Sources + +Vector wouldn't be very useful if it couldn't ingest data. A **source** defines where Vector should pull data from, or how it should receive data pushed to it. A [topology][topologies] can have any number of sources, and as they ingest data they proceed to normalize it into [events] (see the next section). This sets the stage for easy and consistent processing of your data. Examples of sources include `file`, `syslog`, `statsd`, and `stdin`. + +{{< jump "/sources" >}} + +### Transforms + +A **transform** is responsible for mutating events as they are transported by Vector. This might involve parsing, filtering, sampling, or aggregating. You can have any number of transforms in your pipeline and how they are composed is up to you. + +{{< jump "/transforms" >}} + +### Sinks + +A **sink** is a destination for events. Each sink's design and transmission method is dictated by the downstream service it interacts with. The `socket` sink, for example, streams individual events, while the `aws_s3` sink buffers and flushes data. + +{{< jump "/sinks" >}} + +## Pipeline + +A **pipeline** is a [directed acyclic graph][dag] of [components]. Each component is a node in the graph with directed edges. Data must flow in one direction, from sources to sinks. Components can produce zero or more events. + +{{< jump "/docs/about/under-the-hood/architecture/pipeline-model" >}} + +## Roles + +A **role** is a deployment role that Vector fills in order to create end-to-end pipelines. + +{{< jump "/docs/setup/deployment/roles" >}} + +### Agent + +The [**agent**](/docs/setup/deployment/roles#agent) role is designed for deploying Vector to the edge, typically for data collection. + +### Aggregator + +The [**aggregator**](/docs/setup/deployment/roles#aggregator) role is designed to collect and process data from multiple upstream sources. These upstream sources could be other Vector agents or non-Vector agents such as Syslog-ng. + +## Topology + +A **topology** is the end result of deploying Vector into your infrastructure. A topology may be as simple as deploying Vector as an agent, or it may be as complex as deploying Vector as an agent and routing data through multiple Vector aggregators. + +{{< jump "/docs/setup/deployment/topologies" >}} + +[components]: /components +[dag]: https://en.wikipedia.org/wiki/Directed_acyclic_graph +[events]: #events +[pipelines]: #pipeline +[sinks]: #sinks +[sources]: #sources +[topologies]: #topology +[transforms]: #transforms diff --git a/docs/content/en/docs/about/under-the-hood/_index.md b/docs/content/en/docs/about/under-the-hood/_index.md new file mode 100644 index 0000000000000..b237f5deb6db5 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/_index.md @@ -0,0 +1,15 @@ +--- +title: Under the hood +weight: 1 +tags: ["concepts"] +--- + +This section focuses on how Vector works. It's intended for readers who are curious about Vector as technology and less focused on usage. + +## Sections + +{{< sections >}} + +## Pages + +{{< pages >}} diff --git a/docs/content/en/docs/about/under-the-hood/architecture/_index.md b/docs/content/en/docs/about/under-the-hood/architecture/_index.md new file mode 100644 index 0000000000000..0b139a998ed79 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/_index.md @@ -0,0 +1,19 @@ +--- +title: Architecture +weight: 1 +tags: ["architecture", "concepts"] +--- + +{{< svg "img/architecture.svg" >}} + +This section covers the various models that combine to form Vector's architecture. These are ordered progressively, beginning with the [data model][data_model] and broadening all the way to Vector's [runtime model][runtime_model]. + +## Key pages + +{{< jump "/docs/about/under-the-hood/architecture/data-model" >}} +{{< jump "/docs/about/under-the-hood/architecture/pipeline-model" >}} +{{< jump "/docs/about/under-the-hood/architecture/concurrency-model" >}} +{{< jump "/docs/about/under-the-hood/architecture/runtime-model" >}} + +[data_model]: /docs/about/under-the-hood/architecture/data-model +[runtime_model]: /docs/about/under-the-hood/architecture/runtime-model diff --git a/docs/content/en/docs/about/under-the-hood/architecture/concurrency-model.md b/docs/content/en/docs/about/under-the-hood/architecture/concurrency-model.md new file mode 100644 index 0000000000000..4a520444955f8 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/concurrency-model.md @@ -0,0 +1,24 @@ +--- +title: Concurrency model +weight: 2 +tags: ["concurrency", "pipeline", "state"] +--- + +{{< svg "img/concurrency-model.svg" >}} + +{{< warning title="Work in progress" >}} +Vector's concurrency model is currently a work in progress. We're expecting to complete the work in **Q2 of 2021**. +{{< /warning >}} + +Vector implements a concurrency model that scales naturally with incoming data volume as shown above. Each Vector [source][sources] is responsible for defining the unit of concurrency and implementing it accordingly. This allows for a natural concurrency model that adapts to however Vector is being used, avoiding the need for tedious concurrency tuning and configuration. + +For example, the [`file` source][file] implements concurrency across the number of files it's tailing, and the [`socket` source][socket] implements concurrency across the number active open connection it's maintaining. + +## Stateless function transforms + +As covered in the [pipeline model][pipeline] documentation, Vector's concurrency relies on stateless function transforms that can be inlined at the source level. Task transforms should thus be defined at the end of your topology to allow for maximum transform inlining. + +[file]: /docs/reference/configuration/sources/file +[socket]: /docs/reference/configuration/sources/socket +[sources]: /docs/reference/configuration/sources/ +[pipeline]: /docs/about/under-the-hood/architecture/pipeline-model diff --git a/docs/content/en/docs/about/under-the-hood/architecture/data-model/_index.md b/docs/content/en/docs/about/under-the-hood/architecture/data-model/_index.md new file mode 100644 index 0000000000000..98b813e2f778a --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/data-model/_index.md @@ -0,0 +1,25 @@ +--- +title: Data model +description: How Vector understands data +weight: 1 +tags: ["data model", "logs", "metrics", "events"] +--- + +{{< svg "img/data-model-event.svg" >}} + +The individual units of data flowing through Vector are known as **events**. Events must fall into one of Vector's defined observability types. + +## Event types + +Vector defines subtypes for events. This is necessary to establish domain-specific requirements enabling interoperability with existing monitoring and observability systems. + +{{< jump "/docs/about/under-the-hood/architecture/data-model/log" >}} +{{< jump "/docs/about/under-the-hood/architecture/data-model/metric" >}} + +## FAQ + +### Why not *just* events? + +We *really* like the idea of an event-only world in which every service is perfectly instrumented with events that contain rich data and context. But in reality, services often emit logs and metrics of varying quality. By designing Vector to meet services where they are, we serve as a bridge to newer standards. This is why we place events at the top of our data model, whereas logs and metrics are derived categories. + +Finally, a sophisticated data model that accounts for the various data types allows for correct interoperability between observability systems. For example, a pipeline with a statsd source and a prometheus sink would not be possible without the correct internal metrics data types. diff --git a/docs/content/en/docs/about/under-the-hood/architecture/data-model/log.md b/docs/content/en/docs/about/under-the-hood/architecture/data-model/log.md new file mode 100644 index 0000000000000..06ed66f180e8a --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/data-model/log.md @@ -0,0 +1,40 @@ +--- +title: Log events +weight: 1 +tags: ["logs", "events", "schema"] +--- + +{{< svg "img/data-model-log.svg" >}} + +A **log event** in Vector is a structured representation of a point-in-time event. It contains an arbitrary set of fields that describe the event. + +A key tenet of Vector is **schema neutrality**. This ensures that Vector can work with any schema, supporting legacy and future schemas as your needs evolve. Vector doesn't require *any* specific fields and each [component][components] documents the fields it provides. + +Here's an example representation of a log event (as JSON): + +```json +{ + "log": { + "custom": "field", + "host": "my.host.com", + "message": "Hello world", + "timestamp": "2020-11-01T21:15:47+00:00" + } +} +``` + +## Schema + +{{< config/log-schema >}} + +## How it works + +### Schemas + +{{< snippet "how-it-works/schemas" >}} + +### Types + +{{< snippet "how-it-works/types" >}} + +[components]: /components diff --git a/docs/content/en/docs/about/under-the-hood/architecture/data-model/metric.md b/docs/content/en/docs/about/under-the-hood/architecture/data-model/metric.md new file mode 100644 index 0000000000000..e9fc6a30276f1 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/data-model/metric.md @@ -0,0 +1,19 @@ +--- +title: Metric events +weight: 2 +tags: ["metrics", "events", "schema"] +--- + +{{< svg "img/data-model-metric.svg" >}} + +A **metric event** in Vector represents a numerical operation performed on a time series. In Vector, unlike in other tools, metrics are first-class citizens. They are *not* represented as [logs]. This makes them interoperable with various metrics services without the need for any transformation. + +Vector's metric data model favors accuracy and correctness over ideological purity. Vector's metric types are thus an agglomeration of various metric types found in the wild, such as [Prometheus] and [Statsd]. This ensures that metrics are *correctly* interoperable between systems. + +## Schema + +{{< config/metric-schema >}} + +[logs]: /docs/about/under-the-hood/architecture/data-model/log +[prometheus]: https://prometheus.io +[statsd]: https://github.com/statsd/statsd diff --git a/docs/content/en/docs/about/under-the-hood/architecture/pipeline-model.md b/docs/content/en/docs/about/under-the-hood/architecture/pipeline-model.md new file mode 100644 index 0000000000000..e1e4331bcff0a --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/pipeline-model.md @@ -0,0 +1,36 @@ +--- +title: Pipeline model +weight: 1 +tags: ["pipeline", "dag", "graph", "configuration"] +--- + +{{< svg "img/pipeline-model.svg" >}} + +Vector's pipeline model is based on a [directed acyclic graph][dag] of [components] that contains indepdendent subgraphs. [Events] must flow in a single direction from sources to sinks and can't create cycles. Each component in the graph can produce zero or more events. + +## Defining pipelines + +A Vector pipeline is defined through a TOML, YAML, or JSON [configuration] file. For maintainability, many Vector users use configuration and data templating languages like [Jsonnet] or [CUE]. + +Configuration is checked at pipeline compile time (when Vector boots). This prevents simple mistakes and enforces DAG properties. + +## In-flight manipulation + +Vector's configured pipeline can be adjusted in real time without restarting Vector. + +### Reload + +Vector supports [hot reloading][reloading] to apply any configuration changes. This is achieved by sending a `SIGHUP` process signal to Vector's process. + +### API + +Vector also includes an [API] that allows for real-time observation and manipulation of a running Vector instance. + +[api]: /docs/reference/api +[components]: /components +[configuration]: /docs/reference/configuration +[cue]: https://cuelang.org +[dag]: https://en.wikipedia.org/wiki/Directed_acyclic_graph +[events]: /docs/about/under-the-hood/architecture/data-model +[jsonnet]: https://jsonnet.org +[reloading]: /docs/administration/management/#reloading diff --git a/docs/content/en/docs/about/under-the-hood/architecture/runtime-model.md b/docs/content/en/docs/about/under-the-hood/architecture/runtime-model.md new file mode 100644 index 0000000000000..a8208e635c802 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/architecture/runtime-model.md @@ -0,0 +1,52 @@ +--- +title: Runtime Model +description: Vector's runtime model and how it manages concurrency +weight: 3 +tags: ["runtime", "concurrency", "state", "scheduler"] +--- + +{{< svg "img/runtime-model.svg" >}} + +Vector's runtime is a futures-based asynchronous runtime where nodes in Vector's [DAG topology model][pipeline] roughly map to asynchonous [tasks](#tasks) that communicate via channels, all [scheduled](#scheduler) by the [Tokio][tokio] runtime. + +## Tasks + +Nodes in Vector's [topology][pipeline] roughly map to asynchronous tasks, with the exception being stateless transforms that are inlined into the source for [concurrency][concurrency] reasons. + +### Source tasks + +[Sources][sources] are tasks with an output channel. This interface is intentionally simple and favors internal composability to allow for maximum flexibility across Vector's wide array of sources. + +### Transform tasks + +[Transforms][transforms] can both be tasks or stateless functions depending on their purpose. + +#### Stateless function transforms + +Stateless function transforms are single operation transforms that do not maintain state across multiple events. For example, the [`remap` transform][remap] performs individual operations on events as they are received and immediately returns. This function-like simplificity allows them to be inlined at the source level to achieve our [concurrency model][concurrency]. + +#### Task transforms + +Task transforms can optionally maintain state across multiple events. Therefore, they run as separate tasks and cannot be inlined at the source level for concurrency. An example of task transform is the [`dedupe` transform][dedupe], which maintains state to drop duplicate events. + +### Sink tasks + +[Sinks][sinks] are tasks with an input channel. This interface is intentionally simple and favors internal composability to allow for maximum flexibility. Sinks share a lot of infrastructure that make them easy and +flexible to build. Such as streaming, batching, partitioning, networking, retries, and buffers. + +## Scheduler + +Vector uses the [Tokio][tokio] runtime for task scheduling. + +## Data plane + +Nodes in Vector's [DAG topology][pipeline] communicate via channels. Edge nodes are customized channels with dynamic output control where back pressure is the default, but can be customized on a per-sink basis to shed load or persist to disk. + +[concurrency]: /docs/about/under-the-hood/architecture/concurrency-model +[dedupe]: /docs/reference/configuration/transforms/dedupe +[pipeline]: /docs/about/under-the-hood/architecture/pipeline-model +[remap]: /docs/reference/configuration/transforms/remap +[tokio]: https://tokio.rs +[sinks]: /docs/reference/configuration/sinks +[sources]: /docs/reference/configuration/sources +[transforms]: /docs/reference/configuration/transforms diff --git a/docs/content/en/docs/about/under-the-hood/guarantees.md b/docs/content/en/docs/about/under-the-hood/guarantees.md new file mode 100644 index 0000000000000..d799dc6628ff1 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/guarantees.md @@ -0,0 +1,93 @@ +--- +title: Guarantees +aliases: ["/docs/about/guarantees"] +--- + +Vector attempts to make it clear which guarantees you can expect from it. We categorize all +components by their targeted delivery guarantee and also by their general stability. This helps you +make the appropriate trade-offs for your use case. + +Here you can find an overview of delivery guarantee types and their meaning as well as how we label +the stability of our components. Next, you can head over to the [components] page and use filters to +see which components support specific guarantees. + +## Delivery guarantees + +### At-least-once + +The **at-least-once** delivery guarantee ensures that an [event] received by a Vector component is +ultimately delivered at least once. While rare, it is possible for an event to be delivered more +than once. See the [Does Vector support exactly-once delivery?](#faq-at-least-once) FAQ below). + +{{< warning >}} +In order to achieve at-least-once delivery between restarts your source must be configured to use +disk-based buffers: + +```toml title="vector.toml" +[sinks.my_sink_id] + [sinks.my_sink_id.buffer] + type = "disk" + when_full = "block" + max_size = 104900000 # 100MiB +``` + +Refer to each [sink's][sinks] documentation for further guidance on its buffer options. + +[sinks]: /docs/reference/configuration/sinks +{{< /warning >}} + +### Best effort + +A **best-effort** delivery guarantee means that a Vector component makes a best effort to deliver +each event but it can't _guarantee_ delivery. This is usually due to limitations of the underlying +protocol, which is outside Vector's control. + +Note that this is _not_ the same as at-most-once delivery, as it'is still possible for Vector to +introduce duplicates under extreme circumstances. + +## Stability guarantees + +### Stable + +The `stable` status is a _subjective_ status defined by the Vector team. It's intended to give you a +general idea of a feature's suitability for production environments. A feature is considered stable +if it meets the following criteria: + +1. A meaningful number of users (generally over 50) have been using the feature in a production + environment for a sustained period of time without issue. +2. The feature has had sufficient time (generally more than 4 months) to be community tested. + +3. The feature API is stable and unlikely to change. + +4. There are no major [open bugs][bugs] for the feature. + +### Beta + +The `beta` status means that a feature has not met the criteria outlined in the [stable](#stable) +section and therefore should be used with caution in production environments. + +### Deprecated + +The `deprecated` status means that a feature will be removed in the next major version of Vector. We +will provide ample time to transition and, when possible, strive to retain backward compatibility. + +## FAQs + +### Do I need at-least-once delivery? {#faq-at-least-once} + +One of the unique advantages of the metrics and logging use cases is that data is usually used for diagnostic purposes only. Therefore, losing the occasional event has little impact on your business. This affords you the opportunity to provision your pipeline towards performance, simplicity, and cost reduction. On the other hand, if you're using your data to perform business critical functions, then data loss is not acceptable and therefore requires "at-least-once" delivery. + +To clarify, even though a source or sink is marked as "best effort" it doesn't mean Vector takes delivery lightly. In fact, once data is within the boundary of Vector it won't be lost if you've configured on-disk buffers. Data loss for "best-effort" sources and sinks is almost always due to the limitations of the underlying protocol. + +### Does Vector support exactly-once delivery? + +No, Vector does not support exactly once delivery. There are future plans to partially support this for sources and sinks that support it, for example Kafka, but it remains unclear if Vector will ever be able to achieve this. We recommend [subscribing to our mailing list](/community), which will keep you in the loop if this ever changes. + +### How can I find components that meet these guarantees? + +Head over to the [components page][components] and use the guarantee +filters. + +[bugs]: https://github.com/timberio/vector/issues?q=is%3Aopen+is%3Aissue+label%3A%22type%3A+bug%22 +[components]: /components +[event]: /docs/about/under-the-hood/architecture/data-model diff --git a/docs/content/en/docs/about/under-the-hood/networking/_index.md b/docs/content/en/docs/about/under-the-hood/networking/_index.md new file mode 100644 index 0000000000000..23244bfc77ad3 --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/networking/_index.md @@ -0,0 +1,8 @@ +--- +title: Networking +weight: 2 +--- + +## Pages in this section + +{{< pages >}} diff --git a/docs/content/en/docs/about/under-the-hood/networking/arc.md b/docs/content/en/docs/about/under-the-hood/networking/arc.md new file mode 100644 index 0000000000000..46171bdaf522e --- /dev/null +++ b/docs/content/en/docs/about/under-the-hood/networking/arc.md @@ -0,0 +1,16 @@ +--- +title: Adaptive request concurrency (ARC) +short: ARC +weight: 1 +tags: ["arc", "request", "concurrency", "adaptive request concurrency", "performance", "http"] +--- + +![The Adaptive Request Concurrency decision chart](/img/adaptive-concurrency.png) + +**Adaptive Request Concurrency** (ARC) is a Vector networking feature that does away with static rate limits and automatically optimizes HTTP concurrency limits based on downstream service responses. The underlying mechanism is a feedback loop inspired by TCP congestion control algorithms. + +The end result is improved performance and reliability across your entire observability infrastructure. + +Check out the feature announcement for more information: + +{{< jump "/blog/adaptive-request-concurrency" >}} diff --git a/docs/content/en/docs/about/what-is-vector.md b/docs/content/en/docs/about/what-is-vector.md new file mode 100644 index 0000000000000..58ad1cd7e4afa --- /dev/null +++ b/docs/content/en/docs/about/what-is-vector.md @@ -0,0 +1,17 @@ +--- +title: What is Vector? +weight: 1 +tags: ["concepts"] +--- + +Vector is a high-performance observability data pipeline that puts organizations in control of their observability data. [Collect], [transform], and [route] all your logs, metrics, and traces to any vendors you want today and any other vendors you may want tomorrow. Vector enables dramatic cost reduction, novel data enrichment, and data security where you need it, not where is most convenient for your vendors. Open source and up to 10x faster than every alternative. + +Vector is downloaded millions of times per month and relied on by companies like T-Mobile, Comcast, Zendesk, and Discord to own their observability data. + +## How to get started + +{{< jump "/docs/setup/quickstart" >}} + +[collect]: /docs/reference/configuration/sources +[route]: /docs/reference/configuration/sinks +[transform]: /docs/reference/configuration/transforms diff --git a/docs/content/en/docs/administration/_index.md b/docs/content/en/docs/administration/_index.md new file mode 100644 index 0000000000000..2c6b85681a496 --- /dev/null +++ b/docs/content/en/docs/administration/_index.md @@ -0,0 +1,19 @@ +--- +title: Administering Vector +short: Administration +weight: 4 +tags: ["admin"] +--- + +Vector was built to be easy to [install] and operate on a wide variety of [operating systems][os] and [platforms]. This section of the documentation covers the full range of core Vector administration tasks, from [managing] Vector instances to [validating] your Vector [configuration]. + +## Pages in this section + +{{< pages >}} + +[configuration]: /docs/reference/configuration +[install]: /docs/setup/installation +[managing]: /docs/administration/management +[os]: /docs/setup/installation/operating-systems +[platforms]: /docs/setup/installation/platforms +[validating]: /docs/administration/validating diff --git a/docs/content/en/docs/administration/management.md b/docs/content/en/docs/administration/management.md new file mode 100644 index 0000000000000..53fc641efae75 --- /dev/null +++ b/docs/content/en/docs/administration/management.md @@ -0,0 +1,208 @@ +--- +title: Management +description: How to start, stop, reload, and restart your Vector instance +short: Management +weight: 1 +tags: ["process", "admin", "reload", "start", "stop", "restart"] +--- + +The sections below show you how to administer your Vector instance—start, stop, reload, etc.—in a variety of settings: + +* [Vector executable](#vector-executable) (no process manager) +* [Linux](#linux) (systemctl process manager) +* [macOS](#macos) (Homebrew service manager) +* [Windows](#windows) +* [Docker](#docker) +* [Kubernetes with Helm](#helm) + +### Vector executable + +To manage the Vector executable directly, without a process manager: + +{{< tabs default="Start" >}} +{{< tab title="Start" >}} +```bash +vector --config /etc/vector/vector.toml + +# Or supply a JSON or YAML config file +``` +{{< /tab >}} +{{< tab title="Reload" >}} +```bash +killall -s SIGHUP vector +``` +{{< /tab >}} +{{< /tabs >}} + +### Linux + +#### APT, dpkg, RPM, YUM + +If you've installed Vector using [APT], [dpkg], [RPM], or [YUM], you can manage it using [systemctl]. + +{{< tabs default="Start" >}} +{{< tab title="Start" >}} +```bash +sudo systemctl start vector +``` +{{< /tab >}} +{{< tab title="Stop" >}} +```bash +sudo systemctl stop vector +``` +{{< /tab >}} +{{< tab title="Reload" >}} +```bash +systemctl kill -s HUP --kill-who=main vector.service +``` +{{< /tab >}} +{{< tab title="Restart" >}} +```bash +sudo systemctl restart vector +``` +{{< /tab >}} +{{< /tabs >}} + +#### Nix + +If you've installed Vector using [Nix], you can manage it using the commands laid out in the [Vector +executable](#vector-executable) section. + +### macOS + +If you're running Vector on macOS, you can manage it using either the [executable](#vector-executable) commands or +[Homebrew](#homebrew). + +#### Homebrew + +If you've installed Vector using [Homebrew], you can manage it using Homebrew's [services][brew_services] utility. + +{{< tabs default="Start" >}} +{{< tab title="Start" >}} +```bash +brew services start vector +``` +{{< /tab >}} +{{< tab title="Stop" >}} +```bash +brew services stop vector +``` +{{< /tab >}} +{{< tab title="Reload" >}} +```bash +killall -S SIGHUP vector +``` +{{< /tab >}} +{{< tab title="Restart" >}} +```bash +brew services restart vector +``` +{{< /tab >}} +{{< /tabs >}} + +### Windows + +If you're running Vector on Windows (perhaps you installed it using [MSI]), you can manage it using these commands: + +{{< tabs default="Start" >}} +{{< tab title="Start" >}} +```powershell +C:\Program Files\Vector\bin\vector \ + --config C:\Program Files\Vector\config\vector.toml + +# Or supply a JSON or YAML config file +``` +{{< /tab >}} +{{< /tabs >}} + +### Docker + +If you're running Vector using [Docker], the command interface is the same across all platforms. + +{{< tabs default="Start" >}} +{{< tab title="Start" >}} +```bash +docker run \ + -d \ + -v ~/vector.toml:/etc/vector/vector.toml:ro \ + -p 8686:8686 \ + timberio/vector:0.13.1-alpine +``` +{{< /tab >}} +{{< tab title="Stop" >}} +```bash +docker stop timberio/vector +``` +{{< /tab >}} +{{< tab title="Reload" >}} +```bash +docker kill --signal=HUP timberio/vector +``` +{{< /tab >}} +{{< tab title="Restart" >}} +```bash +docker restart -f $(docker ps -aqf "name=vector") +``` +{{< /tab >}} +{{< /tabs >}} + +The commands above involve configuring Vector using TOML, but you can also use JSON or YAML. You can also use one of +three image variants (the commands assume `alpine`): + +Variant | Image basis +:-------|:----------- +`alpine` | [Alpine](https://hub.docker.com/_/alpine), a Linux distro built around [musl libc](https://www.musl-libc.org) and [BusyBox](https://busybox.net) +`debian` | The [`debian-slim`](https://hub.docker.com/_/debian) image, which is a smaller and more compact version of the standard `debian` image +`distroless` | The [Distroless](https://github.com/GoogleContainerTools/distroless) project, which provides extremely lean images with no package managers, shells, or other inessential utilities + +### Helm + +To get Vector running on [Kubernetes] using the [Helm] package manager: + +{{< jump "/docs/setup/installation/package-managers/helm" >}} + +Once Vector is running in Kubernetes, you can manage it using [kubectl]: + +{{< tabs default="Restart" >}} +{{< tab title="Restart" >}} +```shell +kubectl rollout restart --namespace vector daemonset/vector-agent +``` +{{< /tab >}} +{{< /tabs >}} + +## Reloading + +As you can see above, many administrative interfaces for Vector enable you to trigger a restart of a Vector instance while it's running. There are a few things that you should know about reloading. + +### Automatic reloading on config change + +You can make Vector automatically reload itself when its [configuration file][configuration] changes by setting the `--watch-config` or `-w` [flag][watch_config] when you first start your Vector instance. + +### Automatic reload on configuration change + +Vector provides an option + +## How it works + +Running Vector instances accept the IPC [signals](#signals) and produce the [exit codes](#exit-codes) listed below. + +{{< administration/process >}} + +[apt]: /docs/setup/installation/package-managers/apt +[brew_services]: https://github.com/Homebrew/homebrew-services +[bug]: https://github.com/timberio/vector/issues/new?labels=type%3A+bug +[configuration]: /docs/reference/configuration +[docker]: /docs/setup/installation/platforms/docker +[dpkg]: /docs/setup/installation/package-managers/dpkg +[helm]: https://helm.sh +[homebrew]: /docs/setup/installation/package-managers/homebrew +[kubectl]: https://kubernetes.io/docs/reference/kubectl +[kubernetes]: https://kubernetes.io +[msi]: /docs/setup/installation/package-managers/msi +[nix]: /docs/setup/installation/package-managers/nix +[rpm]: /docs/setup/installation/package-managers/rpm +[sources]: /docs/reference/configuration/sources +[systemctl]: https://man7.org/linux/man-pages//man1/systemctl.1.html +[watch_config]: /docs/reference/cli/#vector-watch-config +[yum]: /docs/setup/installation/package-managers/yum diff --git a/docs/content/en/docs/administration/monitoring.md b/docs/content/en/docs/administration/monitoring.md new file mode 100644 index 0000000000000..8b42fe418adfe --- /dev/null +++ b/docs/content/en/docs/administration/monitoring.md @@ -0,0 +1,129 @@ +--- +title: Monitoring and observing Vector +description: Use logs and metrics generated by Vector itself in your Vector topology +short: Monitoring +weight: 2 +tags: ["admin", "logs", "metrics"] +--- + +Although Vector is primarily used to handle observability data from from a wide variety of sources, we also strive to +make Vector highly observable itself. To that end, Vector provides two [sources], [`internal_logs`][internal_logs] and +[`internal_metrics`][internal_metrics], that you can use to handle logs and metrics produced by Vector just like you +would logs and metrics from any other source. + +## Logs + +Vector provide clear, informative, well-structured logs via the [`internal_logs`][internal_logs] source. This section +shows you how to use them in your Vector topology. + +*Which* logs Vector pipes through the `internal_logs` source is determined by the [log level](#levels), which defaults +to `info`. + +### Accessing logs + +You can access Vector's logs by adding an [`internal_logs`][internal_logs] source to your [topology]. Here's an example +configuration that takes Vector's logs and pipes them to the console as plain text: + +```toml +[sources.vector_logs] +type = "internal_logs" + +[sinks.console] +type = "console" +inputs = ["vector_logs"] +``` + +### Using Vector logs + +Once Vector logs enter your topology through the `internal_logs` source, you can treat them like logs from any other +system, i.e. you can [transform] them and send them off to any number of [sinks]. The configuration below, for example, +transforms Vector's logs using the [`remap` transform][remap] and [Vector Remap Language][VRL] and then stores those +logs in [Clickhouse]: + +```toml +[sources.vector_logs] +type = "internal_logs" + +[transforms.modify] +type = "remap" +inputs = ["vector_logs"] + +# Reformat the timestamp to Unix time +source = ''' + .timestamp = to_unix_timestamp!(to_timestamp!(.timestamp)) +''' + +[sinks.database] +type = "clickhouse" +inputs = ["modify"] +host = "http://localhost:8123" +table = "vector-log-data" +``` + +### Configuring logs + +#### Levels + +Vector logs at the `info` level by default. You can set a different level when [starting] up your instance using either +command-line flags or the `LOG` environment variable. The table below details these options: + +Method | Description +:------|:----------- +`-v` flag | Drops the log level to `debug` +`-vv` flag | Drops the log level to `trace` +`-q` flag | Raises the log level to `warn` +`-qq` flag | Raises the log level to `error` +`-qqq` flag | Disables logging +`LOG=` environment variable | Set the log level. Must be one of `trace`, `debug`, `info`, `warn`, `error`, `off`. + +#### Stack traces + +You can enable full error backtraces by setting the `RUST_BACKTRACE=full` environment variable. More on this in the +[Troubleshooting guide][troubleshooting]. You can + +## Metrics + +You can monitor metrics produced by Vector using the [`internal_metrics`][internal_metrics] source. As with Vector's +[internal logs](#using-vector-logs), you can configure an `internal_metrics` source and use the piped-in metrics +however you wish. Here's an example configuration that + +### Metrics catalogue + +The table below provides a list of internal metrics provided by Vector. See the docs for the [`internal_metrics` +source][output] for more detailed information about the available metrics. + +{{< internal-metrics-list >}} + +## Troubleshooting + +More information in our troubleshooting guide: + +{{< jump "/guides/level-up/troubleshooting" >}} + +## How it works + +### Event-driven observability + +Vector employs an event-driven observability strategy that ensures consistent and correlated telemetry data. You can +read more about our approach in [RFC 2064][rfc_2064]. + +### Log rate limiting + +Vector rate limits log events in the hot path. This enables you to get granular insight without the risk of saturating +IO and disrupting the service. The trade-off is that repetitive logs aren't logged. + +[clickhouse]: /docs/reference/configuration/sinks/clickhouse +[internal_logs]: /docs/reference/configuration/sources/internal_logs +[internal_metrics]: /docs/reference/configuration/sources/internal_metrics +[journald]: https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html +[journald_source]: /docs/reference/configuration/sources/journald +[output]: /docs/reference/configuration/sources/internal_metrics/#output +[remap]: /docs/reference/configuration/transforms/remap +[rfc_2064]: https://github.com/timberio/vector/blob/master/rfcs/2020-03-17-2064-event-driven-observability.md +[sinks]: /sinks +[sources]: /sources +[starting]: /docs/administration/management +[topology]: /docs/about/concepts/#topology +[transform]: /transforms +[troubleshooting]: /guides/level-up/troubleshooting +[vrl]: /docs/reference/vrl diff --git a/docs/content/en/docs/administration/tuning.md b/docs/content/en/docs/administration/tuning.md new file mode 100644 index 0000000000000..fe92dae9c11db --- /dev/null +++ b/docs/content/en/docs/administration/tuning.md @@ -0,0 +1,9 @@ +--- +title: Tuning +weight: 3 +tags: ["tuning", "rust", "performance"] +--- + +Vector is written in [Rust] and therefore doesn't include a runtime or a virtual machine. There are no special service-level steps you need to undertake to improve performance as Vector takes full advantage of all system resources by default and without any adjustments. + +[rust]: https://rust-lang.org diff --git a/docs/content/en/docs/administration/upgrading.md b/docs/content/en/docs/administration/upgrading.md new file mode 100644 index 0000000000000..7876cf8e185ef --- /dev/null +++ b/docs/content/en/docs/administration/upgrading.md @@ -0,0 +1,9 @@ +--- +title: Upgrading Vector +short: Upgrading +draft: true +weight: 4 +tags: ["upgrade"] +--- + +How you upgrade Vector depends largely on your installation method. diff --git a/docs/content/en/docs/administration/validating.md b/docs/content/en/docs/administration/validating.md new file mode 100644 index 0000000000000..19c1da6266064 --- /dev/null +++ b/docs/content/en/docs/administration/validating.md @@ -0,0 +1,63 @@ +--- +title: Validating +weight: 5 +tags: ["validate", "configuration"] +--- + +Vector provides a subcommand, [`validate`][validate], that checks the validity of your Vector configuration and exist. +Here's an example: + +```bash +vector validate /etc/vector/vector.toml +``` + +You can also check multiple files: + +```bash +vector validate /etc/vector/vector*.toml +``` + +## How validation works + +The [`validate`][validate] subcommand performs several sets of checks on the configuration you point +it to. If validation succeeds, Vector exits with a code of `0`; if it fails, it exits with a code of +`78`. At any time, you can see documentation for the command by running `vector validate --help`. + +### Correctness checks + +These checks verify the correctness of fields for [components] defined within all configuration +files, including: + +1. That all of the [sources], [transforms], and [sinks] include all required fields. +2. All fields are of the proper type. + +### Topology checks + +These checks verify that the configuration file contains a valid topology: + +1. At least one [source][sources] is defined +1. At least one [sink][sinks] is defined +1. All inputs for each topology component (specified using the `inputs` parameter) contain at least + one value. +1. All inputs refer to valid and upstream [sources] or [transforms]. + +### Environment checks + +Finally, these checks ensure that Vector is running in an environment that can support the +configured topology: + +1. All components have the pre-requisites to run, e.g. data directories exist and are writable. +1. All sinks can connect to their specified targets. + +These environment checks can be disabled using the [`--no-environment`][no_environment] flag: + +```bash +vector validate --no-environment /etc/vector/vector.toml +``` + +[components]: /components +[no_environment]: /docs/reference/cli/#validate-no-environment +[sinks]: /sinks +[sources]: /sources +[transforms]: /transforms +[validate]: /docs/reference/cli/#validate diff --git a/docs/content/en/docs/example.md b/docs/content/en/docs/example.md new file mode 100644 index 0000000000000..5ca32f819f86d --- /dev/null +++ b/docs/content/en/docs/example.md @@ -0,0 +1,7 @@ +--- +# This page is just "scratch paper" for playing around with shortcodes and such. +# It's rendered in the preview build but not in the production build (hence the draft status). +title: Example +description: A page for experimenting and doodling +draft: true +--- diff --git a/docs/content/en/docs/reference/_index.md b/docs/content/en/docs/reference/_index.md new file mode 100644 index 0000000000000..f4516a76e0fe6 --- /dev/null +++ b/docs/content/en/docs/reference/_index.md @@ -0,0 +1,19 @@ +--- +title: Reference +weight: 3 +--- + +This section contains various forms of reference-style documentation for Vector. These docs tend to +be most useful when you already have a [good grasp][about] of how Vector works and have already +made your way through the [Vector quickstart][quickstart]. + +## Pages + +{{< pages >}} + +## Subsections + +{{< sections >}} + +[about]: /docs/about +[quickstart]: /docs/setup/quickstart diff --git a/docs/content/en/docs/reference/api.md b/docs/content/en/docs/reference/api.md new file mode 100644 index 0000000000000..c7a8038613ccc --- /dev/null +++ b/docs/content/en/docs/reference/api.md @@ -0,0 +1,28 @@ +--- +title: The Vector API +short: API +weight: 3 +--- + +Vector ships with a [GraphQL] API that allows you to interact with a running Vector instance. This page covers how to configure and enable Vector's API. + +## Configuration + +{{< api/config >}} + +## Endpoints + +{{< api/endpoints >}} + +## How it works + +### GraphQL + +Vector chose [GraphQL] for its API because GraphQL is self-documenting and type safe. We believe that this offers a superior client experience and makes Vector richly programmable through its API. + +### Playground + +Vector's GraphQL API ships with a built-in playground that allows you to explore the available commands and manually run queries against the API. This can be accessed at the `/playground` path. We also offer a [public playground][playground] that you can explore without hosting your own Vector instance. + +[graphql]: https://graphql.org +[playground]: https://playground.vector.dev:8686/playground diff --git a/docs/content/en/docs/reference/cli.md b/docs/content/en/docs/reference/cli.md new file mode 100644 index 0000000000000..367e08adec50e --- /dev/null +++ b/docs/content/en/docs/reference/cli.md @@ -0,0 +1,19 @@ +--- +title: The Vector command line interface +short: CLI +weight: 4 +--- + +Vector is a single binary that be managed through a command line interface. This page documents all of the available flags, options, subcommands, and environment variables. + +```shell +vector [FLAGS] [OPTIONS] [SUBCOMMAND] [ARGS] +``` + +## Commands + +{{< cli/commands >}} + +## Environment variables + +{{< cli/env-vars >}} diff --git a/docs/content/en/docs/reference/configuration/_index.md b/docs/content/en/docs/reference/configuration/_index.md new file mode 100644 index 0000000000000..74cf2af846bf6 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/_index.md @@ -0,0 +1,285 @@ +--- +title: Configuring Vector +short: Configuration +weight: 3 +aliases: ["/docs/configuration", "/docs/setup/configuration"] +--- + +Vector is configured using a configuration file. This section contains a comprehensive reference of all Vector configuration options. + +## Example + +The following is an example of a popular Vector configuration that ingests logs from a file and routes them to both Elasticsearch and AWS S3. Your configuration will differ based on your needs. + +{{< tabs default="vector.toml" >}} +{{< tab title="vector.toml" >}} +```toml +# Set global options +data_dir = "/var/lib/vector" + +# Vector's API (disabled by default) +# Enable and try it out with the `vector top` command +[api] +enabled = false +# address = "127.0.0.1:8686" + +# Ingest data by tailing one or more files +[sources.apache_logs] +type = "file" +include = ["/var/log/apache2/*.log"] # supports globbing +ignore_older = 86400 # 1 day + +# Structure and parse via Timber's Remap Language +[transforms.remap] +inputs = ["apache_logs"] +type = "remap" +source = ''' +. = parse_apache_log(.message) +''' + +# Sample the data to save on cost +[transforms.apache_sampler] +inputs = ["apache_parser"] +type = "sampler" +rate = 50 # only keep 50% + +# Send structured data to a short-term storage +[sinks.es_cluster] +inputs = ["apache_sampler"] # only take sampled data +type = "elasticsearch" +host = "http://79.12.221.222:9200" # local or external host +index = "vector-%Y-%m-%d" # daily indices + +# Send structured data to a cost-effective long-term storage +[sinks.s3_archives] +inputs = ["apache_parser"] # don't sample for S3 +type = "aws_s3" +region = "us-east-1" +bucket = "my-log-archives" +key_prefix = "date=%Y-%m-%d" # daily partitions, hive friendly format +compression = "gzip" # compress final objects +encoding = "ndjson" # new line delimited JSON +batch.max_size = 10000000 # 10mb uncompressed +``` +{{< /tab >}} +{{< tab title="vector.yaml" >}} +```yaml +data_dir: /var/lib/vector +sources: + apache_logs: + type: file + include: + - /var/log/apache2/*.log + ignore_older: 86400 +transforms: + remap: + inputs: + - apache_logs + type: remap + source: | + . = parse_apache_log(.message) + apache_sampler: + inputs: + - apache_parser + type: sampler + rate: 50 +sinks: + es_cluster: + inputs: + - apache_sampler + type: elasticsearch + host: 'http://79.12.221.222:9200' + index: vector-%Y-%m-%d + s3_archives: + inputs: + - apache_parser + type: aws_s3 + region: us-east-1 + bucket: my-log-archives + key_prefix: date=%Y-%m-%d + compression: gzip + encoding: ndjson + batch: + max_size: 10000000 +``` +{{< /tab >}} +{{< tab title="vector.json" >}} +```json +{ + "data_dir": "/var/lib/vector", + "sources": { + "apache_logs": { + "type": "file", + "include": [ + "/var/log/apache2/*.log" + ], + "ignore_older": 86400 + } + }, + "transforms": { + "remap": { + "inputs": [ + "apache_logs" + ], + "type": "remap", + "source": ". = parse_apache_log(.message)" + }, + "apache_sampler": { + "inputs": [ + "apache_parser" + ], + "type": "sampler", + "rate": 50 + } + }, + "sinks": { + "es_cluster": { + "inputs": [ + "apache_sampler" + ], + "type": "elasticsearch", + "host": "http://79.12.221.222:9200", + "index": "vector-%Y-%m-%d" + }, + "s3_archives": { + "inputs": [ + "apache_parser" + ], + "type": "aws_s3", + "region": "us-east-1", + "bucket": "my-log-archives", + "key_prefix": "date=%Y-%m-%d", + "compression": "gzip", + "encoding": "ndjson", + "batch": { + "max_size": 10000000 + } + } + } +} +``` +{{< /tab >}} +{{< /tabs >}} + +To use this configuration file, specify it with the `--config` flag when starting Vector: + +{{< tabs default="TOML" >}} +{{< tab title="TOML" >}} +```shell +vector --config /etc/vector/vector.toml +``` +{{< /tab >}} +{{< tab title="YAML" >}} +```shell +vector --config /etc/vector/vector.yaml +``` +{{< /tab >}} +{{< tab title="JSON" >}} +```shell +vector --config /etc/vector/vector.json +``` +{{< /tab >}} +{{< /tabs >}} + +## Reference + +### Components + +{{< jump "/docs/reference/configuration/sources" >}} +{{< jump "/docs/reference/configuration/transforms" >}} +{{< jump "/docs/reference/configuration/sinks" >}} + +### Advanced + +{{< jump "/docs/reference/configuration/global-options" >}} +{{< jump "/docs/reference/configuration/template-syntax" >}} + +## How it works + +### Environment variables + +Vector interpolates environment variables within your configuration file with the following syntax: + +```toml +[transforms.add_host] +type = "add_fields" + +[transforms.add_host.fields] +host = "${HOSTNAME}" +environment = "${ENV:-development}" # default value when not present +``` + +#### Default values + +Default values can be supplied using `:-` syntax: + +```toml +option = "${ENV_VAR:-default}" +``` + +#### Escaping + +You can escape environment variables by prefacing them with a `$` character. For example `$${HOSTNAME}` is treated literally in the above environment variable example. + +### Formats + +Vector supports [TOML], [YAML], and [JSON] to ensure that Vector fits into your workflow. A side benefit of supporting JSON is that it enables you to use JSON-outputting data templating languages like [Jsonnet] and [Cue]. + +#### Location + +The location of your Vector configuration file depends on your installation method. For most Linux-based systems, the file can be found at `/etc/vector/vector.toml`. + +### Multiple files + +You can pass multiple configuration files when starting Vector: + +```shell +vector --config vector1.toml --config vector2.toml +``` + +Or using a [globbing syntax][glob]: + +```shell +vector --config /etc/vector/*.toml +``` + +#### Wilcards in identifiers + +Vector supports wildcards (`*`) in component identifiers when building your topology, but only supports them as the last character. For example: + +```toml +[sources.app1_logs] +type = "file" +includes = ["/var/log/app1.log"] + +[sources.app2_logs] +type = "file" +includes = ["/var/log/app.log"] + +[sources.system_logs] +type = "file" +includes = ["/var/log/system.log"] + +[sinks.app_logs] +type = "datadog_logs" +inputs = ["app*"] + +[sinks.archive] +type = "aws_s3" +inputs = ["app*", "system_logs"] +``` + +## Sections + +{{< sections >}} + +## Pages + +{{< pages >}} + +[cue]: https://cuelang.org +[glob]: https://en.wikipedia.org/wiki/Glob_(programming) +[json]: https://json.org +[jsonnet]: https://jsonnet.org +[toml]: https://github.com/toml-lang/toml +[yaml]: https://yaml.org diff --git a/docs/content/en/docs/reference/configuration/field-path-notation.md b/docs/content/en/docs/reference/configuration/field-path-notation.md new file mode 100644 index 0000000000000..6c3b6d8ad6666 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/field-path-notation.md @@ -0,0 +1,76 @@ +--- +title: Field path notation reference +short: Field paths +weight: 7 +--- + +Throughout Vector's configuration you'll notice that certain options take field paths as values. In order to reference nested or array values, you can use Vector's field path notation. This notation is not anything special, it simply uses `.` and `[]` to access nested and array values, respectively. + +## Example + +Let's take this log event: + +```json +{ + "timestamp": "2020-02-14T01:22:23.223Z", + "application_id": 1, + "message": "Hello world", + "field.with.dot": "value", + "ec2": { + "instance_id": "abcd1234", + "tags": ["tag1: value1", "tag2: value1"] + } +} +``` + +We can access the values like so: + +Path | Value +:----|:----- +`"application_id"` | The root-level `application_id` field +`"ec2.instance_id"` | The child `instance_id` field +`"ec2.tags[0]"` | The first value in the child `tags` array + +## Syntax + +### Root-level values + +Root-level values can be accessed by supplying the name of the field, as shown in the example above: + +```toml +field_name +``` + +### Nested values + +Nested values can be accessed by separating ancestor fields using the `.` character: + +```toml +grandparent.parent.child +``` + +### Array Values + +Array values can be accessed using `[]` syntax. This accesses the first value since it has an index of 0: + +```toml +field_name[0] +``` + +This accesses the first value of the nested child field: + +```toml +parent.child[0] +``` + +### Escaping + +The special characters `.`, `[`, and `]` can be escaped with a `\`: + +```toml +field\.with\.dots +``` + +The above name is treated literally. + +The `\` character, if used literally, must be escaped with a `\` as well. diff --git a/docs/content/en/docs/reference/configuration/global-options.md b/docs/content/en/docs/reference/configuration/global-options.md new file mode 100644 index 0000000000000..d3c2059f3c88b --- /dev/null +++ b/docs/content/en/docs/reference/configuration/global-options.md @@ -0,0 +1,10 @@ +--- +title: Global options reference +short: Global options +weight: 4 +aliases: ["/docs/reference/global-options"] +--- + +## Global configuration parameters + +{{< config/global >}} diff --git a/docs/content/en/docs/reference/configuration/sinks/_index.md b/docs/content/en/docs/reference/configuration/sinks/_index.md new file mode 100644 index 0000000000000..90bfad3fb6cee --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/_index.md @@ -0,0 +1,13 @@ +--- +title: Sinks reference +short: Sinks +description: "**Deliver** your observability data to a variety of destinations" +component_type: sinks +weight: 3 +tags: ["components", "sinks"] +aliases: ["/sinks"] +--- + +## Available sinks + +{{< components "sink" >}} diff --git a/docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_logs.md b/docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_logs.md new file mode 100644 index 0000000000000..4ad2c457c3165 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_logs.md @@ -0,0 +1,11 @@ +--- +title: AWS Cloudwatch logs +description: Publish log events to [AWS Cloudwatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) +kind: sink +layout: component +tags: ["aws", "cloudwatch", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_metrics.md b/docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_metrics.md new file mode 100644 index 0000000000000..5e942504a0216 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/aws_cloudwatch_metrics.md @@ -0,0 +1,11 @@ +--- +title: AWS Cloudwatch metrics +description: Publish metric events to [AWS Cloudwatch Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html) +kind: sink +layout: component +tags: ["aws", "cloudwatch", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/aws_kinesis_firehose.md b/docs/content/en/docs/reference/configuration/sinks/aws_kinesis_firehose.md new file mode 100644 index 0000000000000..4368847bd7a16 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/aws_kinesis_firehose.md @@ -0,0 +1,11 @@ +--- +title: AWS Kinesis Data Firehose logs +description: Publish logs to [AWS Kinesis Data Firehose](https://aws.amazon.com/kinesis/data-firehose) topics +kind: sink +layout: component +tags: ["aws", "kinesis", "firehose", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/aws_kinesis_streams.md b/docs/content/en/docs/reference/configuration/sinks/aws_kinesis_streams.md new file mode 100644 index 0000000000000..42bfeae672630 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/aws_kinesis_streams.md @@ -0,0 +1,11 @@ +--- +title: AWS Kinesis Streams logs +description: Publish logs to [AWS Kinesis Streams](https://aws.amazon.com/kinesis/data-streams) topics +kind: sink +layout: component +tags: ["aws", "kinesis", "streams", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/aws_s3.md b/docs/content/en/docs/reference/configuration/sinks/aws_s3.md new file mode 100644 index 0000000000000..a85f9890018d9 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/aws_s3.md @@ -0,0 +1,12 @@ +--- +title: AWS S3 +description: Store observability events in the [AWS S3](https://aws.amazon.com/s3/) object storage system +kind: sink +layout: component +tags: ["aws", "s3", "component", "sink", "storage"] +aliases: ["/docs/reference/sinks/s3"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/aws_sqs.md b/docs/content/en/docs/reference/configuration/sinks/aws_sqs.md new file mode 100644 index 0000000000000..d957d766232d0 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/aws_sqs.md @@ -0,0 +1,11 @@ +--- +title: AWS SQS +description: Publish observability events to [Simple Queue Service](https://aws.amazon.com/sqs/) topics +kind: sink +layout: component +tags: ["aws", "sqs", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/azure_blob.md b/docs/content/en/docs/reference/configuration/sinks/azure_blob.md new file mode 100644 index 0000000000000..7877e4f8a1eb3 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/azure_blob.md @@ -0,0 +1,11 @@ +--- +title: Azure Blob Storage +description: Store your observability data in [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) +kind: sink +layout: component +tags: ["azure", "blob", "storage", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/azure_monitor_logs.md b/docs/content/en/docs/reference/configuration/sinks/azure_monitor_logs.md new file mode 100644 index 0000000000000..0283cc93ae8a9 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/azure_monitor_logs.md @@ -0,0 +1,11 @@ +--- +title: Azure Monitor Logs +description: Publish log events to the [Azure Monitor Logs](https://docs.microsoft.com/en-us/azure/azure-monitor/logs/data-platform-logs) service +kind: sink +layout: component +tags: ["azure", "monitor", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/blackhole.md b/docs/content/en/docs/reference/configuration/sinks/blackhole.md new file mode 100644 index 0000000000000..9d8756aac3e05 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/blackhole.md @@ -0,0 +1,11 @@ +--- +title: Blackhole +description: Send observability events nowhere, which can be useful for debugging purposes +kind: sink +layout: component +tags: ["blackhole", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/clickhouse.md b/docs/content/en/docs/reference/configuration/sinks/clickhouse.md new file mode 100644 index 0000000000000..8c65bd307bb32 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/clickhouse.md @@ -0,0 +1,11 @@ +--- +title: Clickhouse +description: Deliver log data to the [Clickhouse](https://clickhouse.tech) database +kind: sink +layout: component +tags: ["clickhole", "component", "sink", "storage", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/console.md b/docs/content/en/docs/reference/configuration/sinks/console.md new file mode 100644 index 0000000000000..c6c7f0079c657 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/console.md @@ -0,0 +1,11 @@ +--- +title: Console +description: Display observability events in the console, which can be useful for debugging purposes +kind: sink +layout: component +tags: ["console", "component", "sink", "debug"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/datadog_events.md b/docs/content/en/docs/reference/configuration/sinks/datadog_events.md new file mode 100644 index 0000000000000..96a0503d3cdbc --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/datadog_events.md @@ -0,0 +1,11 @@ +--- +title: Datadog events +description: Publish observability events to the [Datadog](https://docs.datadoghq.com) [Events API](https://docs.datadoghq.com/api/latest/events) +kind: sink +layout: component +tags: ["datadog", "component", "sink", "events"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/datadog_logs.md b/docs/content/en/docs/reference/configuration/sinks/datadog_logs.md new file mode 100644 index 0000000000000..13e29059016fe --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/datadog_logs.md @@ -0,0 +1,11 @@ +--- +title: Datadog logs +description: Publish log events to [Datadog](https://docs.datadoghq.com) +kind: sink +layout: component +tags: ["datadog", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/datadog_metrics.md b/docs/content/en/docs/reference/configuration/sinks/datadog_metrics.md new file mode 100644 index 0000000000000..536db48dad0ad --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/datadog_metrics.md @@ -0,0 +1,11 @@ +--- +title: Datadog metrics +description: Publish metric events to [Datadog](https://docs.datadoghq.com) +kind: sink +layout: component +tags: ["datadog", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/elasticsearch.md b/docs/content/en/docs/reference/configuration/sinks/elasticsearch.md new file mode 100644 index 0000000000000..92370fd60a549 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/elasticsearch.md @@ -0,0 +1,11 @@ +--- +title: Elasticsearch +description: Index observability events in [Elasticsearch](https://www.elastic.co/elasticsearch) +kind: sink +layout: component +tags: ["elasticsearch", "component", "sink", "search", "storage"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/file.md b/docs/content/en/docs/reference/configuration/sinks/file.md new file mode 100644 index 0000000000000..1227c8048f19a --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/file.md @@ -0,0 +1,11 @@ +--- +title: File +description: Output observability events into files +kind: sink +layout: component +tags: ["file", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/gcp_cloud_storage.md b/docs/content/en/docs/reference/configuration/sinks/gcp_cloud_storage.md new file mode 100644 index 0000000000000..39d85ee48a1ca --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/gcp_cloud_storage.md @@ -0,0 +1,12 @@ +--- +title: GCP Cloud Storage (GCS) +description: Store observability events in GCP [Cloud Storage](https://cloud.google.com/storage) +short: GCP Cloud Storage +kind: sink +layout: component +tags: ["gcp", "gcs", "cloud storage", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/gcp_pubsub.md b/docs/content/en/docs/reference/configuration/sinks/gcp_pubsub.md new file mode 100644 index 0000000000000..528850e98e92c --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/gcp_pubsub.md @@ -0,0 +1,11 @@ +--- +title: GCP PubSub +description: Publish observability events to GCP's [PubSub](https://cloud.google.com/pubsub) messaging system +kind: sink +layout: component +tags: ["gcp", "pubsub", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_logs.md b/docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_logs.md new file mode 100644 index 0000000000000..e56c386d2cc75 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_logs.md @@ -0,0 +1,12 @@ +--- +title: GCP Operations (formerly Stackdriver) logs +description: Deliver logs to GCP's [Cloud Operations](https://cloud.google.com/products/operations) suite +short: GCP Stackdriver +kind: sink +layout: component +tags: ["gcp", "stackdriver", "operations", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_metrics.md b/docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_metrics.md new file mode 100644 index 0000000000000..509202415a4eb --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/gcp_stackdriver_metrics.md @@ -0,0 +1,11 @@ +--- +title: GCP Cloud Monitoring (formerly Stackdriver) +description: Deliver metrics to GCP's [Cloud Monitoring](https://cloud.google.com/monitoring) system +kind: sink +layout: component +tags: ["gcp", "stackdriver", "operations", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/honeycomb.md b/docs/content/en/docs/reference/configuration/sinks/honeycomb.md new file mode 100644 index 0000000000000..07fb0b16dc9f9 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/honeycomb.md @@ -0,0 +1,11 @@ +--- +title: Honeycomb +description: Deliver log events to [Honeycomb](https://www.honeycomb.io) +kind: sink +layout: component +tags: ["honeycomb", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/http.md b/docs/content/en/docs/reference/configuration/sinks/http.md new file mode 100644 index 0000000000000..69434bf6920bc --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/http.md @@ -0,0 +1,11 @@ +--- +title: HTTP +description: Deliver observability event data to an HTTP server +kind: sink +layout: component +tags: ["http", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/humio_logs.md b/docs/content/en/docs/reference/configuration/sinks/humio_logs.md new file mode 100644 index 0000000000000..b74c2dcf96519 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/humio_logs.md @@ -0,0 +1,11 @@ +--- +title: Humio logs +description: Deliver log event data to [Humio](https://humio.com) +kind: sink +layout: component +tags: ["humio", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/humio_metrics.md b/docs/content/en/docs/reference/configuration/sinks/humio_metrics.md new file mode 100644 index 0000000000000..db7d2f54ac094 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/humio_metrics.md @@ -0,0 +1,11 @@ +--- +title: Humio metrics +description: Deliver metric event data to [Humio](https://humio.com) +kind: sink +layout: component +tags: ["humio", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/influxdb_logs.md b/docs/content/en/docs/reference/configuration/sinks/influxdb_logs.md new file mode 100644 index 0000000000000..b90755c60b767 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/influxdb_logs.md @@ -0,0 +1,11 @@ +--- +title: InfluxDB logs +description: Deliver log event data to [InfluxDB](https://influxdata.com) +kind: sink +layout: component +tags: ["influxdb", "influx", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/influxdb_metrics.md b/docs/content/en/docs/reference/configuration/sinks/influxdb_metrics.md new file mode 100644 index 0000000000000..c092f30451e7c --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/influxdb_metrics.md @@ -0,0 +1,11 @@ +--- +title: InfluxDB metrics +description: Deliver metric event data to [InfluxDB](https://influxdata.com) +kind: sink +layout: component +tags: ["influxdb", "influx", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/kafka.md b/docs/content/en/docs/reference/configuration/sinks/kafka.md new file mode 100644 index 0000000000000..44240d3673160 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/kafka.md @@ -0,0 +1,11 @@ +--- +title: Kafka +description: Publish observability event data to [Apache Kafka](https://kafka.apache.org) topics +kind: sink +layout: component +tags: ["kafka", "apache", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/logdna.md b/docs/content/en/docs/reference/configuration/sinks/logdna.md new file mode 100644 index 0000000000000..df5d8ed6d29af --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/logdna.md @@ -0,0 +1,11 @@ +--- +title: LogDNA +description: Deliver log event data to [LogDNA](https://logdna.com) +kind: sink +layout: component +tags: ["logdna", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/loki.md b/docs/content/en/docs/reference/configuration/sinks/loki.md new file mode 100644 index 0000000000000..6afc65e6f00cb --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/loki.md @@ -0,0 +1,11 @@ +--- +title: Loki +description: Deliver log event data to the [Loki](https://grafana.com/oss/loki) aggregation system +kind: sink +layout: component +tags: ["loki", "grafana", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/nats.md b/docs/content/en/docs/reference/configuration/sinks/nats.md new file mode 100644 index 0000000000000..9cd9d123e0b45 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/nats.md @@ -0,0 +1,11 @@ +--- +title: NATS +description: Publish observability data to subjects on the [NATS](https://nats.io) messaging system +kind: sink +layout: component +tags: ["nats", "pubsub", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/new_relic_logs.md b/docs/content/en/docs/reference/configuration/sinks/new_relic_logs.md new file mode 100644 index 0000000000000..a2e21191e5183 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/new_relic_logs.md @@ -0,0 +1,11 @@ +--- +title: New Relic logs +description: Deliver log events to [New Relic](https://newrelic.com) +kind: sink +layout: component +tags: ["new relic", "newrelic", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/papertrail.md b/docs/content/en/docs/reference/configuration/sinks/papertrail.md new file mode 100644 index 0000000000000..eb0514d8482d1 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/papertrail.md @@ -0,0 +1,11 @@ +--- +title: Papertrail +description: Deliver log events to [Papertrail](https://www.solarwinds.com/papertrail) from SolarWinds +kind: sink +layout: component +tags: ["papertrail", "solarwinds", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/prometheus_exporter.md b/docs/content/en/docs/reference/configuration/sinks/prometheus_exporter.md new file mode 100644 index 0000000000000..19875c8864a80 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/prometheus_exporter.md @@ -0,0 +1,12 @@ +--- +title: Prometheus Exporter +description: Output metric events to a [Prometheus exporter](https://prometheus.io/docs/instrumenting/exporters) running on the host +kind: sink +layout: component +tags: ["prometheus", "exporter", "component", "sink", "metrics"] +aliases: ["/docs/reference/sinks/prometheus"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/prometheus_remote_write.md b/docs/content/en/docs/reference/configuration/sinks/prometheus_remote_write.md new file mode 100644 index 0000000000000..816966059ee5c --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/prometheus_remote_write.md @@ -0,0 +1,11 @@ +--- +title: Prometheus remote write +description: Deliver metric data to a [Prometheus remote write](https://prometheus.io/docs/practices/remote_write) endpoint +kind: sink +layout: component +tags: ["prometheus", "remote write", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/pulsar.md b/docs/content/en/docs/reference/configuration/sinks/pulsar.md new file mode 100644 index 0000000000000..ed178050c1d29 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/pulsar.md @@ -0,0 +1,11 @@ +--- +title: Pulsar +description: Publish observability events to [Apache Pulsar](https://pulsar.apache.org) topics +kind: sink +layout: component +tags: ["pulsar", "apache", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/sematext_logs.md b/docs/content/en/docs/reference/configuration/sinks/sematext_logs.md new file mode 100644 index 0000000000000..7ad5fee833f76 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/sematext_logs.md @@ -0,0 +1,11 @@ +--- +title: Sematext logs +description: Publish log events to [Sematext](https://sematext.com) +kind: sink +layout: component +tags: ["sematext", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/sematext_metrics.md b/docs/content/en/docs/reference/configuration/sinks/sematext_metrics.md new file mode 100644 index 0000000000000..60ec4e9bc577f --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/sematext_metrics.md @@ -0,0 +1,11 @@ +--- +title: Sematext metrics +description: Publish metric events to [Sematext](https://sematext.com) +kind: sink +layout: component +tags: ["sematext", "component", "sink", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/socket.md b/docs/content/en/docs/reference/configuration/sinks/socket.md new file mode 100644 index 0000000000000..bb2e7800f59b2 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/socket.md @@ -0,0 +1,12 @@ +--- +title: Socket +description: Deliver logs to a remote socket endpoint +kind: sink +layout: component +tags: ["socket", "remote", "component", "sink", "logs"] +aliases: ["/docs/reference/sinks/tcp"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/splunk_hec.md b/docs/content/en/docs/reference/configuration/sinks/splunk_hec.md new file mode 100644 index 0000000000000..a4b65e4aeedce --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/splunk_hec.md @@ -0,0 +1,11 @@ +--- +title: Splunk HEC +description: Deliver log data to Splunk's [HTTP Event Collector](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector) +kind: sink +layout: component +tags: ["splunk", "hec", "http event collector", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/statsd.md b/docs/content/en/docs/reference/configuration/sinks/statsd.md new file mode 100644 index 0000000000000..89d64eff73680 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/statsd.md @@ -0,0 +1,11 @@ +--- +title: Statsd +description: Deliver log data to a [StatsD](https://github.com/statsd/statsd) aggregator +kind: sink +layout: component +tags: ["statsd", "component", "sink", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sinks/vector.md b/docs/content/en/docs/reference/configuration/sinks/vector.md new file mode 100644 index 0000000000000..780548b88579d --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sinks/vector.md @@ -0,0 +1,11 @@ +--- +title: Vector +description: Relay observability data to another Vector instance +kind: sink +layout: component +tags: ["vector", "instance", "component", "sink"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/_index.md b/docs/content/en/docs/reference/configuration/sources/_index.md new file mode 100644 index 0000000000000..dd27292a966a9 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/_index.md @@ -0,0 +1,16 @@ +--- +title: Sources reference +short: Sources +description: "**Ingest** observability data from a wide variety of targets" +component_type: sources +layout: components +weight: 1 +tags: ["components", "sources"] +aliases: ["/sources"] +--- + +Vector enables you to take in observability data from a wide variety of **sources**. + +## Available sources + +{{< components "source" >}} diff --git a/docs/content/en/docs/reference/configuration/sources/apache_metrics.md b/docs/content/en/docs/reference/configuration/sources/apache_metrics.md new file mode 100644 index 0000000000000..449f077717dad --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/apache_metrics.md @@ -0,0 +1,12 @@ +--- +title: Apache HTTP server (HTTPD) metrics +description: Collect metrics from Apache's [HTTPD](https://httpd.apache.org) server +short: Apache Metrics +kind: source +layout: component +tags: ["apache", "http", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/aws_ecs_metrics.md b/docs/content/en/docs/reference/configuration/sources/aws_ecs_metrics.md new file mode 100644 index 0000000000000..4fa875097970b --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/aws_ecs_metrics.md @@ -0,0 +1,13 @@ +--- +title: AWS ECS metrics +description: > + Collect Docker container stats for tasks running in [AWS ECS](https://aws.amazon.com/ecs) and + [AWS Fargate](https://aws.amazon.com/fargate) +kind: source +layout: component +tags: ["aws", "ecs", "docker", "fargate", "container", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/aws_kinesis_firehose.md b/docs/content/en/docs/reference/configuration/sources/aws_kinesis_firehose.md new file mode 100644 index 0000000000000..4efe60fb501e4 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/aws_kinesis_firehose.md @@ -0,0 +1,11 @@ +--- +title: AWS Kinesis Firehose +description: Collect logs from [AWS Kinesis Firehose](https://aws.amazon.com/kinesis/data-firehose) +kind: source +layout: component +tags: ["aws", "kinesis", "firehose", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/aws_s3.md b/docs/content/en/docs/reference/configuration/sources/aws_s3.md new file mode 100644 index 0000000000000..76a4b3e917158 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/aws_s3.md @@ -0,0 +1,11 @@ +--- +title: AWS S3 +description: Collect logs from [AWS S3](https://aws.amazon.com/s3) +kind: source +layout: component +tags: ["aws", "s3", "storage", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/datadog_logs.md b/docs/content/en/docs/reference/configuration/sources/datadog_logs.md new file mode 100644 index 0000000000000..4702a38a4ddfa --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/datadog_logs.md @@ -0,0 +1,11 @@ +--- +title: Datadog logs +description: Receive logs collected by a [Datadog Agent](https://docs.datadoghq.com/agent) +kind: source +layout: component +tags: ["datadog", "agent", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/dnstap.md b/docs/content/en/docs/reference/configuration/sources/dnstap.md new file mode 100644 index 0000000000000..ec371bf518054 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/dnstap.md @@ -0,0 +1,11 @@ +--- +title: dnstap +description: Collect DNS logs from a [dnstap](https://dnstap.info)-compatible server +kind: source +layout: component +tags: ["dnstap", "dns", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/docker_logs.md b/docs/content/en/docs/reference/configuration/sources/docker_logs.md new file mode 100644 index 0000000000000..d7f7db81de743 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/docker_logs.md @@ -0,0 +1,11 @@ +--- +title: Docker logs +description: Collect logs from [Docker](https://docker.com) +kind: source +layout: component +tags: ["docker", "container", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/eventstoredb_metrics.md b/docs/content/en/docs/reference/configuration/sources/eventstoredb_metrics.md new file mode 100644 index 0000000000000..64f53d2903a64 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/eventstoredb_metrics.md @@ -0,0 +1,11 @@ +--- +title: EventStoreDB metrics +description: Receive metrics from collected by a [EventStoreDB](https://www.eventstore.com/) +kind: source +layout: component +tags: ["eventstore", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/exec.md b/docs/content/en/docs/reference/configuration/sources/exec.md new file mode 100644 index 0000000000000..db837be06a1ef --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/exec.md @@ -0,0 +1,11 @@ +--- +title: Exec +description: Collect output from a process running on the host +kind: source +layout: component +tags: ["exec", "process", "component", "source"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/file.md b/docs/content/en/docs/reference/configuration/sources/file.md new file mode 100644 index 0000000000000..3ee584f5e46ae --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/file.md @@ -0,0 +1,11 @@ +--- +title: File +description: Collect logs from [files](https://en.wikipedia.org/wiki/File_system) +kind: source +layout: component +tags: ["file", "component", "source"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/fluent.md b/docs/content/en/docs/reference/configuration/sources/fluent.md new file mode 100644 index 0000000000000..f89ce4ffe8a66 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/fluent.md @@ -0,0 +1,11 @@ +--- +title: Fluent +description: Collect logs from a [Fluentd](https://fluentd.org) or [Fluent Bit](https://fluentbit.io) agent +kind: source +layout: component +tags: ["fluentd", "fluent", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/generator.md b/docs/content/en/docs/reference/configuration/sources/generator.md new file mode 100644 index 0000000000000..2274a4d397ae1 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/generator.md @@ -0,0 +1,11 @@ +--- +title: Generator +description: Generate fake events, which can be useful for testing, benchmarking, and demos +kind: source +layout: component +tags: ["generator", "random", "fake", "component", "source"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/heroku_logs.md b/docs/content/en/docs/reference/configuration/sources/heroku_logs.md new file mode 100644 index 0000000000000..fd3cbf0ceecb3 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/heroku_logs.md @@ -0,0 +1,11 @@ +--- +title: Heroku Logplex +description: Collect logs from Heroku's [Logplex](https://devcenter.heroku.com/articles/logplex), the router responsible for receiving logs from your Heroku apps +kind: source +layout: component +tags: ["heroku", "logplex", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/host_metrics.md b/docs/content/en/docs/reference/configuration/sources/host_metrics.md new file mode 100644 index 0000000000000..2e25a2db381ab --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/host_metrics.md @@ -0,0 +1,11 @@ +--- +title: Host metrics +description: Collect metric data from the local system +kind: source +layout: component +tags: ["vector", "host", "local", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/http.md b/docs/content/en/docs/reference/configuration/sources/http.md new file mode 100644 index 0000000000000..8b2b76e68c576 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/http.md @@ -0,0 +1,11 @@ +--- +title: HTTP +description: Collect logs emitted by an [HTTP](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request) server +kind: source +layout: component +tags: ["http", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/internal_logs.md b/docs/content/en/docs/reference/configuration/sources/internal_logs.md new file mode 100644 index 0000000000000..b5245c9aa4364 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/internal_logs.md @@ -0,0 +1,11 @@ +--- +title: Internal logs +description: Expose all log and trace messages emitted by the running Vector instance +kind: source +layout: component +tags: ["vector", "instance", "local", "internal", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/internal_metrics.md b/docs/content/en/docs/reference/configuration/sources/internal_metrics.md new file mode 100644 index 0000000000000..5e3ccc9a9fc82 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/internal_metrics.md @@ -0,0 +1,11 @@ +--- +title: Internal metrics +description: Access to the metrics produced by Vector itself and process them in your Vector pipeline +kind: source +layout: component +tags: ["vector", "instance", "local", "internal", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/journald.md b/docs/content/en/docs/reference/configuration/sources/journald.md new file mode 100644 index 0000000000000..8af33ed069ed3 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/journald.md @@ -0,0 +1,11 @@ +--- +title: JournalD +description: Collect logs from [JournalD](https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html) +kind: source +layout: component +tags: ["journald", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/kafka.md b/docs/content/en/docs/reference/configuration/sources/kafka.md new file mode 100644 index 0000000000000..29c924c1dcbdd --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/kafka.md @@ -0,0 +1,11 @@ +--- +title: Kafka +description: Collect logs from [Kafka](https://kafka.apache.org) +kind: source +layout: component +tags: ["kafka", "apache", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/kubernetes_logs.md b/docs/content/en/docs/reference/configuration/sources/kubernetes_logs.md new file mode 100644 index 0000000000000..a61ae0830dcf8 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/kubernetes_logs.md @@ -0,0 +1,11 @@ +--- +title: Kubernetes logs +description: Collect logs from [Kubernetes](https://kubernetes.io) Nodes +kind: source +layout: component +tags: ["kubernetes", "k8s", "node", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/logstash.md b/docs/content/en/docs/reference/configuration/sources/logstash.md new file mode 100644 index 0000000000000..6615abadb28e6 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/logstash.md @@ -0,0 +1,11 @@ +--- +title: Logstash +description: Collect logs from a [LogStash](https://www.elastic.co/logstash) agent +kind: source +layout: component +tags: ["logstash", "elastic", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/mongodb_metrics.md b/docs/content/en/docs/reference/configuration/sources/mongodb_metrics.md new file mode 100644 index 0000000000000..f902ecabc93dc --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/mongodb_metrics.md @@ -0,0 +1,11 @@ +--- +title: MongoDB metrics +description: Collect metrics from the [MongoDB](https://mongodb.com) database +kind: source +layout: component +tags: ["mongodb", "mongo", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/nginx_metrics.md b/docs/content/en/docs/reference/configuration/sources/nginx_metrics.md new file mode 100644 index 0000000000000..66434a84d8526 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/nginx_metrics.md @@ -0,0 +1,11 @@ +--- +title: NGINX metrics +description: Collect metrics from [NGINX](https://nginx.com) +kind: source +layout: component +tags: ["nginx", "http", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/postgresql_metrics.md b/docs/content/en/docs/reference/configuration/sources/postgresql_metrics.md new file mode 100644 index 0000000000000..09b18ed525749 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/postgresql_metrics.md @@ -0,0 +1,11 @@ +--- +title: PostgreSQL metrics +description: Collect metrics from the [PostgreSQL](https://postgresql.org) database +kind: source +layout: component +tags: ["postgresql", "postgres", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/prometheus_remote_write.md b/docs/content/en/docs/reference/configuration/sources/prometheus_remote_write.md new file mode 100644 index 0000000000000..e0807ab59388a --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/prometheus_remote_write.md @@ -0,0 +1,11 @@ +--- +title: Prometheus remote write +description: Collect metrics from [Prometheus](https://prometheus.io) +kind: source +layout: component +tags: ["prometheus", "remote write", "component", "source", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/prometheus_scrape.md b/docs/content/en/docs/reference/configuration/sources/prometheus_scrape.md new file mode 100644 index 0000000000000..a26ed8b3cab39 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/prometheus_scrape.md @@ -0,0 +1,12 @@ +--- +title: Prometheus scrape +description: Collect metrics via the [Prometheus](https://prometheus.io) client +kind: source +layout: component +tags: ["prometheus", "scrape", "component", "source", "metrics"] +aliases: ["/docs/reference/sources/prometheus"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/socket.md b/docs/content/en/docs/reference/configuration/sources/socket.md new file mode 100644 index 0000000000000..a9b5c270ae381 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/socket.md @@ -0,0 +1,12 @@ +--- +title: Socket +description: Collect logs using the [socket](https://en.wikipedia.org/wiki/Network_socket) client +kind: source +layout: component +tags: ["socket", "component", "source", "logs"] +aliases: ["/docs/reference/sources/tcp", "/docs/reference/sources/udp"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/splunk_hec.md b/docs/content/en/docs/reference/configuration/sources/splunk_hec.md new file mode 100644 index 0000000000000..a4662668e3939 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/splunk_hec.md @@ -0,0 +1,12 @@ +--- +title: Splunk HTTP Event Collector (HEC) +description: Receive logs from [Splunk](https://splunk.com) +short: Splunk HEC +kind: source +layout: component +tags: ["splunk", "hec", "http event collector", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/statsd.md b/docs/content/en/docs/reference/configuration/sources/statsd.md new file mode 100644 index 0000000000000..9470e133d8240 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/statsd.md @@ -0,0 +1,11 @@ +--- +title: StatsD +description: Collect logs emitted by the [StatsD](https://github.com/statsd/statsd) aggregator +kind: source +layout: component +tags: ["statsd", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/stdin.md b/docs/content/en/docs/reference/configuration/sources/stdin.md new file mode 100644 index 0000000000000..7f17dd3b56c17 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/stdin.md @@ -0,0 +1,11 @@ +--- +title: stdin +description: Collect logs sent via [stdin](https://en.wikipedia.org/wiki/Standard_streams#Standard_input_(stdin)) +kind: source +layout: component +tags: ["stdin", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/syslog.md b/docs/content/en/docs/reference/configuration/sources/syslog.md new file mode 100644 index 0000000000000..c134262f5adaa --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/syslog.md @@ -0,0 +1,11 @@ +--- +title: Syslog +description: Collect logs sent via [Syslog](https://en.wikipedia.org/wiki/Syslog) +kind: source +layout: component +tags: ["syslog", "component", "source", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/sources/vector.md b/docs/content/en/docs/reference/configuration/sources/vector.md new file mode 100644 index 0000000000000..94c1a78e82634 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/sources/vector.md @@ -0,0 +1,11 @@ +--- +title: Vector +description: Collect observability data from another Vector instance +kind: source +layout: component +tags: ["vector", "instance", "component", "source"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/template-syntax.md b/docs/content/en/docs/reference/configuration/template-syntax.md new file mode 100644 index 0000000000000..bf6769d631278 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/template-syntax.md @@ -0,0 +1,122 @@ +--- +title: Template syntax +weight: 6 +aliases: ["/docs/reference/templates", "/docs/reference/configuration/templates"] +--- + +Vector supports a template syntax for some configuration options. This allows for dynamic values derived from event data. Options that support this syntax will be clearly documented as such in the option description. + +## Example + +For example, let's partition data on AWS S3 by application_id and date. We can accomplish this with the key_prefix option in the aws_s3 sink: + +```toml +[sinks.backup] + type = "aws_s3" + bucket = "all_application_logs" + key_prefix = "application_id={{ application_id }}/date=%F/" +``` + +Notice that Vector allows direct field references as well as strftime specifiers. If we were to run the following log event though Vector: + +```json +{ + "timestamp": "2020-02-14T01:22:23.223Z", + "application_id": 1, + "message": "Hello world" +} +``` + +The value of the key_prefix option would equal: + +``` +application_id=1/date=2020-02-14 +``` + +Because the [`aws_s3`][aws_s3] sink batches data, each event would be grouped by its produced value. This effectively enables dynamic partitioning, something fundamental to storing log data in filesystems. + +## Syntax + +### Event fields + +Individual [log event][log] fields can be accessed using `{{ }}` syntax: + +```toml +option = "{{ field_path_notation }}" +``` + +Vector's [field notation][fields] uses `.` to target nested fields and `[]` to target array values. + +### strftime specifiers + +In addition to directly accessing fields, Vector offers a shortcut for injecting [strftime specifiers][strftime]: + +```toml +options = "year=%Y/month=%m/day=%d/" +``` + +The value is derived from the [`timestamp` field][timestamp] and the name of this field can be changed via the [global `timestamp_key` option][timestamp_key]. + +### Escaping + +You can escape this syntax by prefixing the character with a `\`. For example, you can escape the event field syntax like this: + +```toml +option = "\{{ field_name }}" +``` + +And [strftime] specified like so: + +```toml +options = "year=\%Y/month=\%m/day=\%d/" +``` + +Each of the values above would be treated literally. + +## How it works + +### Array Values + +Array values can be accessed using Vector's [field notation syntax][paths]: + +```toml +option = "{{ parent.child[0] }}" +``` + +### Fallback values + +Vector doesn't currently support fallback values. [Issue 1692][1692] is open to add this functionality. In the interim, you can use the [`lua` transform][lua] to set a default value: + +```toml +[transforms.set_defaults] + # REQUIRED + type = "lua" + inputs = ["my-source-id"] + source = ''' + if event["my_field"] == nil then + event["my_field"] = "default" + end + ''' +``` + +### Missing fields + +If a field is missing, a blank string is inserted in its place. In that case, Vector neither errors nor drops the event nor logs anything. + +### Nested fields + +Nested values can be accessed using Vector's [field notation syntax][paths]: + +```toml +option = "{{ parent.child[0] }}" +``` + + +[1692]: https://github.com/timberio/vector/issues/1692 +[aws_s3]: /docs/reference/configuration/sinks/aws_s3 +[fields]: /docs/reference/configuration/field-path-notation +[log]: /docs/about/under-the-hood/architecture/data-model/log +[paths]: /docs/reference/configuration/field-path-notation +[strftime]: https://docs.rs/chrono/0.4.19/chrono/format/strftime/index.html#specifiers +[timestamp]: /docs/about/under-the-hood/architecture/data-model/log/#timestamps +[timestamp_key]: /docs/reference/configuration/global-options/#log_schema.timestamp_key diff --git a/docs/content/en/docs/reference/configuration/tests.md b/docs/content/en/docs/reference/configuration/tests.md new file mode 100644 index 0000000000000..cdcbe47ab96d4 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/tests.md @@ -0,0 +1,18 @@ +--- +title: Unit testing Vector configurations +short: Unit tests +weight: 5 +aliases: ["/docs/reference/tests"] +--- + +Vector enables you to unit test [transforms] in your processing topology + +You can define unit tests in your Vector configuration file to cover a network of transforms within the topology. The intention of these tests is to improve the maintainability of configurations containing larger and more complex combinations of transforms. + +You can execute tests within a configuration file using the `test` subcommand: + +```bash +vector test /etc/vector/vector.toml +``` + +[transforms]: /docs/reference/glossary/#transform diff --git a/docs/content/en/docs/reference/configuration/transforms/_index.md b/docs/content/en/docs/reference/configuration/transforms/_index.md new file mode 100644 index 0000000000000..d6e2511c377e6 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/_index.md @@ -0,0 +1,14 @@ +--- +title: Transforms reference +short: Transforms +description: "**Shape** your data as it moves through your Vector topology" +component_type: transforms +layout: components +weight: 2 +tags: ["components", "transforms"] +aliases: ["/transforms"] +--- + +## Available transforms + +{{< components "transform" >}} diff --git a/docs/content/en/docs/reference/configuration/transforms/aggregate.md b/docs/content/en/docs/reference/configuration/transforms/aggregate.md new file mode 100644 index 0000000000000..ca1faf1a8666f --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/aggregate.md @@ -0,0 +1,10 @@ +--- +title: Aggregate +kind: transform +layout: component +tags: ["aggregate", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser.md b/docs/content/en/docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser.md new file mode 100644 index 0000000000000..1a75d8aade403 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser.md @@ -0,0 +1,12 @@ +--- +title: AWS Cloudwatch Logs Subscription Parser +description: Parse logs from [AWS Cloudwatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html) +kind: transform +deprecated: true +layout: component +tags: [] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/aws_ec2_metadata.md b/docs/content/en/docs/reference/configuration/transforms/aws_ec2_metadata.md new file mode 100644 index 0000000000000..4b52c981897dc --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/aws_ec2_metadata.md @@ -0,0 +1,11 @@ +--- +title: AWS EC2 metadata +description: Parse metadata emitted by [AWS EC2](https://aws.amazon.com/ec2) instances +kind: transform +layout: component +tags: ["aws", "ec2", "metadata", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/dedupe.md b/docs/content/en/docs/reference/configuration/transforms/dedupe.md new file mode 100644 index 0000000000000..1c5a228b03f01 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/dedupe.md @@ -0,0 +1,12 @@ +--- +title: Dedupe events +description: Deduplicate events passing through a topology, i.e. eliminate any events with duplicated content within a specified time window +short: Dedupe +kind: transform +layout: component +tags: ["dedupe", "deduplicate", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/filter.md b/docs/content/en/docs/reference/configuration/transforms/filter.md new file mode 100644 index 0000000000000..56beae65d51d4 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/filter.md @@ -0,0 +1,11 @@ +--- +title: Filter +description: Filter events based on a set of conditions +kind: transform +layout: component +tags: ["filter", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/geoip.md b/docs/content/en/docs/reference/configuration/transforms/geoip.md new file mode 100644 index 0000000000000..3bdac06123c8b --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/geoip.md @@ -0,0 +1,11 @@ +--- +title: GeoIP +description: Enrich events with GeoIP metadata +kind: transform +layout: component +tags: ["geo", "geoip", "enrich", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/log_to_metric.md b/docs/content/en/docs/reference/configuration/transforms/log_to_metric.md new file mode 100644 index 0000000000000..688e9c65fae45 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/log_to_metric.md @@ -0,0 +1,11 @@ +--- +title: Log to metric +description: Convert log events to metric events +kind: transform +layout: component +tags: ["log to metric", "convert", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/lua.md b/docs/content/en/docs/reference/configuration/transforms/lua.md new file mode 100644 index 0000000000000..50d9d5cefdd06 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/lua.md @@ -0,0 +1,11 @@ +--- +title: Lua +description: Modify event data using the [Lua](https://lua.org) programming language +kind: transform +layout: component +tags: ["lua", "runtime", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/metric_to_log.md b/docs/content/en/docs/reference/configuration/transforms/metric_to_log.md new file mode 100644 index 0000000000000..0bf30b61a5510 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/metric_to_log.md @@ -0,0 +1,11 @@ +--- +title: Metric to log +description: Convert metric events to log events +kind: transform +layout: component +tags: ["metric to log", "convert", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/reduce.md b/docs/content/en/docs/reference/configuration/transforms/reduce.md new file mode 100644 index 0000000000000..0722760289a86 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/reduce.md @@ -0,0 +1,11 @@ +--- +title: Reduce +description: Collapse multiple log events into a single event based on a set of conditions and merge strategies +kind: transform +layout: component +tags: ["filter", "multiline", "component", "transform", "logs"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/remap.md b/docs/content/en/docs/reference/configuration/transforms/remap.md new file mode 100644 index 0000000000000..52fd6deb1cb94 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/remap.md @@ -0,0 +1,14 @@ +--- +title: Remap with VRL +description: > + Modify your observability data as it passes through your topology using [Vector Remap Language](/docs/reference/vrl) (VRL) +kind: transform +featured: true +layout: component +weight: 1 +tags: ["remap", "vrl", "vector remap language", "modify", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/route.md b/docs/content/en/docs/reference/configuration/transforms/route.md new file mode 100644 index 0000000000000..174169fc6eb35 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/route.md @@ -0,0 +1,11 @@ +--- +title: Route +description: Split a stream of events into multiple sub-streams based on user-supplied conditions +kind: transforms +layout: component +tags: ["route", "swimlanes", "split", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/sample.md b/docs/content/en/docs/reference/configuration/transforms/sample.md new file mode 100644 index 0000000000000..7a1af4cf31812 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/sample.md @@ -0,0 +1,11 @@ +--- +title: Sample +description: Sample events from an event stream based on supplied criteria and at a configurable rate +kind: transform +layout: component +tags: ["sample", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/tag_cardinality_limit.md b/docs/content/en/docs/reference/configuration/transforms/tag_cardinality_limit.md new file mode 100644 index 0000000000000..a38585798aa6f --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/tag_cardinality_limit.md @@ -0,0 +1,11 @@ +--- +title: Tag cardinality limit +description: Limit the cardinality of tags on metrics events as a safeguard against cardinality explosion +kind: transform +layout: component +tags: ["tag", "cardinality", "component", "transform", "metrics"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/configuration/transforms/wasm.md b/docs/content/en/docs/reference/configuration/transforms/wasm.md new file mode 100644 index 0000000000000..c6e014e057749 --- /dev/null +++ b/docs/content/en/docs/reference/configuration/transforms/wasm.md @@ -0,0 +1,12 @@ +--- +title: WebAssembly (Wasm) transform +description: Modify events using an embedded [WebAssembly](https://webassembly.org) (Wasm) virtual machine +short: Wasm +kind: transform +layout: component +tags: ["wasm", "webassembly", "runtime", "component", "transform"] +--- + +{{/* This doc is generated using: + 1. The template in layouts/docs/component.html + 2. The relevant CUE data in cue/reference/components/... */}} diff --git a/docs/content/en/docs/reference/glossary.md b/docs/content/en/docs/reference/glossary.md new file mode 100644 index 0000000000000..1db25ac5ca8f7 --- /dev/null +++ b/docs/content/en/docs/reference/glossary.md @@ -0,0 +1,7 @@ +--- +title: Glossary +description: Definitions of Vector-specific terms +show_toc: true +--- + +{{< glossary >}} diff --git a/docs/content/en/docs/reference/vrl/_index.md b/docs/content/en/docs/reference/vrl/_index.md new file mode 100644 index 0000000000000..4248e6d8d6432 --- /dev/null +++ b/docs/content/en/docs/reference/vrl/_index.md @@ -0,0 +1,152 @@ +--- +title: Vector Remap Language (VRL) +description: A domain-specific language for modifying your observability data +short: Vector Remap Language +weight: 4 +aliases: ["/docs/reference/remap"] +--- + +Vector Remap Language (VRL) is an expression-oriented language designed for transforming observability data (logs and metrics) in a [safe](#safety) and [performant](#performance) manner. It features a simple [syntax](expressions) and a rich set of built-in functions tailored specifically to observability use cases. + +You can use VRL in Vector via the [`remap`][remap] transform. For a more in-depth picture, see the [announcement blog post][blog_post]. + +## Quickstart + +VRL programs act on a single observability [event](#event) and can be used to: + +* **Transform** observability events +* Specify **conditions** for [routing][route] and [filtering][filter] events + +Those programs are specified as part of your Vector [configuration]. Here's an example `remap` transform that contains a VRL program in the `source` field: + +```toml {title="vector.toml"} +[transforms.modify] +type = "remap" +inputs = ["logs"] +source = ''' + del(.user_info) + .timestamp = now() +''' +``` + +This program changes the contents of each event that passes through this transform, [deleting][del] the `user_info` field and adding a [timestamp][now] to the event. + +### Example: parsing JSON + +Let's have a look at a more complex example. Imagine that you're working with HTTP log events that look like this: + +``` +"{\"status\":200,\"timestamp\":\"2021-03-01T19:19:24.646170Z\",\"message\":\"SUCCESS\",\"username\":\"ub40fan4life\"}" +``` + +You want to apply these changes to each event: + +* Parse the raw string into JSON +* Reformat the `time` into a UNIX timestamp +* Remove the `username` field +* Convert the `message` to lowercase + +This VRL program would accomplish all of that: + +```ruby +. = parse_json!(string!(.message)) +.timestamp = to_unix_timestamp(to_timestamp!(.timestamp)) +del(.username) +.message = downcase(string!(.message)) +``` + +Finally, the resulting event: + +```json +{ + "message": "success", + "status": 200, + "timestamp": 1614626364 +} +``` + +### Example: filtering events + +The JSON parsing program in the example above modifies the contents of each event. But you can also use VRL to specify conditions, which convert events into a single Boolean expression. Here's an example [`filter`][filter] transform that filters out all messages for which the `severity` field equals `"info"`: + +```toml {title="vector.toml"} +[transforms.filter_out_info] +type = "filter" +inputs = ["logs"] +condition = '.severity != "info"' +``` + +Conditions can also be more multifaceted. This condition would filter out all events for which the `severity` field is `"info"`, the `status_code` field is greater than or equal to 400, and the `host` field isn't set: + +```vrl +condition = '.severity != "info" && .status_code < 400 && exists(.host) +``` + +{{< info title="More VRL examples" >}} +You can find more VRL examples further down [on this page](#other-examples) or in the [VRL example reference](/docs/reference/vrl/examples). +{{< /info >}} + +## Reference + +All language constructs are contained in the following reference pages. Use these references as you write your VRL programs: + +{{< pages >}} + +## Learn + +VRL is designed to minimize the learning curve. These resources can help you get acquainted with Vector and VRL: + +{{< jump "/docs/setup/quickstart" >}} +{{< jump "/guides/level-up/transformation" >}} + +## The goals of VRL {#goals} + +VRL is built by the Vector team and its development is guided by two core goals, [safety](#safety) and [performance](#performance), without compromising on flexibility. This makes VRL ideal for critical, performance-sensitive infrastructure, like observabiity pipelines. To illustrate how we achieve these, below is a VRL feature matrix across these principles: + +Feature | Safety | Performance +:-------|:-------|:----------- +[Compilation](#compilation) | ✅ | ✅ +[Ergonomic safety](#ergonomic-safety) | ✅ | ✅ +[Fail safety](#fail-safety) | ✅ | +[Memory safety](#memory-safety) | ✅ | +[Vector and Rust native](#vector-rust-native) | ✅ | ✅ +[Statelessness](#stateless) | ✅ | ✅ + +## Concepts + +VRL has some core concepts that you should be aware of as you dive in. + +{{< vrl/concepts >}} + +## Features + +{{< vrl/features >}} + +## Principles + +{{< vrl/principles >}} + +## Other examples + +{{< vrl/real-world-examples >}} + +[affine_types]: https://en.wikipedia.org/wiki/Substructural_type_system#Affine_type_systems +[blog_post]: /blog/vector-remap-language +[configuration]: /docs/reference/configuration +[dedupe]: /docs/reference/configuration/transforms/dedupe +[del]: /docs/reference/vrl/functions#del +[errors]: /docs/reference/vrl/errors +[events]: /docs/about/under-the-hood-architecture/data-model +[fail_safe]: https://en.wikipedia.org/wiki/Fail-safe +[ffi]: https://en.wikipedia.org/wiki/Foreign_function_interface +[filter]: /docs/reference/configuration/transforms/filter +[log]: /docs/reference/vrl/functions#log +[logs]: /docs/about/under-the-hood/architecture/data-model/log +[memory_safety]: https://en.wikipedia.org/wiki/Memory_safety +[metrics]: /docs/about/under-the-hood/architecture/data-model/metrics +[now]: /docs/reference/vrl/functions#now +[remap]: /docs/reference/configuration/transforms/remap +[route]: /docs/reference/configuration/transforms/route +[rust]: https://rust-lang.org +[rust_security]: https://thenewstack.io/microsoft-rust-is-the-industrys-best-chance-at-safe-systems-programming/ +[vrl_error_handling]: /docs/reference/vrl/errors#handling diff --git a/docs/content/en/docs/reference/vrl/errors.md b/docs/content/en/docs/reference/vrl/errors.md new file mode 100644 index 0000000000000..5cb8e59cb0a3e --- /dev/null +++ b/docs/content/en/docs/reference/vrl/errors.md @@ -0,0 +1,96 @@ +--- +title: VRL error reference +short: Errors +weight: 2 +--- + +VRL is a [fail-safe][fail_safety] language, which means that a VRL program doesn't compile unless every potential error is handled. Observability data is notoriously unpredictable and fail safety ensures that your VRL programs elegantly handle malformed data. + +## Compile-time errors + +{{< vrl/errors/compile-time >}} + +## Runtime errors + +A runtime error occurs after compilation and during program runtime. Because VRL is fail safe, runtime error must be [handled](#handling). This forces you to address how VRL programs should respond to errors. + +Runtime errors are strings that describe the error. + +### Handling + +You have three options for handling errors in VRL: + +* [Assign](#assigning) the error +* [Coalesce](#coalescing) the error +* [Raise](#raising) the error + +#### Assigning + +As documented in the [assignment expression reference], you can **assign** errors when invoking an expression that's fallible. When assigned, runtime errors are simple strings: + +```ruby +structured, err = parse_json("not json") +if err != null { + log("Unable to parse JSON: " + err, level: "error") +} else { + . = merge(., structured) +} +``` + +If the expression fails, the `ok` assignment target is assigned the "empty" value of its type: + +```ruby +# `.foo` can be `100` or `"not an int"` +foo, err = to_int(.foo) + +# `err` can be `null` or `"unable to coerce value to integer"` +if err == null { + # `foo` can be `100` or `0` + .result = foo * 5 +} +``` + +The above example compiles because `foo` will either be assigned the integer representation of `.foo` if it can be coerced to an integer, or it will be set to the "empty integer value" `0` if `.foo` can't be coerced into an integer. + +Because of this, it is important to always check if `err` is null before using the `ok` value of an infallible assignment. + +##### Empty values + +Type | Empty value +:----|:----------- +String | `""` +Integer | `0` +Float | `0.0` +Boolean | `false` +Object | `{}` +Array | `[]` +Timestamp | `t'1970-01-01T00:00:00Z'` (Unix epoch) +Regular expression | `r''` +Null | `null` + +#### Coalescing + +As documented in the [coalesce expression reference][coalesce], you can **coalesce** errors to efficiently step through multiple expressions: + +```ruby +structured = parse_json("not json") ?? parse_syslog("not syslog") ?? {} +. = merge(., structured) +``` + +#### Raising + +As documented in the [function call reference][call], you can **raise** errors to immediately abort the program by adding a `!` to the end of the function name: + +```ruby +structured = parse_json!("not json") +. = merge(., structured) +``` + +{{< warning title="Raising errors should be used with caution" >}} +While raising errors can simplfy your program, you should think carefully before aborting your program. If this operation is critical to the structure of your data you should abort, otherwise consider handling the error and proceeding with the rest of your program. +{{< /warning >}} + +[assign]: /docs/reference/vrl/expressions/#assignment +[call]: /docs/reference/vrl/expressions/#function-call +[coalesce]: /docs/reference/vrl/expressions/#coalesce +[fail_safety]: /docs/reference/vrl/#fail-safety diff --git a/docs/content/en/docs/reference/vrl/examples.md b/docs/content/en/docs/reference/vrl/examples.md new file mode 100644 index 0000000000000..69ad7d5453638 --- /dev/null +++ b/docs/content/en/docs/reference/vrl/examples.md @@ -0,0 +1,79 @@ +--- +title: VRL example reference +short: Examples +weight: 3 +--- + +Here you'll find a comprehensive list of all VRL program examples. These examples demonstrate the breadth of the language and its observability-focused facilities. + +## Real world examples + +{{< vrl/real-world-examples >}} + +## Array examples + +{{< vrl/examples "Array" >}} + +## Codec examples + +{{< vrl/examples "Codec" >}} + +## Coerce examples + +{{< vrl/examples "Coerce" >}} + +## Convert examples + +{{< vrl/examples "Convert" >}} + +## Debug examples + +{{< vrl/examples "Debug" >}} + +## Enumerate examples + +{{< vrl/examples "Enumerate" >}} + +## Event examples + +{{< vrl/examples "Event" >}} + +## Hash examples + +{{< vrl/examples "Hash" >}} + +## IP examples + +{{< vrl/examples "IP" >}} + +## Number examples + +{{< vrl/examples "Number" >}} + +## Object examples + +{{< vrl/examples "Object" >}} + +## Parse examples + +{{< vrl/examples "Parse" >}} + +## Random examples + +{{< vrl/examples "Random" >}} + +## String examples + +{{< vrl/examples "String" >}} + +## System examples + +{{< vrl/examples "System" >}} + +## Timestamp examples + +{{< vrl/examples "Timestamp" >}} + +## Type examples + +{{< vrl/examples "Type" >}} diff --git a/docs/content/en/docs/reference/vrl/expressions.md b/docs/content/en/docs/reference/vrl/expressions.md new file mode 100644 index 0000000000000..cd245dccbb1bb --- /dev/null +++ b/docs/content/en/docs/reference/vrl/expressions.md @@ -0,0 +1,28 @@ +--- +title: VRL expression reference +short: Expressions +weight: 4 +--- + +## Syntax + +VRL programs can be constructed with the following syntax rules. + +{{< vrl/syntax >}} + +## Literal expressions + +As in most other languages, **literals** in VRL are values written exactly as they are meant to be interpreted. Literals include things like strings, Booleans, and integers. + +{{< vrl/literal-expressions >}} + +## Dynamic expressions + +VRL is an expression-oriented language. A VRL program consists entirely of expressions and every expression returns a value. + +{{< vrl/dynamic-expressions >}} + +[regex]: https://en.wikipedia.org/wiki/Regular_expression +[rfc3339]: https://tools.ietf.org/html/rfc3339 +[rust_regex]: https://docs.rs/regex/latest/regex/#syntax +[utf8]: https://en.wikipedia.org/wiki/UTF-8 diff --git a/docs/content/en/docs/reference/vrl/functions.md b/docs/content/en/docs/reference/vrl/functions.md new file mode 100644 index 0000000000000..f99ad400945e7 --- /dev/null +++ b/docs/content/en/docs/reference/vrl/functions.md @@ -0,0 +1,13 @@ +--- +title: VRL function reference +short: Functions +show_toc: true +weight: 1 +--- + +Here you'll find a comprehensive list of all built-in VRL functions. Functions are categorized by their purpose and sorted alphabetically for easy discovery. To use these functions in Vector, see the documentation on [function call expressions][calls] and Vector's [`remap` transform][remap]. + +{{< vrl/functions >}} + +[calls]: /docs/reference/vrl/expressions/#function-call +[remap]: /docs/reference/configuration/transforms/remap diff --git a/docs/content/en/docs/setup/_index.md b/docs/content/en/docs/setup/_index.md new file mode 100644 index 0000000000000..bd960afc61766 --- /dev/null +++ b/docs/content/en/docs/setup/_index.md @@ -0,0 +1,27 @@ +--- +title: Setting up Vector +short: Setup +weight: 2 +--- + +This section of the documentation covers everything you know to get up and running with Vector, from installation to deployment. + +## Installing + +You can install Vector using a wide variety of [package managers](/docs/setup/installation/package-managers) and on several [operating systems](/docs/setup/installation/operating-systems) and [platforms](/docs/setup/installation/platforms): + +{{< jump "/docs/setup/installation" >}} + +You can also install Vector [manually](/docs/setup/installation/manual) in case you need a custom build. + +## Configuring + +In order to cover as many observability use cases as possible, we've built Vector to be highly configurable. For a general guide to configuring your Vector instance: + +{{< jump "/docs/reference/configuration" >}} + +## Deploying + +Vector is built to be deployable in multiple roles and topologies: + +{{< jump "/docs/setup/deployment" >}} diff --git a/docs/content/en/docs/setup/deployment/_index.md b/docs/content/en/docs/setup/deployment/_index.md new file mode 100644 index 0000000000000..e8c2d3f374542 --- /dev/null +++ b/docs/content/en/docs/setup/deployment/_index.md @@ -0,0 +1,19 @@ +--- +title: Deployment +weight: 2 +--- + +![Vector deployment diagram](/img/deployment.png) + +This section covers deploying Vector. Because Vector is an end-to-end platform, you can deploy it under various [roles]. Vector is efficient enough to deploy as an [agent] and powerful enough to deploy as an [aggregator]. By combining these roles you can build robust and flexible topologies that fit into any infrastructure. + +Start by becoming familiar with the [deployment roles][roles] and then take a closer look at example [topologies]. + +## Pages in this section + +{{< pages >}} + +[agent]: /docs/setup/deployment/roles#agent +[aggregator]: /docs/setup/deployment/roles#aggregator +[roles]: /docs/setup/deployment/roles +[topologies]: /docs/setup/deployment/topologies diff --git a/docs/content/en/docs/setup/deployment/roles.md b/docs/content/en/docs/setup/deployment/roles.md new file mode 100644 index 0000000000000..9745e0d8040d5 --- /dev/null +++ b/docs/content/en/docs/setup/deployment/roles.md @@ -0,0 +1,13 @@ +--- +title: Deployment roles +short: Roles +weight: 1 +show_toc: true +aliases: ["/docs/setup/deployment/strategies"] +--- + +Vector is an end-to-end data pipeline designed to collect, process, and route data. This means that Vector serves all roles in building your pipeline. You can deploy it as an [agent](#agent), [sidecar](#sidecar), or [aggregator](#aggregator). You combine these roles to form [topologies]. In this section, we'll cover each role in detail and help you understand when to use each. + +{{< roles >}} + +[topologies]: /docs/setup/deployment/topologies diff --git a/docs/content/en/docs/setup/deployment/topologies.md b/docs/content/en/docs/setup/deployment/topologies.md new file mode 100644 index 0000000000000..b95bc87b9e39d --- /dev/null +++ b/docs/content/en/docs/setup/deployment/topologies.md @@ -0,0 +1,14 @@ +--- +title: Deployment topologies +short: Topologies +weight: 2 +show_toc: true +aliases: ["/setup/deployment/pipelines"] +--- + +In the previous section we covered the various [deployment strategies][roles] used to collect and forward data. You combine these +strategies to form topologies. This section showcases common topologies and the pros and cons of each. Use these as _guidelines_ to build your own. + +{{< topologies >}} + +[roles]: /docs/setup/deployment/roles diff --git a/docs/content/en/docs/setup/installation/_index.md b/docs/content/en/docs/setup/installation/_index.md new file mode 100644 index 0000000000000..cd9cae53571d5 --- /dev/null +++ b/docs/content/en/docs/setup/installation/_index.md @@ -0,0 +1,40 @@ +--- +title: Install Vector +description: Get up and running with Vector on your preferred platform +short: Installation +--- + +Vector compiles to a single static binary, which makes it easy to install. + +On *nix systems Vector's only dependency is [`libc`][libc]. Your operating system should generally provide this +dependency. + +## Using static musl builds + +We also release Vector artifacts that are statically linked with [`musl`][musl] for the [`libc`][libc] implementation, +which results in a static binary with no dependencies (these have `musl` in their name). These dependency-free +artifacts can be useful in stripped-down environments that don't provide a built-in `libc` implementation. + +{{< warning title="musl performance issues" >}} +Please note that musl, as of this writing, has a significantly worse performance profile than [glibc] when Vector is +running in multiple threads (Vector defaults to the number of available cores). We recommand that you use [glibc] when +available *unless* you're running Vector on a single CPU. + +[glibc]: https://www.gnu.org/software/libc +{{< /warning >}} + +## Installation script + +These light-weight scripts detect your platform and determine the best method for installing Vector: + +{{< easy-install-scripts >}} + +## Other installation methods + +If you prefer a more granular method for installing Vector, check out these subsections of the documentation for +alternatives: + +{{< sections >}} + +[libc]: https://man7.org/linux/man-pages/man7/libc.7.html +[musl]: https://musl.libc.org diff --git a/docs/content/en/docs/setup/installation/manual/_index.md b/docs/content/en/docs/setup/installation/manual/_index.md new file mode 100644 index 0000000000000..14e6aced18a95 --- /dev/null +++ b/docs/content/en/docs/setup/installation/manual/_index.md @@ -0,0 +1,12 @@ +--- +title: Install Vector manually +short: Manual +weight: 4 +--- + +Installing Vector manually should be a last resort if you can't install it through a supported [platform] or [operating system][os]. + +{{< pages >}} + +[os]: /docs/setup/installation/operating-systems +[platform]: /docs/setup/installation/platforms diff --git a/docs/content/en/docs/setup/installation/manual/from-archives.md b/docs/content/en/docs/setup/installation/manual/from-archives.md new file mode 100644 index 0000000000000..dc1c895eaa002 --- /dev/null +++ b/docs/content/en/docs/setup/installation/manual/from-archives.md @@ -0,0 +1,241 @@ +--- +title: Install Vector from archives +short: From archives +weight: 1 +--- + +This page covers installing Vector from a pre-built archive. These archives contain the vector binary as well as supporting configuration files. + +{{< warning >}} +We recommend installing Vector through a supported platform or package manager, if possible. These handle permissions, directory creation, and other intricacies covered in the Next Steps section. +{{< /warning >}} + +## Installation + +### Linux (ARM64) + +Download and unpack the archive: + +```shell +# Latest ({{< version >}}) +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-aarch64-unknown-linux-musl.tar.gz | \ + tar xzf - -C vector --strip-components=2 + +# Nightly +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-nightly-aarch64-unknown-linux-musl.tar.gz | \ + tar xzf - -C vector --strip-components=2 +``` + +Change into the `vector` directory: + +```shell +cd vector +``` + +Move Vector into your `$PATH`: + +```shell +echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile +source $HOME/.profile +``` + +Start Vector: + +```shell +vector --config config/vector.toml +``` + +### Linux (ARMv7) + +Download and unpack the archive: + +```shell +# Latest ({{< version >}}) +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-armv7-unknown-linux-gnueabihf.tar.gz | \ + tar xzf - -C vector --strip-components=2 + +# Nightly +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-nightly-armv7-unknown-linux-gnueabihf.tar.gz | \ + tar xzf - -C vector --strip-components=2 +``` + +Change into the `vector` directory: + +```shell +cd vector +``` + +Move Vector into your `$PATH`: + +```shell +echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile +source $HOME/.profile +``` + +Start Vector: + +```shell +vector --config config/vector.toml +``` + +### macoS (x86_64) + +Download and unpack the archive: + +```shell +# Latest (version {{< version >}}) +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-x86_64-apple-darwin.tar.gz | \ + tar xzf - -C vector --strip-components=2 + +# Nightly +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-nightly-x86_64-apple-darwin.tar.gz | \ + tar xzf - -C vector --strip-components=2 +``` + +Change into the `vector` directory: + +```shell +cd vector +``` + +Move Vector into your `$PATH`: + +```shell +echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile +source $HOME/.profile +``` + +Start Vector: + +```shell +vector --config config/vector.toml +``` + +### Windows (x86_64) + +Download the Vector release archive: + +```powershell +# Latest (version {{< version >}}) +powershell Invoke-WebRequest https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-x86_64-pc-windows-msvc.zip -OutFile vector-{{< version >}}-x86_64-pc-windows-msvc.zip + + +# Nightly +powershell Invoke-WebRequest https://packages.timber.io/vector/0.12.X/vector-nightly-x86_64-pc-windows-msvc.zip -OutFile vector-nightly-x86_64-pc-windows-msvc.zip +``` + +Extract files from the archive: + +```powershell +powershell Expand-Archive vector-nightly-x86_64-pc-windows-msvc.zip . +``` + +Navigate to the Vector directory: + +```powershell +cd vector-nightly-x86_64-pc-windows-msvc +``` + +Start Vector: + +```powershell +.\bin\vector --config config\vector.toml +``` + +### Linux (x86_64) + +Download and unpack the archive: + +```shell +# Latest (version {{< version >}}) +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-x86_64-unknown-linux-musl.tar.gz | \ + tar xzf - -C vector --strip-components=2 + +# Nightly +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-nightly-x86_64-unknown-linux-musl.tar.gz | \ + tar xzf - -C vector --strip-components=2 +``` + +Change into the `vector` directory: + +```shell +cd vector +``` + +Move Vector into your `$PATH`: + +```shell +echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile +source $HOME/.profile +``` + +Start Vector: + +```shell +vector --config config/vector.toml +``` + +## Next steps + +### Configuring + +The Vector configuration file is located at: + +```shell +config/vector.toml +``` + +A full spec is located at `config/vector.spec.toml` and examples are located in `config/vector/examples/*`. You can learn more about configuring Vector in the [Configuration] documentation. + +### Data directory + +We recommend creating a [data directory][data_dir] that Vector can use: + +```shell +mkdir /var/lib/vector +``` + +{{< warning >}} +Make sure that this directory is writable by the `vector` process. +{{< /warning >}} + +Vector offers a global [`data_dir` option][data_dir] that you can use to specify the path of your directory: + +```shell +data_dir = "/var/lib/vector" # default +``` + +### Service managers + +Vector archives ship with service files in case you need them: + +#### Init.d + +To install Vector into Init.d, run: + +```shell +cp -av etc/init.d/vector /etc/init.d +``` + +#### Systemd + +To install Vector into Systemd, run: + +```shell +cp -av etc/systemd/vector.service /etc/systemd/system +``` + +### Updating + +To update Vector, follow the same [installation](#installation) instructions above. + +[configuration]: /docs/reference/configuration +[data_dir]: /docs/reference/configuration/global-options/#data_dir diff --git a/docs/content/en/docs/setup/installation/manual/from-source.md b/docs/content/en/docs/setup/installation/manual/from-source.md new file mode 100644 index 0000000000000..b78de9e356c35 --- /dev/null +++ b/docs/content/en/docs/setup/installation/manual/from-source.md @@ -0,0 +1,308 @@ +--- +title: Install Vector from source +short: From source +weight: 2 +--- + +This page covers installing Vector from source using the native toolchain for the host. + +Vector can also be compiled to a static binary for Linux for x86_64, ARM64, and ARMv7 architectures. See [compiling using Docker][docker] for details. + +{{< warning >}} +We recommend installing Vector through a supported platform, package manager, or pre-built archive if possible. These handle permissions, directory creation, and other intricacies covered in the [Next Steps](#next-steps) section. +{{< /warning >}} + +[docker]: /docs/setup/installation/manual/from-source/#docker + +## Installation + +### Linux + +Install Rust: + +```shell +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable +``` + +Install compilation dependencies, specifically C and C++ compilers (GCC or Clang) and GNU `make` if they aren't pre-installed on your system. + +Download Vector's source: + +```shell +# Latest ({{< version >}}) +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://api.github.com/repos/timberio/vector/tarball/v{{< version >}} | \ + tar xzf - -C vector --strip-components=1 + +# Master +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://github.com/timberio/vector/archive/master.tar.gz | \ + tar xzf - -C vector --strip-components=1 +``` + +Change into your Vector directory: + +```shell +cd vector +``` + +Compile Vector: + +```shell +[FEATURES=",,..."] make build +``` + +The `FEATURES` environment variable is optional. You can override the default features using this variable. See [feature flags](#feature-flags) for more info. + +When finished, the Vector binary is placed in `target//release/vector`. If you're building Vector on your Mac, for example, the target triple is `x86_64-apple-darwin` and the Vector binary will be located at `target/x86_64-apple-darwin/release/vector`. + +Finally, you can start Vector: + +```shell +target//release/vector --config config/vector.toml +``` + +### Windows + +Install Rust using [`rustup`][rustup]. If you don't have VC++ build tools, the install will prompt you to install them. + +Install [Perl for Windows][perl]. + +Add Perl to your `PATH`. In a Rust/MSVC environment (for example using `x64 Native Tools Command Prompt`) add the binary directory of Perl installed on the previous step to `PATH`. For example, for default installation of Strawberry Perl it is + +```powershell +set PATH=%PATH%;C:\Strawberry\perl\bin +``` + +Get Vector's source using Git: + +```shell +# Latest +git clone https://github.com/timberio/vector +git checkout v{{< version >}} +cd vector + +# Master +git clone https://github.com/timberio/vector +cd vector +``` + +Build Vector in release mode: + +```shell +set RUSTFLAGS=-Ctarget-feature=+crt-static +cargo build --no-default-features --features default-msvc --release +``` + +Start Vector. After these steps, a binary `vector.exe` in `target\release` would be created. It can be started by running: + +```powershell +.\target\release\vector --config config\vector.toml +``` + +### Docker + +You can build statically linked binaries of Vector for Linux using Docker. If you do so, the dependencies listed in the previous section aren't needed, as all of them would be automatically pulled by Docker. + +First, download Vector's source: + +```shell +# Latest ({{< version >}}) +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://api.github.com/repos/timberio/vector/tarball/v{{< version >}} | \ + tar xzf - -C vector --strip-components=1 + +# Master +mkdir -p vector && \ + curl -sSfL --proto '=https' --tlsv1.2 https://github.com/timberio/vector/archive/master.tar.gz | \ + tar xzf - -C vector --strip-components=1 +``` + +Then build Vector using Docker: + +```shell +# Linux (x86_64) +PASS_FEATURES=default-cmake ./scripts/docker-run.sh builder-x86_64-unknown-linux-musl make build + +# Linux (ARM64) +PASS_FEATURES=default-cmake ./scripts/docker-run.sh builder-aarch64-unknown-linux-musl make build + +# Linux (ARMv7) +PASS_FEATURES=default-cmake ./scripts/docker-run.sh builder-armv7-unknown-linux-musleabihf make build +``` + +The command above builds a Docker image with a Rust toolchain for a Linux target for the corresponding architecture using `musl` as the C library, then starts a container from this image, and then builds inside the container. The target binary is located at `target//release/vector` as in the previous case. + +## Next steps + +### Configuring + +The Vector configuration file is located at: + +```shell +config/vector.toml +``` + +A full spec is located at `config/vector.spec.toml` and examples are located in `config/vector/examples/*`. You can learn more about configuring Vector in the [Configuration] documentation. + +### Data directory + +We recommend creating a [data directory][data_dir] that Vector can use: + +```shell +mkdir /var/lib/vector +``` + +{{< warning >}} +Make sure that this directory is writable by the `vector` process. +{{< /warning >}} + +Vector offers a global [`data_dir` option][data_dir] that you can use to specify the path of your directory: + +```shell +data_dir = "/var/lib/vector" # default +``` + +### Service managers + +Vector archives ship with service files in case you need them: + +#### Init.d + +To install Vector into Init.d, run: + +```shell +cp -av etc/init.d/vector /etc/init.d +``` + +#### Systemd + +To install Vector into Systemd, run: + +```shell +cp -av etc/systemd/vector.service /etc/systemd/system +``` + +### Updating + +To update Vector, follow the same [installation](#installation) instructions above. + +## How it works + +### Feature flags + +The following feature flags are supported via the `FEATURES` env var when executing `make build`: + +```shell +[FEATURES=",,..."] make build +``` + +There are three meta-features that can be used when compiling for the corresponding targets. If no features are specified, the `default` is used. + + +Feature | Description | Enabled by default? +:-------|:------------|:------------------- +`default` | Default set of features for `*-unknown-linux-gnu` and `*-apple-darwin` targets. | ✅ +`default-cmake` | Default set of features for `*-unknown-linux-*` targets which uses `cmake` and `perl` as build dependencies. +`default-msvc` | Default set of features for `*-pc-windows-msvc` targets. Requires `cmake` and `perl` as build dependencies. + +Alternatively, for finer control over dependencies and operating system features, it is possible to use specific features from the list below: + +Feature | Description | Included in `default` feature? +:-------|:------------|:------------------------------ +`unix` | Enables features that require `cfg(unix)` to be present on the platform, namely support for Unix domain sockets in the [`docker_logs` source][docker_logs] and [jemalloc] instead of the default memory allocator. | ✅ +`vendored` | Forces vendoring of [OpenSSL] and [ZLib] dependencies instead of using their versions installed in the system. Requires `perl` as a build dependency. | ✅ +`leveldb-plain` | Enables support for [disk buffers][buffer] using vendored [LevelDB]. | ✅ +`leveldb-cmake` | The same as `leveldb-plain`, but more portable. Requires `cmake` as a build dependency. Use this in case of compilation issues with `leveldb-plain`. | +`rdkafka-plain` | Enables vendored [`librdkafka`][librdkafka] dependency, which is required for the [`kafka` source][kafka_source] and [`kafka` sink][kafka_sink]. | ✅ +`rdkafka-cmake` | The same as `rdkafka-plain` but more portable. Requires `cmake` as a build dependency. Use this in case of compilation issues with `rdkafka-plain`. | + +In addition, it is possible to pick only a subset of Vector's components for the build using feature flags. In order to do it, it instead of default features one has to pass a comma-separated list of component features. + +{{< details title="Click to see all component features" >}} + + +**Vector component features** + +Name | Description +:----|:----------- +| `sources-apache_metrics` | Enables building the [`apache_metrics` source](/docs/reference/configuration/sources/apache_metrics) +| `sources-aws_kinesis_firehose` | Enables building the [`aws_kinesis_firehose` source](/docs/reference/configuration/sources/aws_kinesis_firehose) +| `sources-docker_logs` | Enables building the [`docker_logs` source](/docs/reference/configuration/sources/docker_logs). Requires `unix` feature to be also enabled for support of Unix domain sockets. +| `sources-file` | Enables building the [`file` source](/docs/reference/configuration/sources/file). +| `sources-generator` | Enables building the [`generator` source](/docs/reference/configuration/sources/generator) +| `sources-host_metrics` | Enables building the [`host_metrics` source](/docs/reference/configuration/sources/host_metrics) +| `sources-http` | Enables building the [`http` source](/docs/reference/configuration/sources/http) +| `sources-journald` | Enables building the [`journald` source](/docs/reference/configuration/sources/journald) +| `sources-kafka` | Enables building the [`kafka` source](/docs/reference/configuration/sources/kafka). Requires `rdkafka-plain` or `rdkafka-cmake` feature to be also enabled. | +| `sources-kubernetes_logs` | Enables building the [`kubernetes_logs` source](/docs/reference/configuration/sources/kubernetes_logs) +| `sources-heroku_logs` | Enables building the [`heroku_logs` source](/docs/reference/configuration/sources/heroku_logs) +| `sources-prometheus` | Enables building the [`prometheus_scrape` source](/docs/reference/configuration/sources/prometheus_scrape) +| `sources-socket` | Enables building the [`socket` source](/docs/reference/configuration/sources/socket) +| `sources-splunk_hec` | Enables building the [`splunk_hec` source](/docs/reference/configuration/sources/splunk_hec) +| `sources-statsd` | Enables building the [`statsd` source](/docs/reference/configuration/sources/statsd) +| `sources-stdin` | Enables building the [`stdin` source](/docs/reference/configuration/sources/stdin) +| `sources-syslog` | Enables building the [`syslog` source](/docs/reference/configuration/sources/syslog) +| `sources-vector` | Enables building the [`vector` source](/docs/reference/configuration/sources/vector) +| `transforms-dedupe` | Enables building the [`dedupe` transform](/docs/reference/configuration/transforms/dedupe) +| `transforms-filter` | Enables building the [`filter` transform](/docs/reference/configuration/transforms/filter) +| `transforms-geoip` | Enables building the [`geoip` transform](/docs/reference/configuration/transforms/geoip) +| `transforms-log_to_metric` | Enables building the [`log_to_metric` transform](/docs/reference/configuration/transforms/log_to_metric) +| `transforms-lua` | Enables building the [`lua` transform](/docs/reference/configuration/transforms/lua) +| `transforms-metric_to_log` | Enables building the [`metric_to_log` transform](/docs/reference/configuration/transforms/metric_to_log) +| `transforms-reduce` | Enables building the [`reduce` transform](/docs/reference/configuration/transforms/reduce) +| `transforms-remap` | Enables building the [`remap` transform](/docs/reference/configuration/transforms/remap) +| `transforms-sample` | Enables building the [`sample` transform](/docs/reference/configuration/transforms/sample) +| `transforms-route` | Enables building the [`route` transform](/docs/reference/configuration/transforms/route) +| `transforms-tag_cardinality_limit` | Enables building the [`tag_cardinality_limit` transform](/docs/reference/configuration/transforms/tag_cardinality_limit) +| `transforms-wasm` | Enables building the [`wasm` transform](/docs/reference/configuration/transforms/wasm) +| `sinks-aws_cloudwatch_logs` | Enables building the [`aws_cloudwatch_logs` sink](/docs/reference/configuration/sinks/aws_cloudwatch_logs) +| `sinks-aws_cloudwatch_metrics` | Enables building the [`aws_cloudwatch_metrics` sink](/docs/reference/configuration/sinks/aws_cloudwatch_metrics) +| `sinks-aws_kinesis_firehose` | Enables building the [`aws_kinesis_firehose` sink](/docs/reference/configuration/sinks/aws_kinesis_firehose) +| `sinks-aws_kinesis_streams` | Enables building the [`aws_kinesis_streams` sink](/docs/reference/configuration/sinks/aws_kinesis_streams) +| `sinks-aws_s3` | Enables building the [`aws_s3` sink](/docs/reference/configuration/sinks/aws_s3) +| `sinks-azure_monitor_logs` | Enables building the [`azure_monitor_logs` sink](/docs/reference/configuration/sinks/azure_monitor_logs) +| `sinks-blackhole` | Enables building the [`blackhole` sink](/docs/reference/configuration/sinks/blackhole) +| `sinks-clickhouse` | Enables building the [`clickhouse` sink](/docs/reference/configuration/sinks/clickhouse) +| `sinks-console` | Enables building the [`console` sink](/docs/reference/configuration/sinks/console) +| `sinks-datadog_logs` | Enables building the [`datadog_logs` sink](/docs/reference/configuration/sinks/datadog_logs) +| `sinks-datadog_metrics` | Enables building the [`datadog_metrics` sink](/docs/reference/configuration/sinks/datadog_metrics) +| `sinks-elasticsearch` | Enables building the [`elasticsearch` sink](/docs/reference/configuration/sinks/elasticsearch) +| `sinks-file` | Enables building the [`file` sink](/docs/reference/configuration/sinks/file) +| `sinks-gcp_cloud_storage` | Enables building the [`gcp_cloud_storage` sink](/docs/reference/configuration/sinks/gcp_cloud_storage) +| `sinks-gcp_pubsub` | Enables building the [`gcp_pubsub` sink](/docs/reference/configuration/sinks/gcp_pubsub) +| `sinks-gcp_stackdriver_logs` | Enables building the [`gcp_stackdriver_logs` sink](/docs/reference/configuration/sinks/gcp_stackdriver_logs) +| `sinks-honeycomb` | Enables building the [`honeycomb` sink](/docs/reference/configuration/sinks/honeycomb) +| `sinks-http` | Enables building the [`http` sink](/docs/reference/configuration/sinks/http) +| `sinks-humio_logs` | Enables building the [`humio_logs` sink](/docs/reference/configuration/sinks/humio_logs) +| `sinks-humio_metrics` | Enables building the [`humio_metrics` sink](/docs/reference/configuration/sinks/humio_metrics) +| `sinks-influxdb_logs` | Enables building the [`influxdb_logs` sink](/docs/reference/configuration/sinks/influxdb_logs) +| `sinks-influxdb_metrics` | Enables building the [`influxdb_metrics` sink](/docs/reference/configuration/sinks/influxdb_metrics) +| `sinks-kafka` | Enables building the [`kafka` sink](/docs/reference/configuration/sinks/kafka). Requires `rdkafka-plain` or `rdkafka-cmake` feature to be also enabled. +| `sinks-logdna` | Enables building the [`logdna` sink](/docs/reference/configuration/sinks/logdna) +| `sinks-loki` | Enables building the [`loki` sink](/docs/reference/configuration/sinks/loki) +| `sinks-new_relic_logs` | Enables building the [`new_relic_logs` sink](/docs/reference/configuration/sinks/new_relic_logs) +| `sinks-papertrail` | Enables building the [`papertrail` sink](/docs/reference/configuration/sinks/papertrail) +| `sinks-prometheus` | Enables building the [`prometheus_exporter`](/docs/reference/configuration/sinks/prometheus_exporter) and [`prometheus_remote_write`](/docs/reference/configuration/sinks/prometheus_remote_write) sinks +| `sinks-pulsar` | Enables building the [`pulsar` sink](/docs/reference/configuration/sinks/pulsar) +| `sinks-sematext_logs` | Enables building the [`sematext_logs` sink](/docs/reference/configuration/sinks/sematext_logs) +| `sinks-sematext_metrics` | Enables building the [`sematext_metrics` sink](/docs/reference/configuration/sinks/sematext_metrics) +| `sinks-socket` | Enables building the [`socket` sink](/docs/reference/configuration/sinks/socket) +| `sinks-splunk_hec` | Enables building the [`splunk_hec` sink](/docs/reference/configuration/sinks/splunk_hec) +| `sinks-statsd` | Enables building the [`statsd` sink](/docs/reference/configuration/sinks/statsd) +| `sinks-vector` | Enables building the [`vector` sink](/docs/reference/configuration/sinks/vector) +{{< /details >}} + +[buffer]: /docs/reference/glossary/#buffer +[configuration]: /docs/reference/configuration +[data_dir]: /docs/reference/configuration/global-options/#data_dir +[docker_logs]: /docs/reference/configuration/sources/docker_logs +[jemalloc]: https://github.com/jemalloc/jemalloc +[kafka_sink]: /docs/reference/configuration/sinks/kafka +[kafka_source]: /docs/reference/configuration/sources/kafka +[leveldb]: https://github.com/google/leveldb +[librdkafka]: https://github.com/edenhill/librdkafka +[openssl]: https://www.openssl.org +[perl]: https://www.perl.org/get.html#win32 +[rustup]: https://rustup.rs +[zlib]: https://www.zlib.net diff --git a/docs/content/en/docs/setup/installation/operating-systems/_index.md b/docs/content/en/docs/setup/installation/operating-systems/_index.md new file mode 100644 index 0000000000000..b7246730d23f4 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/_index.md @@ -0,0 +1,9 @@ +--- +title: Install Vector on your operating system +short: Operating systems +weight: 3 +--- + +## Supported operating systems + +{{< pages >}} diff --git a/docs/content/en/docs/setup/installation/operating-systems/amazon-linux.md b/docs/content/en/docs/setup/installation/operating-systems/amazon-linux.md new file mode 100644 index 0000000000000..1a1c06b18c1c6 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/amazon-linux.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on Amazon Linux +short: Amazon Linux +supported_installers: ["YUM", "RPM", "Docker", "Vector installer"] +weight: 1 +--- + +The [Amazon Linux AMI][ami] is a supported and maintained Linux image provided by Amazon Web Services for use on Amazon Elastic Compute Cloud (Amazon EC2). It's designed to provide a stable, secure, and high-performance execution environment for applications running on Amazon EC2. This page covers installing and managing Vector on the Amazon Linux operating system. + +## Supported installers + +{{< supported-installers >}} + +[ami]: https://aws.amazon.com/amazon-linux-ami diff --git a/docs/content/en/docs/setup/installation/operating-systems/centos.md b/docs/content/en/docs/setup/installation/operating-systems/centos.md new file mode 100644 index 0000000000000..3fb4fda816a4c --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/centos.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on CentOS +short: CentOS +supported_installers: ["YUM", "RPM", "Docker", "Vector installer", "Helm"] +weight: 2 +--- + +[CentOS] is a Linux distribution that is functionally compatible with its upstream source, Red Hat Enterprise Linux. This page covers installing and managing Vector on the CentOS operating system. + +## Supported installers + +{{< supported-installers >}} + +[centos]: https://www.centos.org diff --git a/docs/content/en/docs/setup/installation/operating-systems/debian.md b/docs/content/en/docs/setup/installation/operating-systems/debian.md new file mode 100644 index 0000000000000..9e9196874e86a --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/debian.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on Debian +short: Debian +supported_installers: ["APT", "dpkg", "Vector installer", "Docker", "Helm"] +weight: 3 +--- + +[Debian], also known as Debian GNU/Linux, is a Linux distribution composed of free and open-source software, developed by the community-supported Debian Project. This page covers installing and managing Vector on the Debian operating system. + +## Supported installers + +{{< supported-installers >}} + +[debian]: https://debian.org diff --git a/docs/content/en/docs/setup/installation/operating-systems/macos.md b/docs/content/en/docs/setup/installation/operating-systems/macos.md new file mode 100644 index 0000000000000..f038de3b0a771 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/macos.md @@ -0,0 +1,11 @@ +--- +title: macOS +--- + +[macOS] is the primary operating system for Apple's Mac computers. It's a certified Unix system based on Apple's Darwin operating system. This page covers installing and managing Vector on the macOS operating system. + +## Supported installers + +{{< supported-installers >}} + +[macos]: https://en.wikipedia.org/wiki/MacOS diff --git a/docs/content/en/docs/setup/installation/operating-systems/nixos.md b/docs/content/en/docs/setup/installation/operating-systems/nixos.md new file mode 100644 index 0000000000000..b78234cde7114 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/nixos.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on NixOS +short: NixOS +supported_installers: ["Nix", "Vector installer", "Docker"] +weight: 4 +--- + +[Debian], also known as Debian GNU/Linux, is a Linux distribution composed of free and open-source software, developed by the community-supported Debian Project. This page covers installing and managing Vector on the Debian operating system. + +## Supported installers + +{{< supported-installers >}} + +[debian]: https://debian.org diff --git a/docs/content/en/docs/setup/installation/operating-systems/raspbian.md b/docs/content/en/docs/setup/installation/operating-systems/raspbian.md new file mode 100644 index 0000000000000..c2dbcc1aadde4 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/raspbian.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on Raspbian +short: Raspbian +supported_installers: ["Vector installer", "Docker"] +weight: 6 +--- + +[Raspbian] is the operating system used on Raspberry Pis. It is a Debian-based operating system designed for compact single-board computers. This page covers installing and managing Vector on the Raspbian operating system. + +## Supported installers + +{{< supported-installers >}} + +[raspbian]: https://www.raspbian.org/ diff --git a/docs/content/en/docs/setup/installation/operating-systems/rhel.md b/docs/content/en/docs/setup/installation/operating-systems/rhel.md new file mode 100644 index 0000000000000..895e4aab17867 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/rhel.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on RHEL +short: RHEL +supported_installers: ["YUM", "RPM", "Vector installer", "Docker", "Helm"] +weight: 5 +--- + +[Red Hat Enterprise Linux][rhel] is a Linux distribution developed by Red Hat for the commercial market. This page covers installing and managing Vector on the RHEL operating system. + +## Supported installers + +{{< supported-installers >}} + +[rhel]: https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux diff --git a/docs/content/en/docs/setup/installation/operating-systems/ubuntu.md b/docs/content/en/docs/setup/installation/operating-systems/ubuntu.md new file mode 100644 index 0000000000000..f07dd28eacc89 --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/ubuntu.md @@ -0,0 +1,15 @@ +--- +title: Install Vector on Ubuntu +short: Ubuntu +supported_installers: ["APT", "dpkg", "Vector installer", "Docker", "Helm"] +weight: 6 +--- + +[Ubuntu] is a Linux distribution based on [Debian]. This page covers installing and managing Vector on the Ubuntu operating system. + +## Supported installers + +{{< supported-installers >}} + +[debian]: https://debian.org +[ubuntu]: https://ubuntu.com diff --git a/docs/content/en/docs/setup/installation/operating-systems/windows.md b/docs/content/en/docs/setup/installation/operating-systems/windows.md new file mode 100644 index 0000000000000..3abd39baca7ca --- /dev/null +++ b/docs/content/en/docs/setup/installation/operating-systems/windows.md @@ -0,0 +1,14 @@ +--- +title: Install Vector on Windows +short: Windows +supported_installers: ["MSI", "Vector installer", "Docker"] +weight: 7 +--- + +[Microsoft Windows][windows] is an operating system developed and sold by Microsoft. This page covers installing and managing Vector on the Windows operating system. + +## Supported installers + +{{< supported-installers >}} + +[windows]: https://www.microsoft.com/en-us/windows diff --git a/docs/content/en/docs/setup/installation/package-managers/_index.md b/docs/content/en/docs/setup/installation/package-managers/_index.md new file mode 100644 index 0000000000000..a090ae515170a --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/_index.md @@ -0,0 +1,14 @@ +--- +title: Installation +short: Package managers +description: Install Vector using your preferred package manager +weight: 1 +--- + +Vector supports a wide variety of package managers across several operating systems and platforms. + +## Available package managers + +{{< pages >}} + +[rust]: https://rust-lang.org diff --git a/docs/content/en/docs/setup/installation/package-managers/apt.md b/docs/content/en/docs/setup/installation/package-managers/apt.md new file mode 100644 index 0000000000000..551aa0e9fa2b7 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/apt.md @@ -0,0 +1,57 @@ +--- +title: Install Vector using APT +short: APT +weight: 1 +--- + +[Advanced Package Tool][apt], or **APT**, is a free package manager that handles the installation and removal of software on [Debian], [Ubuntu], and other [Linux] distributions. + +Our APT repositories are provided by [Cloudsmith] and you can find [instructions][repos] for manually adding the repositories. This page covers installing and managing Vector through the [APT package repository][apt]. + +## Supported architectures + +* x86_64 +* ARM64 +* ARMv7 + +## Installation + +First, add the Vector repo: + +```shell +curl -1sLf \ + 'https://repositories.timber.io/public/vector/cfg/setup/bash.deb.sh' \ +| sudo -E bash +``` + +Then you can install the `vector` package: + +```shell +sudo apt-get install vector +``` + +## Other actions + +{{< tabs default="Upgrade Vector" >}} +{{< tab title="Upgrade Vector" >}} +```bash +sudo apt-get upgrade vector +``` +{{< /tab >}} +{{< tab title="Uninstall Vector" >}} +```bash +sudo apt remove vector +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "apt-dpkg-rpm-yum" >}} + +[apt]: https://en.wikipedia.org/wiki/APT_(software) +[cloudsmith]: https://cloudsmith.io/~timber/repos/vector/packages +[debian]: https://debian.org +[linux]: https://linux.org +[repos]: https://cloudsmith.io/~timber/repos/vector/setup/#formats-deb +[ubuntu]: https://ubuntu.com diff --git a/docs/content/en/docs/setup/installation/package-managers/dpkg.md b/docs/content/en/docs/setup/installation/package-managers/dpkg.md new file mode 100644 index 0000000000000..a907d0f7411db --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/dpkg.md @@ -0,0 +1,39 @@ +--- +title: Install Vector using dpkg +short: dpkg +weight: 2 +--- + +[dpkg] is the software that powers the package management system in the Debian operating system and its derivatives. dpkg is used to install and manage software via `.deb` packages. This page covers installing and managing Vector through the DPKG package repository. + +## Installation + +```shell +curl \ + --proto '=https' \ + --tlsv1.2 -O \ + https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-amd64.deb + +sudo dpkg -i vector-{{< version >}}-amd64.deb +``` + +## Other actions + +{{< tabs default="Upgrade Vector" >}} +{{< tab title="Upgrade Vector" >}} +```shell +dpkg -i vector-{{< version >}}-amd64 +``` +{{< /tab >}} +{{< tab title="Uninstall Vector" >}} +```shell +dpkg -r vector-{{< version >}}-amd64 +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "apt-dpkg-rpm-yum" >}} + +[dpkg]: https://wiki.debian.org/dpkg diff --git a/docs/content/en/docs/setup/installation/package-managers/helm.md b/docs/content/en/docs/setup/installation/package-managers/helm.md new file mode 100644 index 0000000000000..dd4ed1433abd6 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/helm.md @@ -0,0 +1,80 @@ +--- +title: Install Vector using Helm +short: Helm +weight: 3 +--- + +[Helm] is a package manager for Kubernetes that facilitates the deployment and management of applications and services on Kubernetes clusters. This page covers installing and managing Vector through the Helm package repository. + +## Installation + +{{< warning title="Aggregator role in private beta" >}} +Helm support for the [aggregator] role is currently in private beta. We're currently seeking beta testers. If interested, please [join our chat][chat] and let us know. + +As an alternative, you can still manually deploy Vector in the aggregator role. Instructions throughout this doc will be for the [agent] role only. + +[agent]: /docs/setup/deployment/roles/#agent +[aggregator]: /docs/setup/deployment/roles/#aggregator +[chat]: https://chat.vector.dev +{{< /warning >}} + +Add the Vector repo: + +```shell +helm repo add timberio https://packages.timber.io/helm/latest +``` + +Check available Helm chart configuration options: + +```shell +helm show values timberio/vector-agent +``` + +Configure Vector: + +```toml +cat <<-'VALUES' > values.yaml +# The Vector Kubernetes integration automatically defines a +# kubernetes_logs source that is made available to you. +# You do not need to define a log source. +sinks: + # Adjust as necessary. By default we use the console sink + # to print all data. This allows you to see Vector working. + # /docs/reference/sinks/ + stdout: + type: console + inputs: ["kubernetes_logs"] + target: "stdout" + encoding: "json" +VALUES +``` + +Install Vector: + +```shell +helm install timberio/vector-agent \ + --namespace vector \ + --create-namespace vector \ + --values values.yaml +``` + +## Other actions + +{{< tabs default="Upgrade Vector" >}} +{{< tab title="Upgrade Vector" >}} +```shell +helm repo update && helm upgrade --namespace vector vector timberio/vector-agent --reuse-values +``` +{{< /tab >}} +{{< tab title="Uninstall Vector" >}} +```shell +helm uninstall --namespace vector vector +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "helm" >}} + +[helm]: https://helm.sh diff --git a/docs/content/en/docs/setup/installation/package-managers/homebrew.md b/docs/content/en/docs/setup/installation/package-managers/homebrew.md new file mode 100644 index 0000000000000..46f21cd342266 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/homebrew.md @@ -0,0 +1,34 @@ +--- +title: Install Vector using Homebrew +short: Homebrew +weight: 4 +--- + +[Homebrew] is a free and open source package management system for Apple's macOS operating system and some supported Linux systems. This page covers installing and managing Vector using the Homebrew package repository. + +## Installation + +```shell +brew tap timberio/brew && brew install vector +``` + +## Other actions + +{{< tabs default="Upgrade Vector" >}} +{{< tab title="Upgrade Vector" >}} +```shell +brew update && brew upgrade vector +``` +{{< /tab >}} +{{< tab title="Uninstall Vector" >}} +```shell +brew remove vector +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "homebrew" >}} + +[homebrew]: https://brew.sh diff --git a/docs/content/en/docs/setup/installation/package-managers/msi.md b/docs/content/en/docs/setup/installation/package-managers/msi.md new file mode 100644 index 0000000000000..20d1bb7c6d37d --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/msi.md @@ -0,0 +1,21 @@ +--- +title: Install Vector using MSI +short: MSI +weight: 5 +--- + +MSI is the file format and command line utility for the [Windows Installer][installer]. Windows Installer (previously known as Microsoft Installer) is an interface for Microsoft Windows that's used to install and manage software on Windows systems. This page covers installing and managing Vector through the MSI package repository. + +## Installation + +```powershell +powershell Invoke-WebRequest https://packages.timber.io/vector/{{< version >}}/vector-x86_64.msi \ + -OutFile vector-{{< version >}}-x86_64.msi && \ + msiexec /i vector-{{< version >}}-x86_64.msi /quiet +``` + +## Management + +{{< jump "/docs/administration/management" "windows" >}} + +[installer]: https://en.wikipedia.org/wiki/Windows_Installer diff --git a/docs/content/en/docs/setup/installation/package-managers/nix.md b/docs/content/en/docs/setup/installation/package-managers/nix.md new file mode 100644 index 0000000000000..d4f391ce9db19 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/nix.md @@ -0,0 +1,47 @@ +--- +title: Nix +short: Nix +weight: 6 +--- + +[Nix] is a cross-platform package manager implemented on a functional deployment model where software is installed into unique directories generated through cryptographic hashes, it is also the name of the programming language. This page covers installing and managing Vector through the Nix package repository. + +{{< warning title="Nix releases are typically delayed" >}} +Because Nix releases for Vector must be manually updated, expect delays between official Vector releases and release of the Nix package. New Vector packages for Nix are typically available within a few days. +{{< /warning >}} + +## Installation + +```shell +nix-env --install \ + --file https://github.com/NixOS/nixpkgs/archive/master.tar.gz \ + --attr vector +``` + +## Deployment + +Vector is an end-to-end observability data pipeline designed to deploy under various roles. You mix and match these roles to create topologies. The intent is to make Vector as flexible as possible, allowing you to fluidly integrate Vector into your infrastructure over time. The deployment section demonstrates common Vector pipelines: + +{{< jump "/docs/setup/deployment/topologies" >}} + +## Other actions + +{{< tabs default="Upgrade Vector" >}} +{{< tab title="Upgrade Vector" >}} +```shell +nix-env --upgrade vector \ + --file https://github.com/NixOS/nixpkgs/archive/master.tar.gz +``` +{{< /tab >}} +{{< tab title="Uninstall Vector" >}} +```shell +nix-env --uninstall vector +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "nix" >}} + +[nix]: https://nixos.org diff --git a/docs/content/en/docs/setup/installation/package-managers/rpm.md b/docs/content/en/docs/setup/installation/package-managers/rpm.md new file mode 100644 index 0000000000000..c0e7aa93f14d9 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/rpm.md @@ -0,0 +1,35 @@ +--- +title: Install Vector using RPM +short: RPM +weight: 7 +--- + +RPM Package Manager is a free and open source package management system for installing and managing software on Fedora, CentOS, OpenSUSE, OpenMandriva, Red Hat Enterprise Linux, and related Linux-based systems. This covers installing and managing Vector through the RPM package repository. + +## Installation + +```shell +sudo rpm -i https://packages.timber.io/vector/{{< version >}}/vector-{{< version >}}-1.{arch}.rpm +``` + +Make sure to replace `{arch}` with one of the following: + +* `x86_64` +* `arm64` +* `armv7` + +## Other actions + +{{< tabs default="Uninstall Vector" >}} +{{< tab title="Uninstall Vector" >}} +```shell +sudo rpm -e vector +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "apt-dpkg-rpm-yum" >}} + +[rpm]: https://rpm.org/ diff --git a/docs/content/en/docs/setup/installation/package-managers/vector-installer.md b/docs/content/en/docs/setup/installation/package-managers/vector-installer.md new file mode 100644 index 0000000000000..dcc475c52ab94 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/vector-installer.md @@ -0,0 +1,14 @@ +--- +title: Install Vector using the Vector installer +short: Vector installer +--- + +The Vector installer enables you to install Vector using a platform-agnostic installation script: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh +``` + +## Management + +{{< jump "/docs/administration/management" "vector-executable" >}} diff --git a/docs/content/en/docs/setup/installation/package-managers/yum.md b/docs/content/en/docs/setup/installation/package-managers/yum.md new file mode 100644 index 0000000000000..9ca01033c61d5 --- /dev/null +++ b/docs/content/en/docs/setup/installation/package-managers/yum.md @@ -0,0 +1,47 @@ +--- +title: Install Vector using YUM +short: YUM +weight: 8 +--- + +The [Yellowdog Updater, Modified][yum] (YUM) is a free and open-source command-line package-manager for Linux operating system using the RPM Package Manager. + +Our Yum repositories are provided by [Cloudsmith] and you can find [instructions for manually adding the repositories][add_repo]. This page covers installing and managing Vector through the YUM package repository. + +## Installation + +Add the repo: + +```shell +curl -1sLf 'https://repositories.timber.io/public/vector/cfg/setup/bash.rpm.sh' \ + sudo -E bash +``` + +Then you can install Vector: + +```shell +sudo yum install vector +``` + +## Other actions + +{{< tabs default="Upgrade Vector" >}} +{{< tab title="Upgrade Vector" >}} +```shell +sudo yum upgrade vector +``` +{{< /tab >}} +{{< tab title="Uninstall Vector" >}} +```shell +sudo yum remove vector +``` +{{< /tab >}} +{{< /tabs >}} + +## Management + +{{< jump "/docs/administration/management" "apt-dpkg-rpm-yum" >}} + +[add_repo]: https://cloudsmith.io/~timber/repos/vector/setup/#formats-rpm +[cloudsmith]: https://cloudsmith.io/~timber/repos/vector/packages/ +[yum]: https://en.wikipedia.org/wiki/Yum_(software) diff --git a/docs/content/en/docs/setup/installation/platforms/_index.md b/docs/content/en/docs/setup/installation/platforms/_index.md new file mode 100644 index 0000000000000..dbfc7f8df1c43 --- /dev/null +++ b/docs/content/en/docs/setup/installation/platforms/_index.md @@ -0,0 +1,9 @@ +--- +title: Platforms +weight: 2 +aliases: ["/docs/setup/installation/containers"] +--- + +## Supported platforms + +{{< pages >}} diff --git a/docs/content/en/docs/setup/installation/platforms/docker.md b/docs/content/en/docs/setup/installation/platforms/docker.md new file mode 100644 index 0000000000000..b041a48496877 --- /dev/null +++ b/docs/content/en/docs/setup/installation/platforms/docker.md @@ -0,0 +1,83 @@ +--- +title: Install Vector on Docker +short: Docker +weight: 1 +aliases: ["/docs/setup/installation/containers/docker"] +--- + +[Docker] is an open platform for developing, shipping, and running applications and services. With Docker, you can manage your infrastructure in the same ways you manage your services. By taking advantage of Docker's methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production. This page covers installing and managing Vector on the Docker platform. + +## Installation + +Pull the Vector image: + +```shell +docker pull timberio/vector:{{< version >}}-debian +``` + +{{< success >}} +Other available distributions (beyond `debian`): + +* `alpine` +* `distroless` +{{< /success >}} + +## Deployment + +Vector is an end-to-end observability data pipeline designed to deploy under various roles. You mix and match these roles to create topologies. The intent is to make Vector as flexible as possible, allowing you to fluidly integrate Vector into your infrastructure over time. The deployment section demonstrates common Vector pipelines: + +{{< jump "/docs/setup/deployment/topologies" >}} + +## Administration + +### Start + +```shell +docker run \ + -d \ + -v ~/vector.toml:/etc/vector/vector.toml:ro \ + -p 8383:8383 \ + timberio/vector:{{< version >}}-debian +``` + +Make sure to substitute out `debian` if you're using a different distribution. + +### Stop + +```shell +docker stop timberio/vector +``` + +### Reload + +```shell +docker kill --signal=HUP timberio/vector +``` + +### Restart + +```shell +docker restart -f $(docker ps -aqf "name=vector") +``` + +### Observe + +To tail the logs from your Vector image: + +```shell +docker logs -f $(docker ps -aqf "name=vector") +``` + +To access metrics from your Vector image: + +```shell +vector top +``` + +### Uninstall + +```shell +docker rm timberio/vector +``` + +[docker]: https://docker.com diff --git a/docs/content/en/docs/setup/installation/platforms/kubernetes.md b/docs/content/en/docs/setup/installation/platforms/kubernetes.md new file mode 100644 index 0000000000000..1fc6e88cf3cb6 --- /dev/null +++ b/docs/content/en/docs/setup/installation/platforms/kubernetes.md @@ -0,0 +1,230 @@ +--- +title: Install Vector on Kubernetes +short: Kubernetes +weight: 2 +--- + +{{< requirement title="Minimum Kubernetes version" >}} +Vector must be installed on Kubernetes version **1.14** or higher. +{{< /requirement >}} + +[Kubernetes], also known as **k8s**, is an open source container orchestration system for automating application deployment, scaling, and management. This page covers installing and managing Vector on the Kubernetes platform. + +## Install + +You can install Vector on Kubernetes using either [Helm](#helm) or [kubectl](#kubectl). + +### Helm + +{{< jump "/docs/setup/installation/package-managers/helm" >}} + +### kubectl + +[kubectl] is the Kubernetes command-line tool. You can use it as an alternative to [Helm](#helm) to install Vector on Kubernetes The instructions below are for installing Vector in the [agent] role. + +{{< warning title="Aggregator role not yet supported" >}} +Deploying Vector in the [aggregator] role using kubectl isn't yet supported. + +[aggregator]: /docs/setup/deployment/roles#aggregator +{{< /warning >}} + +The [agent] role is designed to collect all log data on each Kubernetes [Node]. Vector runs as a [DaemonSet] and tails logs for the entire Pod, automatically enriching those logs with Kubernetes metadata via the [Kubernetes API][k8s_api]. Collection is handled automatically and it intended for you to adjust your pipeline as necessary using Vector's [sources], [transforms], and [sinks]. + +#### Define Vector's namespace + +We recommend running Vector in its own Kubernetes namespace. In the instructions here we'll use `vector` as a namespace but you're free to choose your own. + +```shell +kubectl create namespace --dry-run=client -o yaml vector > namespace.yaml +``` + +#### Prepare kustomization + + + +```shell +cat <<-'KUSTOMIZATION' > kustomization.yaml +# Override the namespace of all of the resources we manage. +namespace: vector + +bases: + # Include Vector recommended base (from git). + - github.com/timberio/vector/distribution/kubernetes/kubectl?ref=v{{< version >}} + +images: + # Override the Vector image to avoid use of the sliding tag. + - name: timberio/vector + newName: timberio/vector + newTag: v{{< version >}}-debian + +resources: + # A namespace to keep the resources at. + - namespace.yaml + +configMapGenerator: + # Provide a custom `ConfigMap` for Vector. + - name: vector-agent-config + files: + - vector.toml + +generatorOptions: + # We don't want a suffix for the `ConfigMap` name. + disableNameSuffixHash: true +KUSTOMIZATION +``` + +#### Configure Vector + +```shell +cat <<-'VECTORCFG' > vector.toml +# The Vector Kubernetes integration automatically defines a +# `kubernetes_logs` source that is made available to you. +# You do not need to define a log source. +VECTORCFG +``` + +#### Verify the configuration + +```shell +kubectl kustomize +``` + +#### Install Vector + +```shell +kubectl install -k . +``` + +#### Tail Vector logs + +```shell +"kubectl logs -n vector daemonset/\(_controller_resource_name)" +``` + +## Deployment + +Vector is an end-to-end observability data pipeline designed to deploy under various roles. You mix and match these roles to create topologies. The intent is to make Vector as flexible as possible, allowing you to fluidly integrate Vector into your infrastructure over time. The deployment section demonstrates common Vector pipelines: + +{{< jump "/docs/setup/deployment/topologies" >}} + +## How it works + +### Checkpointing + +Vector checkpoints the current read position after each successful read. This ensures that Vector resumes where it left off when it's restarted, which prevents data from being read twice. The checkpoint positions are stored in the data directory which is specified via the global [`data_dir`][data_dir] option, but can be overridden via the `data_dir` option in the file source directly. + +### Container exclusion + +The [`kubernetes_logs` source][kubernetes_logs] can skip the logs from the individual `container`s of a particular Pod. Add an annotation `vector.dev/exclude-containers` to the Pod and enumerate the names of all the containers to exclude in the value of the annotation like so: + +```yaml +vector.dev/exclude-containers: "container1,container2" +``` + +This annotation makes Vector skip logs originating from the `container1` and `container2` of the Pod marked with the annotation, while logs from other containers in the Pod are collected. + +### Context + +By default, the [`kubernetes_logs`][kubernetes_logs] source augments events with helpful content keys, as explained in the [Output][kubernetes_logs_output] section. + +### Enrichment + +Vector enriches data with Kubernetes context. You can find a comprehensive list of fields in the [`kubernetes_logs` source output docs][kubernetes_logs_output]. + +### Filtering + +Vector provides rich filtering options for Kubernetes log collection: + +* Built-in Pod and container exclusion rules +* The `exclude_paths_glob_patterns` option enables you to exclude Kubernetes log files by filename and path. +* The `extra_field_selector` option specifies the field selector to filter Pods with, to be used in addition to the built-in `Node` filter. +* The `extra_label_selector` option specifies the label selector filter Pods with, to be used in addition to the built-in [`vector.dev/exclude` filter][exclude_filter]. + +### Kubernetes API access control + +Vector requires access to the Kubernetes API. Specifically, the [`kubernetes_logs` source][kubernetes_logs] source uses the `/api/v1/pods` endpoint to "watch" Pods from all namespaces. + +Modern Kubernetes clusters run with a role-based access control (RBAC) scheme. RBAC-enabled clusters require some configuration to grant Vector the authorization to access Kubernetes API endpoints. As RBAC is currently the standard way of controlling access to the Kubernetes API, we ship the necessary configuration out of the box. See `ClusterRole`, `ClusterRoleBinding`, and a `ServiceAccount` in our kubectl YAML config and the `rbac` configuration in the Helm chart. + +If your cluster doesn't use any access control scheme and doesn't restrict access to the Kubernetes API, you don't need to provide any extra configuration, as Vector should just work. + +Clusters using a legacy ABAC scheme aren't officially supported, although Vector might work if you configure access properly. We encourage you to switch to RBAC. If you use a custom access control scheme, make sure that Vector is granted access to the `/api/v1/pods` resource. + +### Kubernetes API communication + +Vector communicates with the Vector API to enrich the data it collects with Kubernetes context. In order to do that, Vector needs access to the [Kubernetes API server][k8s_api]. If Vector is running in a Kubernetes cluster, Vector connects to that cluster using the [Kubernetes-provided access information][access_info]. + +In addition to access, Vector implements proper desync handling to ensure that communication is safe and reliable. This ensures that Vector doesn't overwhelm the Kubernetes API or compromise its stability. + +### Metrics + +Vector's Helm chart deployments provide quality of life around setup and maintenance of metrics pipelines in Kubernetes. Each of the Helm charts provides an `internal_metrics` source and `prometheus` sink out of the box. Agent deployments also expose `host_metrics` via the same `prometheus` sink. + +Charts come with options to enable Prometheus integration via annotations or Prometheus Operator integration via PodMonitor. The Prometheus `node_exporter` agent isn't required when the `host_metrics` source is enabled. + +### Partial message merging + +By default, Vector merges partial messages that are split due to the Docker size limit. For everything else, we recommend that you use the [`reduce` transform][reduce], which enables you to handle custom merging of things like stacktraces. + +### Pod exclusion + +By default, the [`kubernetes_logs` source][kubernetes_logs] skips logs from Pods that have a `vector.dev/exclude: "true"` label. You can configure additional exclusion rules via label or field selectors. See the [available options][kubernetes_logs_config]. + +### Pod removal + +To ensure that all data is collected, Vector continues to collect logs from Pods for some time after their removal. This ensures that Vector obtains some of the most important data, such as crash details. + +### Resource limits + +We recommend the resource limits listed below when running Vector on Kubernetes. + +#### Agent resource limits + +If you deploy Vector as an [agent] (collecting data for each of your Kubernetes [Nodes][node]), we recommend the following limits: + +```yaml +resources: + requests: + memory: "64Mi" + cpu: "500m" + limits: + memory: "1024Mi" + cpu: "6000m" +``` + +{{< info >}} +As with all Kubernetes resource limit recommendations, use these as a reference point and adjust as necessary. If your configuration Vector pipeline is complex, you may need more resources; if you have a simple pipeline, you may need less. +{{< /info >}} + +### State + +The [`kubernetes_logs`][kubernetes_logs] component is stateless, which means that its behavior is consistent across each input. + +### State management + +#### Agent state management + +For the [agent] role, Vector stores its state in the host-mapped directory with a static path. If it's redeployed, it's able to continue from where it was interrupted. + +### Testing and reliability + +Vector is tested extensively against Kubernetes. In addition to Kubernetes being Vector's most popular installation method, Vector implements a comprehensive end-to-end test suite for all minor Kubernetes versions beginning with 1.14. + +[access_info]: https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod +[agent]: /docs/setup/deployment/roles#agent + +[daemonset]: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset +[data_dir]: /docs/reference/configuration/global-options#data_dir +[exclude_filter]: /docs/setup/installation/platforms/kubernetes/#pod-exclusion +[k8s_api]: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver +[kubectl]: https://kubernetes.io/docs/reference/kubectl/overview +[kubernetes]: https://kubernetes.io +[kubernetes_logs]: /docs/reference/configuration/sources/kubernetes_logs +[kubernetes_logs_config]: /docs/reference/configuration/sources/kubernetes_logs/#configuration +[kubernetes_logs_output]: /docs/reference/configuration/sources/kubernetes_logs#output +[kustomize]: https://kustomize.io +[node]: https://kubernetes.io/docs/concepts/architecture/nodes +[reduce]: /docs/reference/configuration/transforms/reduce +[sinks]: /docs/reference/configuration/sinks +[sources]: /docs/reference/configuration/sources +[transforms]: /docs/reference/configuration/transforms diff --git a/docs/content/en/docs/setup/quickstart.md b/docs/content/en/docs/setup/quickstart.md new file mode 100644 index 0000000000000..a4581389c96c6 --- /dev/null +++ b/docs/content/en/docs/setup/quickstart.md @@ -0,0 +1,157 @@ +--- +title: Vector quickstart +description: Get up and running +short: Quickstart +weight: 1 +aliases: ["/docs/setup/getting-started", "/docs/setup/guides/getting-started"] +--- + +Welcome to Vector! Vector is a high-performance observability data pipeline that enables you to collect, transform, and route all of your logs and metrics. + +In this quickstart guide, we walk you through using Vector for the first time. We'll install Vector and create our first observability data pipeline so that you can begin to see what Vector can do. + +## Install Vector + +We can install Vector using this installation script: + +```shell +curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh +``` + +Or you can [choose your preferred installation method][install]. + +Once Vector is installed, let's check to make sure that it's working correctly: + +```shell +vector --version +``` + +## Configure Vector + +Vector topologies are defined using a [configuration file][config] that tells it which [components] to run and how they should interact. Vector topologies are made up of three types of components: + +* [Sources] collect or receive data from observability data sources into Vector +* [Transforms] manipulate or change that observability data as it passes through your topology +* [Sinks] send data onwards from Vector to external services or destinations + +Let's create a configuration file called `vector.toml`: + +```toml filename="vector.toml" +[sources.in] +type = "stdin" + +[sinks.out] +inputs = ["in"] +type = "console" +encoding.codec = "text" +``` + +Each component has a unique identifier and is prefixed with the type of the component, for example `sources` for a source. Our first component, `sources.in`, uses the [`stdin` source][stdin], which tells Vector to receive data over stdin and is identified as `in`. + +Our second component, `sinks.out`, uses [`console` sink][console], which tells Vector to print the data to stdout, while the `encoding.codec` option tells Vector to print data as plain text (unencoded). + +The `inputs` option the `sinks.out` component tells Vector where this sink's events are coming from. In our case, events are received from our other component, the source identified as `in`.s + +## Hello world! + +That's it for our first config. Now let's pipe an event through it: + +```shell +echo 'Hello world!' | vector --config ./vector.toml +``` + +The `echo` statement sends a single log to Vector via stdin. The `vector...` command starts Vector with our previously created config file. + +The event we've just sent is received by our `sources.in` component, then sent onto the `sinks.out` component, which in turn echoes it back to the console: + +``` +... some logs ... +Hello World! +``` + +{{< info title="JSON encoding" >}} +If you want to see something cool, try setting `encoding.codec = "json"` in the sink config. +{{< /info >}} + +## Hello Syslog! + +Echoing events into the console isn't terribly exciting. Let's see what we can do with some real observability data by collecting and processing Syslog events. To do that, we'll add two new components to our configuration file. Here's our updated `vector.toml` configuration file: + +```toml filename="vector.toml" +[sources.generate_syslog] +type = "generator" +format = "syslog" +count = 100 + +[transforms.remap_syslog] +inputs = [ "generate_syslog"] +type = "remap" +source = ''' + structured = parse_syslog!(.message) + . = merge(., structured) +''' + +[sinks.emit_syslog] +inputs = ["remap_syslog"] +type = "console" +encoding.codec = "json" +``` + +The first component uses the [`generator` source][generator], which creates sample log data that enables you to simulate different types of events in various formats. + +{{< warning >}} +Wait, I though you said "real" observability data? We choose generated data here because it's hard for us to know which platform you're trying Vector on. That means it's also hard to document a single way for everyone to get data into Vector. +{{< /warning >}} + +The second component is a transform called [`remap`][remap]. The `remap` transform is at the heart of what makes Vector so powerful for processing observability data. The transform exposes a simple language called [Vector Remap Language][vrl] that allows you to parse, manipulate, and decorate your event data as it passes through Vector. Using `remap`, you can turn static events into informational +data that can help you ask and answer questions about your environment's state. + +You can see we've added the `sources.generated_syslog` component. The `format` option tells the generator which type of logs to emit, here `syslog`, and the `count` option tells the generator how many lines to emit, here 100. + +In our second component, `transforms.remap_syslog`, we've specified an `inputs` option of `generate_syslog`, which means it will receive events from our `generate_syslog` source. We've also specified the type of transform: `remap`. + +Inside the `source` option of the `remap_syslog` component is where we start to see Vector's power. The `source` contains the list of remapping transformations to apply to each event Vector receives. We're only performing one operation: [`parse_syslog`][parse_syslog]. We're passing this function a single field called `message`, which contains the Syslog event we're generating. This all-in-one function takes a Syslog-formatted message, parses its contents, and emits it as a structured event. Wait, I can hear you saying? What have you done with my many lines of Syslog parsing regular expressions? Remap removes the need for this and allows you to focus on the event's value, not on how to extract that value. + +{{< success >}} +We support parsing a variety of logging formats. Of course, if you have an event format that we don't support, you can also specify your own custom regular expression using `remap` too! The `!` after the `parse_syslog` function tells Vector to emit an error if the message fails to parse, meaning you'll know if some non-standard Syslog is received, and you can adjust your remapping to accommodate it! +{{< /success >}} + +Lastly, we've renamed our sink component to `emit_syslog`, updated the `inputs` option to process events generated by the `remap_syslog` transform, and specified that we want to emit events in JSON-format. + +Let's re-run Vector. This time we don't need to echo any data to it; just run in on the command line. It'll process +100 lines of generated Syslog data, emit the processed data as JSON, and exit: +```shell +vector --config ./vector.toml +``` + +Now you should have a series of JSON-formatted events, something like this: + +```json +{"appname":"benefritz","facility":"authpriv","hostname":"some.de","message":"We're gonna need a bigger boat","msgid":"ID191","procid":9473,"severity":"crit","timestamp":"2021-01-20T19:38:55.329Z"} +{"appname":"meln1ks","facility":"local1","hostname":"for.com","message":"Take a breath, let it go, walk away","msgid":"ID451","procid":484,"severity":"debug","timestamp":"2021-01-20T19:38:55.329Z"} +{"appname":"shaneIxD","facility":"uucp","hostname":"random.com","message":"A bug was encountered but not in Vector, which doesn't have bugs","msgid":"ID428","procid":3093,"severity":"alert","timestamp":"2021-01-20T19:38:55.329Z"} +``` + +We can see that Vector has parsed the Syslog message and created a structured event containing all of the Syslog fields. All with one line of Vector's remap language. This example is just the beginning of Vector's capabilities. You can receive logs and events from dozens of sources. You can use Vector and remap to change data, add fields to decorate data, convert logs into metrics, drop fields, and dozens of other tasks you use daily to process your observability data. You can then route and output your events to dozens of destinations. + +## What's next? + +We're just scatching the surface in this post. To get your hands dirty with Vector check out: + +* All of Vector's [sources][sources], [transforms][transforms], and [sinks][sinks]. +* The [Vector Remap Language][vrl], the heart of data processing in Vector. +* Finally, [deploying Vector][deployment] to launch Vector in your production environment. + +[components]: /components +[console]: /docs/reference/configuration/sinks/console +[config]: /docs/reference/configuration +[deployment]: /docs/setup/deployment +[generator]: /docs/reference/configuration/sources/generator +[install]: /docs/setup/installation +[parse_syslog]: /docs/reference/vrl/functions/#parse_syslog +[remap]: /docs/reference/configuration/transforms/remap +[sinks]: /docs/reference/configuration/sinks +[sources]: /docs/reference/configuration/sources +[stdin]: /docs/reference/configuration/sources/stdin +[transforms]: /docs/reference/configuration/transforms +[vrl]: /docs/reference/vrl diff --git a/docs/content/en/docs/setup/transformation.md b/docs/content/en/docs/setup/transformation.md new file mode 100644 index 0000000000000..796ac8bbab5bf --- /dev/null +++ b/docs/content/en/docs/setup/transformation.md @@ -0,0 +1,207 @@ +--- +title: Transformation +description: Use Vector to transform observability data +weight: 2 +--- + +Vector provides multiple [transforms] that you can use to modify your observability data as it +passes between the [components] that comprise your Vector [topology]. + +The transform that you will likely use most often for modifying data is the [`remap`][remap] +transform, which enables you to use a single-purpose data transformation language called [Vector +Remap Language][vrl] (VRL for short) to define your event transformation logic. VRL has several +features that should make it your first choice for transforming data in Vector: + +* It offers a wide range of observability-data-specific [functions] that map directly onto + observability use cases (and a [wide range][examples] of use cases at that!). + +* It's built for the very specific use case of working with Vector logs and metrics, which means + that it has no extraneous functionality, its data model maps directly to Vector's internal data + model, and its performance comes quite close to that of native [Rust]. + +* The VRL compiler that's built into Vector performs compile-time checks to ensure that your VRL + code is fundamentally sound. It checks for dead code, unhandled errors, type mismatches, and more. + +In cases where VRL doesn't fit your use case, Vector also offers two [runtime +transforms](#runtime-transforms) that offer a bit more flexibility than VRL but +also come with downsides (listed below) that should always be borne in mind. + +{{< success title="Tell us about your non-covered use case!" >}} +If your observability use case isn't covered by VRL, please feel *very* welcome to [open an +issue][issue] describing it. The Vector team will follow up with potential solutions and workarounds +or, in some cases, updates to VRL that directly address your needs. + +[issue]: https://github.com/timberio/vector/issues/new?assignees=&labels=type%3A+enhancement&template=enhancement.md&title= +{{< /success >}} + +## Transforming data using VRL + +Let's jump straight into an example of using VRL to modify some data. We'll +create a simple topology consisting of three components: + +1. A [`generator`][generator] source produces random [Syslog][syslog] messages at a rate of 10 per + second. + +2. A [`remap`][remap] transform uses VRL to parse incoming Syslog lines + into named fields (`severity`, `timestamp`, etc.). + +3. A [`console`][console] sink pipes the output of the topology to stdout, + so that we can see the results on the command line. + +This configuration defines that topology: + +```toml title="vector.toml" +[sources.logs] + type = "generator" + format = "syslog" + interval = 0.1 + +[transforms.modify] + type = "remap" + inputs = ["logs"] + source = ''' + # Parse Syslog input. The "!" means that the script should abort on error. + . = parse_syslog!(.message) + ''' + +[sinks.out] + type = "console" + inputs = ["modify"] + encoding.codec = "json" +``` + +{{< success title="Multiple configuration formats supported" >}} +Although we're using [TOML] for our configuration here, Vector also supports [JSON] and [YAML]. + +[json]: https://json.org +[toml]: https://toml.io +[yaml]: https://yaml.org +{{< /success >}} + +To start Vector using this topology: + +```bash +vector --config-toml /etc/vector/vector.toml +``` + +You should see lines like this emitted via stdout (formatted for readability here): + +```json +{ + "appname": "authsvc", + "facility": "daemon", + "hostname": "acmecorp.biz", + "message": "#hugops to everyone who has to deal with this", + "msgid": "ID486", + "procid": 5265, + "severity": "notice", + "timestamp": "2021-01-19T18:16:40.027Z" +} +``` + +So far, we've gotten Vector to *parse* the Syslog data but we're not yet *modifying* that data. So +let's update the `source` script of our `remap` transform to make some ad hoc transformations: + +```toml +[transforms.modify] +type = "remap" +inputs = ["logs"] +source = ''' + . = parse_syslog!(.message) + + # Convert the timestamp to a Unix timestamp, aborting on error + .timestamp = to_unix_timestamp!(.timestamp) + + # Remove the "facility" and "procid" fields + del(.facility); del(.procid) + + # Replace the "msgid" field with a unique ID + .msgid = uuid_v4() + + # If the log message contains the phrase "Great Scott!", set the new field + # "critical" to true, otherwise set it to false. If the "contains" function + # errors, log the error (instead of aborting the script, as above). + if (is_critical, err = contains(.message, "Great Scott!"); err != null) { + log(err, level: "error") + } + + .critical = is_critical +''' +``` + +A few things to notice about this script: + +* Any errors thrown by VRL functions must be handled. Were we to neglect to handle the potential + error thrown by the `parse_syslog` function, for example, the VRL compiler would provide a very + specific warning and Vector wouldn't start up. +* VRL has language constructs like variables, `if` statements, comments, and logging. +* The `.` acts as a sort of "container" for the event data. `.` by itself refers to the root event, + while you can use [paths] like `.foo`, `.foo[0]`, `.foo.bar`, `.foo.bar[0]`, and so on to + reference subfields, array indices, and more. + +If you stop and restart Vector, you should see log lines like this (again +reformatted for readability): + +```json +{ + "appname": "authsvc", + "hostname": "acmecorp.biz", + "message": "Great Scott! We're never gonna reach 88 mph with the flux capacitor in its current state!", + "msgid": "4e4437b6-13e8-43b3-b51e-c37bd46de490", + "severity": "notice", + "timestamp": 1611080200, + "critical": true +} +``` + +And that's it! We've successfully created a Vector topology that transforms every event that passes +through it. If you'd like to know more about VRL, we recommend checking out the following +documentation: + +* A full list listing of [VRL functions][functions] +* [VRL examples][examples] +* The [VRL specification][spec], which describes things like VRL's syntax and type system in great + detail + +## Runtime transforms + +If VRL doesn't cover your use case—and that should happen rarely—Vector also +offers two **runtime transforms** that you can use instead of VRL: + +* The [`wasm`][wasm_transform] transform enables you to run compiled [WebAssembly][wasm] code using + a Wasm runtime inside of Vector. + +* The [`lua`][lua_transform] transform enables you to run [Lua][lua] code that you can include + directly in your Vector configuration + +Both of the runtime transforms provide maximal flexibility because they enable +you to use full-fledged programming languages right inside of Vector. But we +recommend using these transforms only when truly necessary, for several reasons: + +1. The runtime transforms make it all too easy to write scripts that are slow, + error prone, and hard to read. +2. Both require you to add a coding/testing/debugging workflow to using Vector, + which is worth the effort if there's no other way to satisfy your use case + but best avoided if possible. +3. Both impose a performance penalty vis-à-vis VRL. Wasm does tend to be faster + than Lua, but Wasm is more difficult to use given the need to add a + Wasm compilation step to your Vector workflow. + +[components]: /components +[console]: /docs/reference/configuration/sinks/console +[examples]: /docs/reference/vrl/examples +[functions]: /docs/reference/vrl/functions +[generator]: /docs/reference/configuration/sources/generator +[lua]: https://lua.org +[lua_transform]: /docs/reference/configuration/transforms/lua +[paths]: /docs/reference/vrl/expressions/#path +[remap]: /docs/reference/configuration/transforms/remap +[rust]: https://rust-lang.org +[spec]: /docs/reference/vrl/expressions +[syslog]: https://en.wikipedia.org/wiki/Syslog +[toml]: https://toml.io +[topology]: /docs/setup/deployment/topologies +[transforms]: /transforms +[vrl]: /docs/reference/vrl +[wasm]: https://webassembly.org +[wasm_transform]: /docs/reference/configuration/transforms/wasm diff --git a/docs/content/en/download/_index.md b/docs/content/en/download/_index.md new file mode 100644 index 0000000000000..09841e3bdac9d --- /dev/null +++ b/docs/content/en/download/_index.md @@ -0,0 +1,5 @@ +--- +title: Download Vector +short: Download +aliases: ["/releases/latest/download", "/releases/nightly/download"] +--- diff --git a/docs/content/en/guides/_index.md b/docs/content/en/guides/_index.md new file mode 100644 index 0000000000000..12bc11d63b251 --- /dev/null +++ b/docs/content/en/guides/_index.md @@ -0,0 +1,7 @@ +--- +title: Vector guides +description: Thoughtful guides to help you get the most out of Vector. Created and curated by the Vector team. +short: Guides +tags: ["guides", "guide"] +aliases: ["/docs/setup/guides"] +--- diff --git a/docs/content/en/guides/advanced/_index.md b/docs/content/en/guides/advanced/_index.md new file mode 100644 index 0000000000000..3a38e21b8b41c --- /dev/null +++ b/docs/content/en/guides/advanced/_index.md @@ -0,0 +1,6 @@ +--- +title: Advanced +description: Advanced guides that go deep on specific features and niches +weight: 2 +tags: ["advanced", "guides", "guide"] +--- diff --git a/docs/content/en/guides/advanced/cloudwatch-logs-firehose.md b/docs/content/en/guides/advanced/cloudwatch-logs-firehose.md new file mode 100644 index 0000000000000..de21185339bbc --- /dev/null +++ b/docs/content/en/guides/advanced/cloudwatch-logs-firehose.md @@ -0,0 +1,620 @@ +--- +title: Ingesting AWS CloudWatch Logs via AWS Kinesis Firehose +description: Use CloudWatch Log subscriptions and Kinesis Firehose to robustly collect and route your CloudWatch logs. +authors: ["jszwedko"] +domains: ["sources", "transforms"] +transforms: ["aws_cloudwatch_logs_subscription_parser"] +weight: 4 +tags: ["aws", "cloudwatch", "logs", "firehose", "advanced", "guides", "guide"] +--- + +{{< requirement title="Pre-requisites" >}} +* You have logs in [AWS CloudWatch Logs][AWS CloudWatch Logs] that you'd like to + consume. +* You are able to deploy Vector with a publicly exposed HTTPS endpoint. + +[AWS CloudWatch Logs]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html +{{< /requirement >}} + +If you use [AWS CloudWatch Logs][AWS CloudWatch Logs] on Amazon Web Services +(AWS), you may be wondering how to ingest these logs with Vector so you can +transform and send them to your service of choice. This guide will walk you +through a production-ready setup using [AWS Kinesis Firehose][AWS Kinesis +Firehose] to forward [AWS CloudWatch Logs][AWS CloudWatch Logs] to one or more +running Vector instances over HTTPS. + +You will learn how to: + +- Configure Vector to consume AWS CloudWatch Log events via the + [`aws_kinesis_firehose`][aws_kinesis_firehose]] source and + [`aws_cloudwatch_logs_subscription_parser`][aws_cloudwatch_logs_subscription_parser] + transform +- Configure [AWS Kinesis Firehose][AWS Kinesis Firehose] to forward events to + a remotely running Vector instance (or instances) + +Once completed, you'll have a setup that will receive events written to +CloudWatch Logs and writes them to standard out, but the configuration can be +adapted to send them to any other [destination of your choice](https://vector.dev/docs/reference/sinks/). + +The goal of this guide is to serve as a reference that you can customize for +your specific needs. + +When you are done, you will end up with a setup that looks like: + +![AWS Kinesis Firehose to Vector](/img/guides/aws-kinesis-firehose-to-vector.png) + +## Motivation + +Why use [AWS CloudWatch Logs subscriptions][AWS CloudWatch Logs subscriptions] +and [AWS Kinesis Firehose][AWS Kinesis Firehose] to forward logs to Vector? This +pipeline: + +- Is tolerant of downtime + - Firehose will retry requests for a configurable period + - Firehose will dead-letter events that cannot be sent to S3 +- Allows you to load balance the log ingestion + - You can put multiple `vector` instances behind a load balancer +- Allows to ingest logs from multiple log groups + - You can use one Firehose delivery stream as the destination for multiple + CloudWatch Logs subscription filters + +## Setup + +Let's set some environment variables to make the below scripts more easily used +without edits. + +```bash +# Update these +export AWS_ACCOUNT_ID="111111111111" # your AWS account ID +export AWS_REGION="us-east-1" # region that resources exist in +export FIREHOSE_ACCESS_KEY="my secret key" # set to a secret value +export VECTOR_ENDPOINT="https://example.com" # the endpoint where vector is deployed with the aws_kinesis_firehose source (see Configuring Vector below) + +# Update these if needed +export LOG_GROUP="/test/vector" # the log group you want to consume with vector +export FIREHOSE_DELIVERY_STREAM="vector-stream" +export FIREHOSE_LOG_GROUP="/aws/kinesisfirehose/vector-stream" # log group for Kinesis Firehose to log messages to +export FIREHOSE_LOG_STREAM="HttpEndpointDelivery" # log stream in DEBUG_LOG_GROUP for Kinesis Firehose to log messages to +export FIREHOSE_S3_BUCKET="firehose-${AWS_ACCOUNT_ID}" # a bucket to write events that failed to be forwarded to +``` + +## Configuring Vector + +Let's take a look at the configuration we will be using: + +```toml title="vector.toml" +[sources.firehose] + type = "aws_kinesis_firehose" + address = "0.0.0.0:8080" # the public URL will be set when configuring Firehose + access_key = "${FIREHOSE_ACCESS_KEY}"my secret key" # this will also be set when configuring Firehose + +[transforms.cloudwatch] + type = "aws_cloudwatch_logs_subscription_parser" + inputs = ["firehose"] + +[transforms.json] + type = "json_parser" + inputs = ["cloudwatch"] + +# you may want to add more transforms here + +[sinks.console] + type = "console" + inputs = ["json"] + encoding.codec = "json" +``` + +This will configure `vector` to listen for Firehose messages on the configured +port. These messages will then be transformed, via the +[`aws_cloudwatch_logs_subscription_parser`][aws_cloudwatch_logs_subscription_parser] +to extract the individual log events, and then the `json_parser` to parse these +events. Finally, they are written to the console. + +{{< info >}} +AWS Kinesis Firehose will only forward to HTTPS (and not HTTP) endpoints running +on port 443. You will need to either put a load balancer in front of the +`vector` instance to handle TLS termination or configure the `tls` parameters of +the `aws_kinesis_firehose` source to serve a valid certificate. +{{< /info >}} + +Parts of the rest of this guide are based on [AWS's Subscription Filters with +Amazon Kinesis Data Firehose +guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#FirehoseExample). +See their guide for more examples. + +## Deploying Vector + +First, deploy vector with the [`aws_kinesis_firehose`][aws_kinesis_firehose] source. See example +configuration above. + +{{< info >}} +Remember that the port must be publicly accessible and the endpoint must be +serving HTTPS. +{{< /info >}} + +## Creating a log groups + +Let's create a new log group to use to ingest logs from. If the log group +already exists, you can skip this step. + +```bash +$ aws logs create-log-group --log-group-name ${LOG_GROUP} +``` + +Additionally, we'll create a log group for Firehose to log to for debugging +purposes (see [Monitoring Kinesis Data Firehose Using CloudWatch +Logs](https://docs.aws.amazon.com/firehose/latest/dev/monitoring-with-cloudwatch-logs.html) +for more details). + +```bash +$ aws logs create-log-group --log-group-name ${FIREHOSE_LOG_GROUP} +$ aws logs create-log-stream \ + --log-group-name ${FIREHOSE_LOG_GROUP} \ + --log-stream-name ${FIREHOSE_LOG_STREAM} +``` + +## Creating Kinesis Delivery Stream + +Let's create the delivery stream to send CloudWatch Log event subscription to. +This will require several steps before we can create the stream itself. + +## Create S3 bucket for events + +The HTTP endpoint destination for Firehose requires you to have an S3 bucket +that it can write failed events too (after it retries them, see below for retry +configuration). Optionally, you can have it copy all events there rather than +only failed ones. + +```bash +$ aws s3api create-bucket --bucket ${FIREHOSE_S3_BUCKET} \ + $(if [[ ${AWS_REGION} != "us-east-1" ]] ; then echo "--create-bucket-configuration LocationConstraint=${AWS_REGION}" ; fi) +``` + +## Create IAM role for delivery stream + +We'll need to create an IAM role that will allow the delivery stream to write to +the bucket we just created. + +```bash +$ aws iam create-role \ + --role-name FirehoseVector \ + --assume-role-policy-document file://<( cat <}} +You can set up multiple subscription filters sending to the same Firehose +delivery stream. +{{< /info >}} + +## Testing it out + +To make sure everything is wired up correctly, let's send some logs to the log +group we've setup. We can use Vector for this too! + +```bash +[sources.stdin] + type = "stdin" +[sinks.cloudwatch] + type = "aws_cloudwatch_logs" + inputs = ["stdin"] + group_name = "${LOG_GROUP}" + stream_name = "test" + region = "us-east-1" + encoding.codec = "json" +``` + +This will read lines from `stdin` and write them to CloudWatch Logs. See the +[AWS Authentication][aws_auth] section for this sink to see how to configure the +AWS credentials Vector will need to write to AWS. + +Alternatively, you can publish events directly to a CloudWatch Log group through +the AWS console. First create a log stream within the group, click into it, and +you should see an option under Actions to "Create a log event" + +Let's send some logs. For this, I'm using +[flog], a useful tool for generating fake +log data. + +```bash +flog -f json | vector --config config.toml +``` + +This will send some logs to your log group. Within 300 seconds (the default +batch interval) these logs should be forwarded to your running `vector` +instance(s). + +## Wrap Up + +Congratulations, now you are ingesting logs from AWS CloudWatch Logs in a robust +manner. You can now use Vector to transform and forward these logs to your +destinations of choice. + +Any troubles getting this to work? Let us know via [Github +issues](https://github.com/timberio/vector/issues/new/choose) or [drop into the +`#aws` channel on our discord server.](https://chat.vector.dev) + +Still want more? Read on for a deep dive into this pipeline. + +## Deep dive + +For the curious, let's take a look at what the events look like as they pass +through this pipeline. This can be useful if you'd like to inject different +transforms at various points. + +Let's imagine that we publish the following two events to the CloudWatch Log +group, `/test/vector` that we had setup: + +```json +{ + "bytes": 26780, + "datetime": "14/Sep/2020:11:45:41 -0400", + "host": "157.130.216.193", + "method": "PUT", + "protocol": "HTTP/1.0", + "referer": "https://www.principalcross-platform.io/markets/ubiquitous", + "request": "/expedite/convergence", + "source_type": "stdin", + "status": 301, + "user-identifier": "-" +} +{ + "bytes": 17707, + "datetime": "14/Sep/2020:11:45:41 -0400", + "host": "109.81.244.252", + "method": "GET", + "protocol": "HTTP/2.0", + "referer": "http://www.investormission-critical.io/24/7/vortals", + "request": "/scale/functionalities/optimize", + "source_type": "stdin", + "status": 502, + "user-identifier": "feeney1708" +} +``` + +These events will be forwarded via the CloudWatch Logs subscription we setup to +Kinesis Firehose. Kinesis Firehose will then encode the subscription event and +send it as an HTTP request: + +```json +{ + "requestId": "ed1d787c-b9e2-4631-92dc-8e7c9d26d804", + "timestamp": 1600110760138, + "records": [ + { + "data": "H4sIAMeba18AA52TX2/aMBTF3/spUJ4h/h/beUMqYy+TKsGexlSFcGm9JXFqO2Vd1e8+O7AiTUNMy0Ok3HNybN+f7+vNZJK14H31AOuXHrJykt3O1/P7T4vVar5cZNNksIcOXJKwJFpozqQg7Cg19mHp7NAnFX2LQYAC+PAuroKDqk3queyHra+d6YOx3QfTBHA+Gr5EKYq30Wa6KmlZrHz9HbR4hi6cfa/jO0pml8KZKBQrhMJKF4QLRTllBeZMc60YLbBkSlOqlBBEx0dIRaVQHI8bGnOCiW0IVZtOQgqMCcGi0Jjpd8epTWm51022fYkH2mQlLaTC0022qwKkjFjaZISjFfSIYopLQkouSk4mM8wx3mTR+2h9OPqEzAnDOSVFTjQbxRbCo92N8t3n9VjqnQ22ts1Y/Lhe3yGSH5Mc7MGBG4XHEHpfInQ4HPLema42fdXUzno/65sq7K1rc2NRW7nvEDwatuZpMMEO/pT0NMBpWwh+9LAzAVBtu2dwD9DVMLq8HVwN9yFeldHpw850RyVUIUWVDJP4OXhwM7OLzMzenDY422Rv2djNt+k1iEITxTSJHYs4C0q14EwRzNLtw4oUklKhcYRcSHYVIidXIBIpsfxviFjniuSU85wK+ifD5eISQ3qB4QmhiZ33IUIz3sdhmMWJCaaumsSQciTRs3Whav5Cz0cXoP3Q1WmKqib+Bx7ZOG+t+fnPHAWmFzjuATp4IRKrM9A0qjdvN78A1L2XllAEAAA=" + } + ] +} +``` + +The [`aws_kinesis_firehose`][aws_kinesis_firehose] source: + +```toml +[sources.firehose] + type = "aws_kinesis_firehose" + address = "0.0.0.0:8080" # the public URL will be set in the Firehose config + access_key = "my secret key" # this will also be set in the Firehose config +``` + +will accept this request, decode the record (which is gzip'd and then base64 encoded), to produce an event that looks like: + +```json +{ + "message": "{\n \"messageType\": \"DATA_MESSAGE\",\n \"owner\": \"111111111111\",\n \"logGroup\": \"/test\",\n \"logStream\": \"test\",\n \"subscriptionFilters\": [\n \"Destination\"\n ],\n \"logEvents\": [\n {\n \"id\": \"35683658089614582423604394983260738922885519999578275840\",\n \"timestamp\": 1600110569039,\n \"message\": \"{\\\"bytes\\\":26780,\\\"datetime\\\":\\\"14/Sep/2020:11:45:41 -0400\\\",\\\"host\\\":\\\"157.130.216.193\\\",\\\"method\\\":\\\"PUT\\\",\\\"protocol\\\":\\\"HTTP/1.0\\\",\\\"referer\\\":\\\"https://www.principalcross-platform.io/markets/ubiquitous\\\",\\\"request\\\":\\\"/expedite/convergence\\\",\\\"source_type\\\":\\\"stdin\\\",\\\"status\\\":301,\\\"user-identifier\\\":\\\"-\\\"}\"\n },\n {\n \"id\": \"35683658089659183914001456229543810359430816722590236673\",\n \"timestamp\": 1600110569041,\n \"message\": \"{\\\"bytes\\\":17707,\\\"datetime\\\":\\\"14/Sep/2020:11:45:41 -0400\\\",\\\"host\\\":\\\"109.81.244.252\\\",\\\"method\\\":\\\"GET\\\",\\\"protocol\\\":\\\"HTTP/2.0\\\",\\\"referer\\\":\\\"http://www.investormission-critical.io/24/7/vortals\\\",\\\"request\\\":\\\"/scale/functionalities/optimize\\\",\\\"source_type\\\":\\\"stdin\\\",\\\"status\\\":502,\\\"user-identifier\\\":\\\"feeney1708\\\"}\"\n }\n ]\n}\n", + "request_id": "ed1d787c-b9e2-4631-92dc-8e7c9d26d804", + "source_arn": "arn:aws:firehose:us-east-1:111111111111:deliverystream/test", + "timestamp": "2020-09-14T19:12:40.138Z" +} +``` + +Here we can see the some context fields have been extracted from the Firehose +source including the `request_id`, `source_arn` (passed as an HTTP header by +Firehose) and `timestamp` (parsed from the `timestamp` field of the request +body). The `message` field is the decoded record data. In our case, this is an +AWS CloudWatch Logs Subscription event. + +If we formatted it, it would look like: + +```json +{ + "messageType": "DATA_MESSAGE", + "owner": "111111111111", + "logGroup": "/test/vector", + "logStream": "test", + "subscriptionFilters": [ + "Destination" + ], + "logEvents": [ + { + "id": "35683658089614582423604394983260738922885519999578275840", + "timestamp": 1600110569039, + "message": "{\"bytes\":26780,\"datetime\":\"14/Sep/2020:11:45:41 -0400\",\"host\":\"157.130.216.193\",\"method\":\"PUT\",\"protocol\":\"HTTP/1.0\",\"referer\":\"https://www.principalcross-platform.io/markets/ubiquitous\",\"request\":\"/expedite/convergence\",\"source_type\":\"stdin\",\"status\":301,\"user-identifier\":\"-\"}" + }, + { + "id": "35683658089659183914001456229543810359430816722590236673", + "timestamp": 1600110569041, + "message": "{\"bytes\":17707,\"datetime\":\"14/Sep/2020:11:45:41 -0400\",\"host\":\"109.81.244.252\",\"method\":\"GET\",\"protocol\":\"HTTP/2.0\",\"referer\":\"http://www.investormission-critical.io/24/7/vortals\",\"request\":\"/scale/functionalities/optimize\",\"source_type\":\"stdin\",\"status\":502,\"user-identifier\":\"feeney1708\"}" + } + ] +} +``` + +To extract the originating events from this subscription event, we can use the +[`aws_cloudwatch_logs_subscription_parser`][aws_cloudwatch_logs_subscription_parser] +transform: + +```toml +[transforms.cloudwatch] + type = "aws_cloudwatch_logs_subscription_parser" + inputs = ["firehose"] +``` + +This will take the above event and output two new events: + +```json +{ + "id": "35683658089614582423604394983260738922885519999578275840", + "log_group": "/test/vector", + "log_stream": "test", + "message": "{\"bytes\":26780,\"datetime\":\"14/Sep/2020:11:45:41 -0400\",\"host\":\"157.130.216.193\",\"method\":\"PUT\",\"protocol\":\"HTTP/1.0\",\"referer\":\"https://www.principalcross-platform.io/markets/ubiquitous\",\"request\":\"/expedite/convergence\",\"source_type\":\"stdin\",\"status\":301,\"user-identifier\":\"-\"}", + "owner": "071959437513", + "request_id": "ed1d787c-b9e2-4631-92dc-8e7c9d26d804", + "source_arn": "arn:aws:firehose:us-east-1:111111111111:deliverystream/test", + "subscription_filters": [ + "Destination" + ], + "timestamp": "2020-09-14T19:09:29.039Z" +} +{ + "id": "35683658089659183914001456229543810359430816722590236673", + "log_group": "/test/vector", + "log_stream": "test", + "message": "{\"bytes\":17707,\"datetime\":\"14/Sep/2020:11:45:41 -0400\",\"host\":\"109.81.244.252\",\"method\":\"GET\",\"protocol\":\"HTTP/2.0\",\"referer\":\"http://www.investormission-critical.io/24/7/vortals\",\"request\":\"/scale/functionalities/optimize\",\"source_type\":\"stdin\",\"status\":502,\"user-identifier\":\"feeney1708\"}", + "owner": "071959437513", + "request_id": "ed1d787c-b9e2-4631-92dc-8e7c9d26d804", + "source_arn": "arn:aws:firehose:us-east-1:111111111111:deliverystream/test", + "subscription_filters": [ + "Destination" + ], + "timestamp": "2020-09-14T19:09:29.041Z" +} +``` + +Here we can see the individual events are extracted along with some additional +context: + +- `id`: the ID of the log event +- `log_group` the log_group of the log event +- `log_stream` the log_stream of the log event +- `owner` the AWS account ID of the owner of the log event +- `subcription_filters` the filters that matched to send the event +- `timestamp` is overwritten with the timestamp from the log event + +This is pretty good, but, our original events are also JSON, so let's parse +those out using the [`json_parser`][json_parser] transform: + +```toml +[transforms.json] + type = "json_parser" + inputs = ["cloudwatch"] +``` + +This will give us the final result of: + +```json +{ + "bytes": 26780, + "datetime": "14/Sep/2020:11:45:41 -0400", + "host": "157.130.216.193", + "id": "35683658089614582423604394983260738922885519999578275840", + "log_group": "/jesse/test", + "log_stream": "test", + "method": "PUT", + "owner": "071959437513", + "protocol": "HTTP/1.0", + "referer": "https://www.principalcross-platform.io/markets/ubiquitous", + "request": "/expedite/convergence", + "request_id": "ed1d787c-b9e2-4631-92dc-8e7c9d26d804", + "source_arn": "arn:aws:firehose:us-east-1:071959437513:deliverystream/jesse-test", + "source_type": "stdin", + "status": 301, + "subscription_filters": [ + "Destination" + ], + "timestamp": "2020-09-14T19:09:29.039Z", + "user-identifier": "-" +} +{ + "bytes": 17707, + "datetime": "14/Sep/2020:11:45:41 -0400", + "host": "109.81.244.252", + "id": "35683658089659183914001456229543810359430816722590236673", + "log_group": "/jesse/test", + "log_stream": "test", + "method": "GET", + "owner": "071959437513", + "protocol": "HTTP/2.0", + "referer": "http://www.investormission-critical.io/24/7/vortals", + "request": "/scale/functionalities/optimize", + "request_id": "ed1d787c-b9e2-4631-92dc-8e7c9d26d804", + "source_arn": "arn:aws:firehose:us-east-1:071959437513:deliverystream/jesse-test", + "source_type": "stdin", + "status": 502, + "subscription_filters": [ + "Destination" + ], + "timestamp": "2020-09-14T19:09:29.041Z", + "user-identifier": "feeney1708" +} +``` + +Here are original events with all of the additional context! + +[aws_auth]: /docs/reference/configuration/sinks/aws_cloudwatch_logs/#aws-authentication +[AWS CloudWatch Logs subscriptions]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html +[aws_kinesis_firehose]: /docs/reference/configuration/sources/aws_kinesis_firehose/ +[aws_cloudwatch_logs_subscription_parser]: /docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser/ +[AWS CloudWatch Logs]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html +[AWS Kinesis Firehose]: https://aws.amazon.com/kinesis/data-firehose/?kinesis-blogs.sort-by=item.additionalFields.createdDate&kinesis-blogs.sort-order=desc +[flog]: https://github.com/mingrammer/flog +[json_parser]: /docs/reference/vrl/functions/#parse_json +m diff --git a/docs/content/en/guides/advanced/custom-aggregations-with-lua.md b/docs/content/en/guides/advanced/custom-aggregations-with-lua.md new file mode 100644 index 0000000000000..3b42e0ddb4f7f --- /dev/null +++ b/docs/content/en/guides/advanced/custom-aggregations-with-lua.md @@ -0,0 +1,298 @@ +--- +title: Custom Aggregations with Lua +description: Write a custom transform for aggregating log events into metrics using Lua scripting +authors: ["binarylogic"] +domain: transforms +transforms: ["lua"] +weight: 2 +tags: ["lua", "aggregation", "transform", "advanced", "guides", "guide"] +--- + +While Vector's built-in [transforms][docs.transforms] are fast, sometimes they are not expressive +enough for your needs. In such cases the [`lua`][docs.transforms.lua] transform comes to rescue, letting you +define custom transformation logic. + +This guide walks through various ways of defining an aggregating transform component that takes incoming log events, +counts them, and emits [`counter`][docs.architecture.data-model.metric#counter] metrics each 5 seconds. + +## Architectural Overview + +Lua is an interpreted language embedded into Vector. When a `lua` transform is created, it starts an instance +of the Lua interpreter. As a consequence, different transforms are isolated and cannot interrupt each other. + +The execution model is asynchronous, with two key concepts: _hooks_ and _timer handlers_. Both of them are +user-defined Lua functions which are called by Vector at certain events. + +### Hooks + +There are three types of hooks: `init`, `process`, and `shutdown`. + +#### The `process` hook + +The most important of them is `process`, which is called on each incoming events. It can be defined like this: + +```toml +hooks.process = """ +function (event, emit) + -- do something +end +""" +``` + +It takes a single event and can output one or many of them using the `emit` function provided as the second argument. + +For example, the body of the function above could have been + +```lua +event.log.my_field = "my value" +emit(event) +``` + +The code above sets field `my_field` to value `"my_value"` and sends the newly created event to the downstream +components. Read more about event representation [in the reference][docs.transforms.lua#event-data-model]. + +#### The `init` hook + +The `init` hook is similar to `process` hook, but it is called before the first call of the `process` hook, and thus +takes no events as its arguments. + +Note that it although it is called before the first event, it is called only after the first event is ready to be +processed. However, one should not rely on this behavior, as it is not guaranteed to not change in the future. + +#### The `shutdown` hook + +The `shutdown` hook is called after the last event is received. It doesn't take events as arguments as well. + +### Timer handlers + +Timer handlers are similar to hooks by being Lua functions capable of producing events. However, they are called +periodically at pre-defined intervals. + + +All of the functions listed above share a single runtime, so they can communicate between each other using global +variables. + +## First Implementation + +Using the knowledge from the previous section, it is possible to write down the following transform definition: + +```toml title="vector.toml" +[transforms.aggregator] +type = "lua" +version = "2" +inputs = [] # add names of the input components here + +hooks.init = """ + function (emit) + count = 0 -- initialize state by setting a global variable + end +""" + +hooks.process = """ + function (event, emit) + count = count + 1 -- increment the counter and exit + end +""" + +timers = [{interval_seconds = 5, handler = """ + function (emit) + emit { + metric = { + name = "event_counter", + kind = "incremental", + timestamp = os.date("!*t"), + counter = { + value = counter + } + } + } + counter = 0 + end +"""}] + +hooks.shutdown = """ + function (emit) + emit { + metric = { + name = "event_counter", + kind = "incremental", + timestamp = os.date("!*t"), + counter = { + value = counter + } + } + } + end +""" +``` + +One could plug it into a [pipeline][docs.about.concepts#pipelines] and it would work! + +However, this code could and should be refactored. Hold on to the next section to see how it could be done. + +## Reduce Duplication + +A bird's-eye view of the transform definition reveals that the timer handler and the shutdown hook are almost +identical. It is possible make the config more [DRY][urls.dry_code] by extracting creation of the counter into +a dedicated function. Such a function can be placed into the [source][docs.transforms.lua#source] +section of the config: + +```toml +source = """ + function make_counter(value) + return metric = { + name = "event_counter", + kind = "incremental", + timestamp = os.date("!*t"), + counter = { + value = value + } + } + end +""" +``` + +and then adjusting the timer handler + +```toml +timers = [{interval_seconds = 5, handler = """ + function (emit) + emit(make_counter(counter)) + counter = 0 + end +"""}] +``` + +and the `shutdown` hook: + +```toml +hooks.shutdown = """ + function (emit) + emit(make_counter(counter)) + end +""" +``` + +## Keep All Code Together + +The new config looks tidier, but in order to make it more readable, it is also possible to gather implementations of +all functions into the `source` section, resulting in the following component declaration: + +```toml title="vector.toml" +[transforms.aggregator] +type = "lua" +version = "2" +inputs = [] # add names of the input components here +hooks.init = "init" +hooks.process = "process" +hooks.shutdown = "shutdown" +timers = [{interval_seconds = 5, handler = "timer_handler"}] + +source = """ + function init() + count = 0 + end + + function process() + count = count + 1 + end + + function timer_handler(emit) + emit(make_counter(counter)) + counter = 0 + end + + function shutdown(emit) + emit(make_counter(counter)) + end + + function make_counter(value) + return metric = { + name = "event_counter", + kind = "incremental", + timestamp = os.date("!*t"), + counter = { + value = value + } + } + end +""" +``` + +## A Loadable Module + +As the Lua source grows, it becomes benefitial to place it into a separate file. One obvious advantage is the +possiblity to use Lua syntax highlighting in the text editor. A less obvious one is the possibility to share +common functionality between different scripted transforms using [loadable modules][urls.lua_modules]. + +There are many ways to use modules in Lua. The simplest one is to just use [`require`][urls.lua_require] function to +evaluate code from a file, setting up some global variables. + +With this approach the config from the previous section becomes split into two files: + +```lua title="aggregator.lua" +function init() + count = 0 +end + +function aggregator.process() + count = count + 1 +end + +function aggregator.timer_handler(emit) + emit(make_counter(counter)) + counter = 0 +end + +function aggregator.shutdown(emit) + emit(make_counter(counter)) +end + +function aggregator.make_counter(value) + return metric = { + name = "event_counter", + kind = "incremental", + timestamp = os.date("!*t"), + counter = { + value = value + } + } +end +``` + +and + +```toml title="vector.toml" +[transforms.aggregator] +type = "lua" +version = "2" +inputs = [] # add names of the input components here +hooks.init = "init" +hooks.process = "process" +hooks.shutdown = "shutdown" +timers = [{interval_seconds = 5, handler = "timer_handler"}] +source = "require('aggregator')" +``` + +There are also [other possibilities][urls.lua_modules_tutorial] to define Lua modules which do not require to use +global variables, but they are not Vector-specific, and so out of scope of this guide. + +## Conclusion + +As you have witnessed by reading this guide, the power of Vector comes from its flexibility. In addition to +providing a [rich set][docs.transforms] of predefined transforms for building production-grade observability +pipelines, it makes it possible to write custom aggregations as Lua scripts. This allows each role of Vector +in a [deployment topology][docs.setup.deployment.topologies] to perform various kinds of aggregations, providing +alternatives to centralized logs aggregation. + +[docs.about.concepts#pipelines]: /docs/about/concepts/#pipeline +[docs.architecture.data-model.metric#counter]: /docs/about/under-the-hood/architecture/data-model/metric/#counter +[docs.setup.deployment.topologies]: /docs/setup/deployment/topologies/ +[docs.transforms.lua#event-data-model]: /docs/reference/configuration/transforms/lua/#event-data-model +[docs.transforms.lua#source]: /docs/reference/configuration/transforms/lua/#source +[docs.transforms.lua]: /docs/reference/configuration/transforms/lua/ +[docs.transforms]: /docs/reference/configuration/transforms/ +[urls.dry_code]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself +[urls.lua_modules]: https://www.lua.org/manual/5.3/manual.html#6.3 +[urls.lua_modules_tutorial]: http://lua-users.org/wiki/ModulesTutorial +[urls.lua_require]: https://www.lua.org/manual/5.3/manual.html#pdf-require diff --git a/docs/content/en/guides/advanced/merge-multiline-logs-with-lua.md b/docs/content/en/guides/advanced/merge-multiline-logs-with-lua.md new file mode 100644 index 0000000000000..dc6556b65c204 --- /dev/null +++ b/docs/content/en/guides/advanced/merge-multiline-logs-with-lua.md @@ -0,0 +1,159 @@ +--- +title: Merge multi-line logs with Lua +description: Combine multi-line CSV rows into single events using the Lua transform +authors: ["binarylogic"] +domain: transforms +transforms: ["lua"] +weight: 5 +tags: ["lua", "merge", "multiline", "multi-line", "advanced", "guides", "guide"] +--- + +{{< requirement title="Pre-requisites" >}} +* You understand the [basic Lua concepts][docs.transforms.lua]. +* You understand the [basic Vector concepts][docs.about.concepts] and understand [how to set up a basic pipeline][docs.setup.quickstart]. +* You know how to [parse CSV logs with Lua][guides.parsing-csv-logs-with-lua]. + +[docs.about.concepts]: /docs/about/concepts +[docs.setup.quickstart]: /docs/setup/quickstart +[docs.transforms.lua]: /docs/reference/configuration/transforms/lua +[guides.parsing-csv-logs-with-lua]: /guides/advanced/parsing-csv-logs-with-lua +{{< /requirement >}} + +The [guide to parsing CSV logs with Lua][guides.parsing-csv-logs-with-lua] describes how to parse CSV logs containing +values that don't contain line breaks. According to [RFC 4180][urls.rfc_4180], however, CSV values enclosed in double +quotes *can* contain line breaks. This means that parsing arbitrary CSV logs requires handling such line breaks +correctly. + +This can't be accomplished using the [`multiline` option of the `file` source][docs.sources.file#multiline] because it uses regular expressions for delimiting lines, and for the given use case a full-fledged CSV parser is necessary. + +## A Minimal Example + +It's possible to merge CSV log lines using the same [`lua-csv`][urls.lua_csv_repo] module used +in the [guide on parsing CSV logs][guides.parsing-csv-logs-with-lua]. The underlying algorithm is the following: + +1. Parse incoming log line as a CSV row. +2. Check the number of fields in it. + 1. If the number of fields matches the expected number of fields, + then the log line contains all necessary fields and can be + processed further. + 2. Otherwise, store the log line in the state of the transform and + then, when the next event comes, merge the subsequent log line + with the previous ones and repeat parsing again. + +Such an algorithm can be implemented, for example, with the following transform config: + +```toml title="vector.toml" +[transforms.lua] + inputs = [] + type = "lua" + version = "2" + source = """ + csv = require("csv") -- load the `lua-csv` module + expected_columns = 23 -- expected number of columns in incoming CSV lines + line_separator = "\\r\\n" -- note the double escaping required by the TOML format + """ + hooks.process = """ + function (event, emit) + merged_event = merge(event) + if merged_event == nil then -- a global variable containing the merged event + merged_event = event -- if it is empty, set it to the current event + else -- otherwise, concatenate the line in the stored merged event + -- with the next line + merged_event.log.message = merged_event.log.message .. + line_separator .. event.log.message + end + + fields = csv.openstring(event.log.message):lines()() -- parse CSV + if #fields < expected_columns then + return -- not all fields are present in the merged event yet + end + + -- do something with the array of the parsed fields + merged_event.log.csv_fields = fields -- for example, just store them in an + -- array field + + emit(merged_event) -- emit the resulting event + merged_event = nil -- clear the merged event + end + """ +``` + +In this code sample, the `source` option defines code that's executed when the transform is created. +while the `hooks.process` option defines a function that's called for each incoming event. + +## How It Works + +The merging process is shown in this diagram: + +{{< svg "/img/guides/merge-transform.svg" >}} + +The `lua` transform has internal state, which can be accessed and modified from user-defined code +using global variables. Initially, the state is empty, which corresponds to `merged_event` variable +being set to `nil`. + +As events arrive to the transform, they cause the `merged_event` variable to hold an aggregated +event, thus making the event non-empty. + +In the end, when the state holds enough data to extract all fields, a merged event is emitted and +the state is emptied. Then the process repeats as new events arrive. + +## Safety Checks + +The merging algorithm used above is simple and would work for data coming from trusted sources. However, +in general case it might happen that the CSV is malformed, so that some field is not terminated by `"`, +which can cause unbounded growth of the `message` field. In order to prevent this, it is possible to replace +the following lines + +```lua +merged_event.log.message = merged_event.log.message .. + line_separator .. event.log.message +``` + +in the definition of the `process` hook by this code: + +```lua +merged_event = safe_merge(merged_event, event) +if not merged_event then + return +end +``` + +and add the following definition of the `safe_merge` function to the [`source`][docs.transforms.lua#source] +section of the config: + +```lua +function safe_merge(merged_event, event) + if #merged_event.log.message + #event.log.message > 4096 then + return nil + else + merged_event.log.message = merged_event.log.message .. + line_separator .. event.log.message + return merged_event + end +end +``` + +This function checks whether the total length of merged lines not larger than 4096 (the actual value can be made +larger if it is necessary by a particular use case) and, if that is the case, performs actual merging. + +In general, it is recommended to always add such safety checks to the code of your custom transforms in order to +ensure that malformed input would not cause memory leaks or other kinds of undesired behavior. + +## Further Steps + +After the problem of merging multi-line logs in custom formats is solved, you might be interested +in checking out the following guides: + +* [Unit Testing Your Configs][guides.unit-testing] +* [Custom Aggregations with Lua][guides.advanced.custom-aggregations-with-lua] + +[docs.about.concepts]: /docs/about/concepts/ +[docs.setup.quickstart]: /docs/setup/quickstart/ +[docs.sources.file#multiline]: /docs/reference/configuration/sources/file/#multiline +[docs.transforms.lua#source]: /docs/reference/configuration/transforms/lua/#source +[docs.transforms.lua]: /docs/reference/configuration/transforms/lua/ +[guides.advanced.custom-aggregations-with-lua]: /guides/advanced/custom-aggregations-with-lua/ +[guides.parsing-csv-logs-with-lua]: /guides/advanced/parsing-csv-logs-with-lua/ +[guides.unit-testing]: /guides/level-up/unit-testing/ +[urls.lua_csv_repo]: https://github.com/geoffleyland/lua-csv +[urls.rfc_4180]: https://tools.ietf.org/html/rfc4180 diff --git a/docs/content/en/guides/advanced/parsing-csv-logs-with-lua.md b/docs/content/en/guides/advanced/parsing-csv-logs-with-lua.md new file mode 100644 index 0000000000000..3f19c9871f7b4 --- /dev/null +++ b/docs/content/en/guides/advanced/parsing-csv-logs-with-lua.md @@ -0,0 +1,257 @@ +--- +title: Parsing CSV logs with Lua +description: Parse structured application logs in CSV format using Lua transform +authors: ["binarylogic"] +domain: transforms +transforms: ["lua"] +weight: 6 +tags: ["lua", "csv", "logs", "transform", "advanced", "guides", "guide"] +--- + +{{< requirement title="Pre-requisites" >}} +* You understand the [basic Lua concepts][docs.transforms.lua]. +* You understand the [basic Vector concepts][docs.about.concepts] and understand [how to set up a pipeline][docs.setup.quickstart]. +{{< /requirement >}} + +Vector has many built-in [parsers][urls.vector_parsing_transforms] for structured logs formats. However, when you need +to ship logs in a custom or application-specific format, [programmable transforms][urls.vector_programmable_transforms] +have got you covered. + +This guide walks through reading CSV logs using [`file`][docs.sources.file] source and parsing them using the [`lua`][docs.transforms.lua] transform with a loadable Lua module. + +## Getting Started + +For certainty, it is assumed in the following that the logs to be read are produced by +[`csvlog`][urls.postgresql_csvlog] in PostgreSQL. For example, there might be the following +log file: + + +```csv title="log.csv" +2020-04-09 12:48:49.661 UTC,,,1,,localhost.1,1,,2020-04-09 12:48:49 UTC,,0,LOG,00000,"ending log output to stderr",,"Future log output will go to log destination ""csvlog"".",,,,,,,"" +2020-04-09 12:48:49.669 UTC,,,27,,localhost.1b,1,,2020-04-09 12:48:49 UTC,,0,LOG,00000,"database system was shut down at 2020-04-09 12:48:25 UTC",,,,,,,,,"" +2020-04-09 12:48:49.683 UTC,,,1,,localhost.1,2,,2020-04-09 12:48:49 UTC,,0,LOG,00000,"database system is ready to accept connections",,,,,,,,,"" +``` + +Let us draft an initial version of the Vector's configuration file: + +```toml title="vector.toml" +data_dir = "." + +[sources.file] + type = "file" + include = ["*.csv"] + start_at_beginning = true + +[transforms.lua] + inputs = ["file"] + type = "lua" + version = "2" + hooks.process = """ + function (event, emit) + -- to be expanded + emit(event) + end + """ + +[sinks.console] + inputs = ["lua"] + type = "console" + encoding = "json" +``` + +This config sets up a [pipeline][docs.meta.glossary#pipeline] that reads log files, pipes them through the parsing +transform (which currently is configured to just pass the events through), and displays the produced log events using +[`console`][docs.sinks.console] sink. + +At this point, running `vector --config vector.toml` results in the following output: + +```json +{"file":"log.csv","host":"localhost","message":"2020-04-09 12:48:49.661 UTC,,,1,,localhost.1,1,,2020-04-09 12:48:49 UTC,,0,LOG,00000,\"ending log output to stderr\",,\"Future log output will go to log destination \"\"csvlog\"\".\",,,,,,,\"\"","timestamp":"2020-04-09T14:33:28Z"} +{"file":"log.csv","host":"localhost","message":"2020-04-09 12:48:49.669 UTC,,,27,,localhost.1b,1,,2020-04-09 12:48:49 UTC,,0,LOG,00000,\"database system was shut down at 2020-04-09 12:48:25 UTC\",,,,,,,,,\"\"","timestamp":"2020-04-09T14:33:28Z"} +{"file":"log.csv","host":"localhost","message":"2020-04-09 12:48:49.683 UTC,,,1,,localhost.1,2,,2020-04-09 12:48:49 UTC,,0,LOG,00000,\"database system is ready to accept connections\",,,,,,,,,\"\"","timestamp":"2020-04-09T14:33:28Z"} +``` + +## Adding the CSV Module + +In order to perform actual parsing, it is possible to leverage [`lua-csv`][urls.lua_csv_repo]. +Because it consists of a [single file][urls.lua_csv_view], it is possible to just download it to the same +directory where `vector.toml` is stored: + +```bash +curl -o csv.lua https://raw.githubusercontent.com/geoffleyland/lua-csv/d20cd42d61dc52e7f6bcb13b596ac7a7d4282fbf/lua/csv.lua +``` + +Then it would be possible to load it by calling [`require`][urls.lua_require] Lua function in the +[`source`][docs.transforms.lua#source] configuration section: + +```toml +source = """ + csv = require("csv") +""" +``` + +With this `source` the `csv` module is loaded when Vector is started up (or if the `lua` transform is added later and the +config is automatically reloaded) and can be used through the global variable `csv`. + +## Implementing Custom Parsing + +With the `csv` module, the [`hooks.process`][docs.transforms.lua#process] can be changed to the following: + +```toml +hooks.process = """ + function (event, emit) + fields = csv.openstring(event.log.message):lines()() -- parse the `message` field + event.log.message = nil -- drop the `message` field + + column_names = { -- a sequence containing CSV column names + -- ... + } + + for column, value in ipairs(fields) do -- iterate over CSV columns + column_name = column_names[column] -- get column name + event.log[column_name] = value -- set the corresponding field in the event + end + + emit(event) -- emit the transformed event + end +""" +``` + +Note that the `column_names` can be created just once, in the `source` section instead to speed up processing. +Putting it there and using the column names from the PostgreSQL documentation results in the following definition of +the whole transform: + +```toml title="vector.toml" +# ... +[transforms.lua] + inputs = ["file"] + type = "lua" + version = "2" + source = """ + csv = require("csv") -- load external module for parsing CSV + column_names = { -- a sequence containing CSV column names + "log_time", + "user_name", + "database_name", + "process_id", + "connection_from", + "session_id", + "session_line_num", + "command_tag", + "session_start_time", + "virtual_transaction_id", + "transaction_id", + "error_severity", + "sql_state_code", + "message", + "detail", + "hint", + "internal_query", + "internal_query_pos", + "context", + "query", + "query_pos", + "location", + "application_name", + } + """ + hooks.process = """ + function (event, emit) + fields = csv.openstring(event.log.message):lines()() -- parse the `message` field + event.log.message = nil -- drop the `message` field + + for column, value in ipairs(fields) do -- iterate over CSV columns + column_name = column_names[column] -- get column name + event.log[column_name] = value -- set the corresponding field in the event + end + + emit(event) -- emit the transformed event + end + """ +#... +``` + +Trying to run `vector --config vector.toml` with the same input file results in structured events being output: + +```json +{"application_name":"","command_tag":"","connection_from":"","context":"","database_name":"","detail":"","error_severity":"LOG","file":"log.csv","hint":"Future log output will go to log destination \"csvlog\".","host":"localhost","internal_query":"","internal_query_pos":"","location":"","log_time":"2020-04-09 12:48:49.661 UTC","message":"ending log output to stderr","process_id":"1","query":"","query_pos":"","session_id":"localhost.1","session_line_num":"1","session_start_time":"2020-04-09 12:48:49 UTC","sql_state_code":"00000","timestamp":"2020-04-09T19:49:07Z","transaction_id":"0","user_name":"","virtual_transaction_id":""} +{"application_name":"","command_tag":"","connection_from":"","context":"","database_name":"","detail":"","error_severity":"LOG","file":"log.csv","hint":"","host":"localhost","internal_query":"","internal_query_pos":"","location":"","log_time":"2020-04-09 12:48:49.669 UTC","message":"database system was shut down at 2020-04-09 12:48:25 UTC","process_id":"27","query":"","query_pos":"","session_id":"localhost.1b","session_line_num":"1","session_start_time":"2020-04-09 12:48:49 UTC","sql_state_code":"00000","timestamp":"2020-04-09T19:49:07Z","transaction_id":"0","user_name":"","virtual_transaction_id":""} +{"application_name":"","command_tag":"","connection_from":"","context":"","database_name":"","detail":"","error_severity":"LOG","file":"log.csv","hint":"","host":"localhost","internal_query":"","internal_query_pos":"","location":"","log_time":"2020-04-09 12:48:49.683 UTC","message":"database system is ready to accept connections","process_id":"1","query":"","query_pos":"","session_id":"localhost.1","session_line_num":"2","session_start_time":"2020-04-09 12:48:49 UTC","sql_state_code":"00000","timestamp":"2020-04-09T19:49:07Z","transaction_id":"0","user_name":"","virtual_transaction_id":""} +``` + +Or, applying pretty formatting to one of the output events: + +```json +{ + "application_name": "", + "command_tag": "", + "connection_from": "", + "context": "", + "database_name": "", + "detail": "", + "error_severity": "LOG", + "file": "log.csv", + "hint": "Future log output will go to log destination \"csvlog\".", + "host": "localhost", + "internal_query": "", + "internal_query_pos": "", + "location": "", + "log_time": "2020-04-09 12:48:49.661 UTC", + "message": "ending log output to stderr", + "process_id": "1", + "query": "", + "query_pos": "", + "session_id": "localhost.1", + "session_line_num": "1", + "session_start_time": "2020-04-09 12:48:49 UTC", + "sql_state_code": "00000", + "timestamp": "2020-04-09T19:49:07Z", + "transaction_id": "0", + "user_name": "", + "virtual_transaction_id": "" +} +``` + +## Further Improvements + +After the task of parsing the CSV logs is accomplished, the following improvements can take place. + +### Support for Multi-line Strings + +CSV supports line breaks in strings. However, by default `file` source creates a separate event from each line. + +There are two options to deal with this: + +1. For simple cases it might be possible to use the [`multiline`][docs.sources.file#multiline] configuration + option in the `file` source. +2. For more complex cases the messages from multiple events can be conditionally concatenated in the Lua code. See + [the aggregations guide][guides.advanced.custom-aggregations-with-lua] for more details on this. + +### Change Fields Types + +By default, all columns are parsed as strings. It is possible to convert them to other +[data types][docs.transforms.lua#data-types] right in the Lua code using +built-in functions, such as [`tonumber`][urls.lua_tonumber]. Alternatively, it is possible to add the +[`coercer`][docs.transforms.coercer] transform after the `lua` transform, for example, to +[parse timestamps][docs.transforms.coercer#timestamps]. + +[docs.about.concepts]: /docs/about/concepts +[docs.meta.glossary#pipeline]: /docs/reference/glossary/#pipeline +[docs.setup.quickstart]: /docs/setup/quickstart/ +[docs.sinks.console]: /docs/reference/configuration/sinks/console/ +[docs.sources.file#multiline]: /docs/reference/configuration/sources/file/#multiline +[docs.sources.file]: /docs/reference/configuration/sources/file/ +[docs.transforms.coercer#timestamps]: /docs/reference/vrl/functions/#to_timestamp +[docs.transforms.coercer]: /docs/reference/vrl/functions/#coerce-functions +[docs.transforms.lua#data-types]: /docs/reference/configuration/transforms/lua/#event-data-model +[docs.transforms.lua#process]: /docs/reference/configuration/transforms/lua/#hooks.process +[docs.transforms.lua#source]: /docs/reference/configuration/transforms/lua/#source +[docs.transforms.lua]: /docs/reference/configuration/transforms/lua/ +[guides.advanced.custom-aggregations-with-lua]: /guides/advanced/custom-aggregations-with-lua/ +[urls.lua_csv_repo]: https://github.com/geoffleyland/lua-csv +[urls.lua_csv_view]: https://github.com/geoffleyland/lua-csv/blob/09557e4608b02d136b9ae39a8fa0f36328fa1cec/lua/csv.lua +[urls.lua_require]: https://www.lua.org/manual/5.3/manual.html#pdf-require +[urls.lua_tonumber]: https://www.lua.org/manual/5.3/manual.html#pdf-tonumber +[urls.postgresql_csvlog]: https://www.postgresql.org/docs/current/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-CSVLOG +[urls.vector_parsing_transforms]: /components/?functions%5B%5D=parse +[urls.vector_programmable_transforms]: /components/?functions%5B%5D=program diff --git a/docs/content/en/guides/advanced/wasm-hello.md b/docs/content/en/guides/advanced/wasm-hello.md new file mode 100644 index 0000000000000..f480fdc86b3e3 --- /dev/null +++ b/docs/content/en/guides/advanced/wasm-hello.md @@ -0,0 +1,259 @@ +--- +title: Hello, Wasm world +description: Write your first Wasm plugin for Vector +authors: ["hoverbear"] +domain: transforms +transforms: ["wasm"] +weight: 3 +tags: ["webassembly", "wasm", "transform", "advanced", "guides", "guide"] +--- + +{{< requirement title="Pre-requisites" >}} +* You understand the [basic Vector concepts][docs.about.concepts] and understand [how to set up a pipeline][docs.setup.quickstart]. +* You must be using a Linux system (or WSL2 for Windows users) for WASM related work right now. + +[docs.about.concepts]: /docs/about/concepts +[docs.setup.quickstart]: /docs/setup/quickstart +{{< /requirement >}} + +Vector supports a robust, language-agnostic WebAssembly runtime with WASI support. While support +matures, we encourage you to try out the transform and consider how it might fit into your pipelines. + +In this guide you'll: + +* Build your own custom rolled Vector release. +* Develop your first Vector plugin. +* Review how to test and benchmark the plugin, as well as Vector. + +First, let's talk a bit about what Vector plugins are! Just want to dig in? [**Fastpath to Hacking!**](#limitations) + +## Why does Vector need plugins? + +We had a few reasons to add plugin support! + +* **Build Complexity is first.** Vector connects sources to sinks, with some transformation magic in between. The more + **stuff** you support, the more Vector grows in size. Each component we add brings with it a new set of dependencies, + increasing things like binary size, testing time, and linkage which need to be made and optimized. + + Eventually, Vector will grow large enough that some folks won't be able to contribute to it, their computers won't be + able to handle it. What a nightmare scenario 😔. *Fear not. Plugins can help us.* They allow us to decompose Vector + components into small units that don't need to be part of the main linkage. + +* **Language capabilities and limitations is up next.** Vector is built on Rust. It's a static, systems language which + relies on ahead-of-time compilation. Normally, this is a most excellent decision, but in some niche cases it creates + big problems! *Protobufs* are a good example of this problem. See, most fast protobuf libraries are *generated* by a + tool called `protoc` or something like `prost`, a protobuf crate that generates code at build time. + + This is not something Vector can do without adding a **lot** of dependencies. Normally in a situation like this, the + best solution would be to work with the upstream ecosystem to come up with efficient runtime solutions. We tried this, + and there was a path forward here, for protobufs. But we knew there were other formats like Avro or Cap'n Proto. + This is a problem that will keep repeating. Plugins let our users go ahead and roll their own custom deserializers + for any protocol they want, and we can build tooling to help them do that in a nice way. + +* **Lastly, Lua, DSLs, and other configuration methods are so fun to use!** We found users really enjoy the feeling of + using a language they're familiar with to use Vector. Our Lua transform is very popular, and we often get + requests for other languages like Javascript. + + WASM lets us solve this. By exposing a WASM interface, we can support any language that compiles to WASM. We hope this + will let us provide a better, more familiar experience to users who like to write their own scripts. + +## What's a WASM anyhow? + +WebAssembly (or WASM) is an execution format. + +Compilers like `rustc` can output code into WebAssembly format (either binary `.wasm` or UTF-8 `.wat`). These are just +like `.so` or `.dll` files you may have seen in your filesystem. + +If you've specified a WASM module in your Vector config, Vector will go ahead and load it, then optimize the code for +the exact machine it's running on. Vector then executes that code, and communicates with it through a fast, C-like +foreign-function interface. + +WASM plugins act as a "stack machine" and Vector sandboxes them with a limited set of capabilities and resources. +A plugin can't go blow out the heap, read your private keys, or send your data to the NSA. + +It's an emerging format, and only has risen to usability in recent years. Our addition of WASM support is still limited +not only due to our implementation being quite new, but WASM itself being quite new. + +## Why are Vector plugins WASM based? + +WASM is an **operating system and architecture agnostic format**. Once runtime support matures, users of WASM plugins +will be able to use the same plugin on Linux, Windows, Mac, or any other platform our runtimes support. + +Since many languages can target WASM (and more emerge all the time!) we can **avoid having to package a menagerie of +language runtimes** while still providing users with support for their favorite languages. In addition, users should +find it unchallenging to add support for new languages which already compile to WASM. In most cases, it's just providing +a nice API over the hostcall interface. + +Vector's WASM plugins run in a sandbox, we can closely **control the runtime resources of plugins and perform auditing +on them**. We can closely limit the amount of memory or time available for a plugin to run, inspect its memory during +runtime, or even audit/test plugins for faults or issues before running it. + +While all that sounds great, it doesn't mean anything if Vector components runs slower in plugins! The good news here is +that the cost of a WASM call is typically under 10ns, so unless you're truly pushing Vector to its limits already, you +shouldn't notice a dip in performance. + +## Cook your environment and kick the wheels + +In order to develop and test a WASM plugin for Vector, you'll need to do two things: + +* Build Vector with WASM support. +* Run the existing Vector WASM tests. + +Let's do that now: + +First, [consult the CONTRIBUTING.md guide on how to set up your development environment](https://github.com/timberio/vector/blob/master/CONTRIBUTING.md#development), or bootstrap an Ubuntu 20.04 host/VM/Container with: + +```bash +apt install build-essentials git cmake llvm lld clang libssl-dev protobuf-compiler +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +With your machine provisioned, it's time to hack! + +1. Add the `wasm32-wasi` target: + + ```bash + rustup target add wasm32-wasi + ``` +1. Build Vector: **(This will take a bit!)** + + ```bash + cargo build --features wasm --release + ``` +1. Verify your handiwork, make sure the `wasm` component is loaded: + + ```bash + ./target/release/vector list | grep wasm + ``` +1. Build the test WASM module Vector uses: + + ```bash + make test-wasm-build-modules + ``` + +At this point you should have: + +* `target/release/vector`, a build of Vector with WASM support. +* `target/wasm32-wasi/release/*.wasm`, several test modules to use. + +Let's take it for a spin! Make a config like so: + +```toml title="vector.toml" +data_dir = "/var/lib/vector/" + +[sources.source0] +max_length = 102400 +type = "stdin" + +[transforms.transform0] +inputs = ["source0"] +type = "wasm" +module = "target/wasm32-wasi/release/add_fields.wasm" +artifact_cache = "cache/" +options.new_field = "new_value" +options.new_field_2 = "new_value_2" + +[sinks.sink0] +healthcheck = true +inputs = ["transform0"] +type = "console" +encoding = "json" +buffer.type = "memory" +buffer.max_events = 500 +buffer.when_full = "block" +``` + +Then, `mkdir -p cache` to create a local directory for vector to store its optimized artifacts. + +Now it's time for the best part! Run Vector and have a try, using `CTRL+C` to stop as needed: + +```bash +ana@autonoma:~/git/timberio/vector$ ./target/release/vector --config test.toml +# ... +Aug 17 15:28:05.954 INFO vector::topology::builder: Healthcheck: Passed. +This is some input! +{"host":"autonoma","message":"This is some input!","new_field":"new_value","new_field_2":"new_value_2","source_type":"stdin","timestamp":"2020-08-17T22:28:11.183218406Z"} +^CAug 17 15:28:12.690 INFO vector: Shutting down. +Aug 17 15:28:12.690 INFO source{name=source0 type=stdin}: vector::sources::stdin: finished sending +``` + +Now lets dig into the module we tested, see how it works, then write your own! + + +## Hack on a Plugin + +The easiest way to get started (for now!) is to copy an existing plugin inside Vector. + + +```bash +PLUGIN_NAME=banana +GITHUB_USER=hoverbear +VECTOR_DIR=${PWD} + +mkdir -p ~/git/${GITHUB_USER}/ +cp -r tests/data/wasm/add_fields ~/git/${GITHUB_USER}/${PLUGIN_NAME} +cd ~/git/${GITHUB_USER}/${PLUGIN_NAME} +sed -i 's@add_fields@'"${PLUGIN_NAME}"'@g' Cargo.toml +sed -i 's@\.\./\.\./\.\./\.\.@'"${VECTOR_DIR}"'@g' Cargo.toml +cargo build --target wasm32-wasi --release +``` + +At this point you should have: + +* `target/wasm32-wasi/release/${PLUGIN_NAME}.wasm`, a WASM module you can load into Vector. + +{{< info >}} +**Feature outlook**: We're investigating the best way to let users generate plugins from templates, as well as +integration with tools like `wapm`. +{{< /info >}} + +Next, you should review the code in `src/lib.rs`, and start planning how to add your feature. You can browse other +examples in the `tests/data/wasm/` folder of Vector. + +Some things to note: + +* Accessing a chunk of guest memory as mutable slice can be done via: + ```rust + let data = unsafe { + std::ptr::slice_from_raw_parts_mut(data as *mut u8, length.try_into().unwrap()) + .as_mut() + .unwrap() + }; + ``` +* `OnceCell` is useful for one-time initializers. Eg. + ```rust + static FIELDS: OnceCell> = OnceCell::new(); + + fn demo() { + // ... + FIELDS.set(config.options.into()).unwrap(); + // ... + } + ``` +* Vector will reinitialize panicked modules, so panicing is safe so long as you're fine losing your working data. +* By default, the heap size is 10MB. + +## Understanding the Current Limitations {#limitations} + +Currently support for WASM is limited, we're investigating the best ways to support topics like: + +* Variable numbers of output events. (Currently only 0 or 1 supported) +* Optimized stream support. (We use a fallback right now) +* Timeouts/deadlines/watchdogs. (We don't support this right now) +* Sockets and File descriptors. (We don't support this right now) +* Faster FFI communication. (We're using a fairly slow method right now, takes whole nanoseconds!) + +Please let us know if you value one of these features and we can better prioritize it! + +## Going Farther + +You're already armed with the ability to make WASM plugins and build Vector. You have all the tools you need. Now is the +time to get excited, and start digging. + +We'd love it if your energies ended up helping us improve Vector's core, share the plugins you make with others, or even +just show off the cool stuff you're doing to us! + +Why not try to make a transform that removes fields? + +[docs.about.concepts]: /docs/about/concepts/ +[docs.setup.quickstart]: /docs/setup/quickstart/ diff --git a/docs/content/en/guides/advanced/wasm-multiline.md b/docs/content/en/guides/advanced/wasm-multiline.md new file mode 100644 index 0000000000000..b94e07feef0cc --- /dev/null +++ b/docs/content/en/guides/advanced/wasm-multiline.md @@ -0,0 +1,682 @@ +--- +title: Architecting Wasm Plugins +description: Build a Wasm plugin from scratch +authors: ["hoverbear"] +domain: transforms +transforms: ["wasm"] +weight: 1 +tags: ["webassembly", "wasm", "multiline", "multi-line", "advanced", "guides", "guide"] +--- + +{{< requirement title="Pre-requisites" >}} +* You understand the [basic Vector concepts][docs.about.concepts] and understand [how to set up a pipeline][docs.setup.quickstart]. +* You must be using a Linux system (or WSL2 for Windows users) for WASM related work right now. +* You read the [Hello, WASM World][wasm_guide] guide and feel comfortable with the topics it discussed. +* You've reviewed the [Unit Testing][unit_tests] guide. + +[docs.about.concepts]: /docs/about/concepts +[docs.setup.quickstart]: /docs/setup/quickstart +[unit_tests]: /guides/level-up/unit-testing +[wasm_guide]: /guides/advanced/wasm-hello +{{< /requirement >}} + +In the [Hello, Wasm world][wasm_guide] guide we learned how to get started making our first WASM plugin. In this guide, we'll learn how to go farther with that skill by building a plugin that merges one long message split over multiple lines into a single log message. + +{{< success title="Goals" >}} +In this guide you'll learn how to: + +* Maintain state between events. +* Merge messages and perform string interpolation. +* Build a native Rust test suite. +* Build a Vector test suite. +{{< /success >}} + +## Our mock ticket + +Our pretend boss assigned us a new issue! It says we need to turn these 4 messages: + +```json title="input.ndjson" + { "vector": "one tool for all your observability needs", + "version": "0.10.0" } +{ "vic": + "the flying squirrel" } +``` + +Into these two: + +```json +{ "vector": "one tool for all your observability needs", "version": "0.10.0" } +{ "vic": "the flying squirrel" } +``` + +Such drudgery 🙄! Oh well, some input feeding us junk *does* mean we get to write Rust! + +In order to make it work, we'll need to: + +* Accept *n* messages as input, storing them concatenated together inside some state. +* Determine after each input if the new state is parseable JSON. +* If the state is valid JSON, output it. + +This sounds fun, so let's get started! + +## Building a workspace + +Let's start from scratch: + +```bash +PLUGIN_NAME=banana +cargo init --lib ${PLUGIN_NAME} +cd ${PLUGIN_NAME} +``` + +Next, add the following content, setting the crate up as a `cdylib` and adding some important libraries: + +```toml title="Cargo.toml" +[lib] +crate-type = ["cdylib"] + +[dependencies] +vector-wasm = { version = "0.1", git = "https://github.com/timberio/vector/"} +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +anyhow = "1.0" +``` + +{{< info >}} +For now, we use `serde_json` for (de)serializing FFI messaging. This will change in a future version. +{{< /info >}} + + +Now, scaffold out the minimal structure of the crate, this one does nothing, it just passes data on: + +```rust title="src/main.rs" +#![deny(improper_ctypes)] +use std::convert::TryInto; +use vector_wasm::{hostcall, Registration, Role}; + +/// Perform one time initialization and registration. +/// +/// During this time Vector and the plugin can validate that they can indeed work together, +/// do any one-time initialization, or validate configuration settings. +/// +/// It's required that the plugin call [`vector_wasm::Registration::register`] before returning. +#[no_mangle] +pub extern "C" fn init() { + // Vector provides you with a [`vector_wasm::WasmModuleConfig`] to validate for yourself. + let config = hostcall::config().unwrap(); + assert_eq!(config.role, Role::Transform); + + // Finally, pass Vector a [`vector_wasm::Registration`] + Registration::transform().register().unwrap(); +} + +/// Process data starting from a given point in memory to another point. +/// +/// It's not necessary for the plugin to actually read, or parse this data. +/// +/// Call [`vector_wasm::hostcall::emit`] to emit a message out. +/// +/// # Returns +/// +/// This function should return the number of emitted messages. +#[no_mangle] +pub extern "C" fn process(data: u32, length: u32) -> u32 { + // Vector allocates a chunk of memory through the hostcall interface. + // You can view the data as a slice of bytes. + let data = unsafe { + std::ptr::slice_from_raw_parts_mut(data as *mut u8, length.try_into().unwrap()) + .as_mut() + .unwrap() + }; + hostcall::emit(data).unwrap(); + + // Hint to Vector how many events you emitted. + 1 +} + +/// Perform one-time optional shutdown events. +/// +/// **Note:** There is no guarantee this function will be called before shutdown, +/// as we may be forcibly killed. +#[no_mangle] +pub extern "C" fn shutdown() {} +``` + +Let's review what we've written quickly: + +* We defined 3 functions, `init`, `process`, and `shutdown` (with `#[no_mangle]`). These are the same as the `lua` v2 transform. +* In the `init` function, we called `Registration::register`, registering with the host. +* In the `process` function, we called `hostcall::emit` to emit events farther through the pipeline. +* We called some `unsafe` code that read from `data` with `length` as a byte array. + +Before going farther, make sure it works (natively and in WASM!): + +```bash +cargo build +cargo build --target wasm32-wasi +``` + +## Writing Code + +In our example we don't need to concern ourselves with the `init()` and `shutdown()` functions. Those are already set up +for us. + +{{< info >}} +In the [*Hello, WASM World*][wasm_guide] we used a test plugin called `add_fields` from Vector that did some +set up in `init`. + +[wasm_guide]: /guides/advanced/wasm-hello +{{< /info >}} + +## `process` + +Each time the `process` function is called, a new event is arriving at the transform. In the `process` function, we get +a pointer to some data, and the length of it. From there, we can decide what we want to do. + +Since Vector always gives us a correctly structured JSON representation of the `Event`, we first need to parse that, and +extract our partial message. + +We can take the pointer and length as a slice of `u8` values, we can then parse that into a `serde_json::Value`: + +```rust +let data = unsafe { + std::ptr::slice_from_raw_parts_mut(data as *mut u8, length.try_into().unwrap()) + .as_mut() + .unwrap() +}; +let value: serde_json::Value = serde_json::de::from_slice(data).unwrap(); +``` + +From this event, we need to take out the message, containing the partially complete JSON: + +```rust +let message_field = value.get("message").and_then(serde_json::Value::as_str) + .unwrap_or(Default::default()); // Fall back to empty. +``` + +Next, we'll need to introduce some mutable state. We can use a `std::sync::Mutex` and a `once_cell::sync::Lazy` for this. + +**In your global scope at the top of the file, add these.** + +```rust +// A value which is initialized on the first access. +use once_cell::sync::Lazy; +// A mutual exclusion primitive useful for protecting shared data +use std::sync::Mutex; + +// The working state of the string which represents a partial JSON. +static STATE: Lazy> = Lazy::new(|| Mutex::new(String::new())); +``` + +We'll be able to lock, and then mutate, this `STATE`, gradually building it up. + +Back over in the `process` function, let's sketch out an API that's semantically meaningful and testable. + +```rust +match transform(&mut *STATE.lock().unwrap(), message_field) { + Ok(Some(value)) => { + let value_string = value.to_string(); + hostcall::emit(value_string.into_bytes()).unwrap(); + 1 + }, + Ok(None) => 0, + Err(e) => { + // This is an unexpected error. The state will be reset. + hostcall::raise(e).unwrap(); + 0 + }, +} +``` + +This means we can go write all our plugin-specific code in a function called `transform` that takes a mutable borrow +of the state, and an immutable view of the new arrival. If the `transform` function returns a value with no error, we +emit it out of Vector. If it returns nothing, we presume it was only a partial of a JSON, and do nothing. If we get an +error, we just pass it up. + +Now it's time to write our main logic! + +```rust +fn transform(state: &mut String, arrival: impl AsRef) -> Result, Error> { + // Add the new arrival on. + state.push_str(&mut arrival.as_ref()); + + // Try to read from it using a "reader" non-destructively. + let mut working_state = state.clone(); + let de = serde_json::Deserializer::from_str(&working_state); + let mut de_stream = de.into_iter::(); + + let output = de_stream.next(); + match output { + Some(Ok(value)) if value.is_object() => { + let offset = de_stream.byte_offset(); + + let new_state = working_state.split_off(offset); + *state = new_state; + Ok(Some(value)) + }, + Some(Ok(value)) => { + // This is an unexpected error. The most we can do is report it and clear our state. + state.clear(); + Err(anyhow::anyhow!("Was provided {}, not an object", value)) + } + Some(Err(e)) if e.is_eof() => { + // Not an error, keep going! + Ok(None) + }, + None => { + // Not an error, keep going! + Ok(None) + } + Some(Err(e)) => { + // This is an unexpected error. The most we can do is report it and clear our state. + state.clear(); + Err(e.into()) + }, + } +} +``` + +Since we cleverly created a new function which returns a `Result` we can use the `?` operator inside, allowing us to +easily bubble up errors. + +We also structured our function for **testability**. Since the `transform` function doesn't have side effects +(it takes in a mutable state, instead of directly mutating `STATE`) we can more easily test it for correctness. + +At this point you should try `cargo check` or `cargo build` to see if our code builds! + +{{< info >}} +There's a full, buildable copy of the code at the bottom of this page. +{{< /info >}} + +### Testing (Rust) + +For our module, we're actually going to do two phases of testing. + +You might have noticed that in our effort to create a partial JSON parser Wasm plugin we also inadvertently created a +native one. + +{{< warning >}} +*Whoops.* Guess we'll just have to use it for testing. 🙄 +{{< /warning >}} + +Let's create both a test module, and our first test like so: + +```rust +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn single() -> Result<(), Error> { + let expected = serde_json::json!({ + "foo": "bar", + }); + let mut working_buffer = String::from(""); + + let out_result = transform( + &mut working_buffer, + &r#"{ "foo": "bar" }"#, + ); + + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_some()); + let out_json = out_option.unwrap(); + assert_eq!(out_json, expected); + Ok(()) + } +} +``` + +Try to write a few more! + +These tests are excellent for making sure that our `transform` works as expected, but you've probably noticed +that there's some code we're not testing, and we're not really testing it inside Vector, either. + +Let's solve that next! First though, we need to build our `wasm` plugin. + +```bash +cargo build --release --target wasm32-wasi +``` + +Our new module is now located at `target/wasm32-wasi/release/${PLUGIN_NAME}.wasm`. + +### Testing (Vector) + +As you may recall from the [Unit Testing Guide][unit_test]s, Vector supports testing configurations right out of the box. +We'll use this to test our new Wasm plugin. + +{{< info >}} +Review the [Hello, Wasm world!][wasm_guide] guide if you need a refresher on how to get a `wasm` compatible Vector during the experimental phase. + +[wasm_guide]: /guides/advanced/wasm-hello +{{< /info >}} + +Using your Wasm-capable Vector, create a configuration, adding the plugin name as appropriate: + +```toml title="${PLUGIN_NAME}.toml" +data_dir = "/var/lib/vector/" + +[sources.source0] + max_length = 102400 + type = "stdin" + +[transforms.transform0] + inputs = ["source0"] + type = "wasm" + module = "target/wasm32-wasi/release/${PLUGIN_NAME}.wasm" + artifact_cache = "tmp" + +[sinks.sink0] + healthcheck = true + inputs = ["transform0"] + type = "console" + encoding = "json" + buffer.type = "memory" + buffer.max_events = 500 + buffer.when_full = "block" +``` + +Then, using your Wasm-capable Vector build take it for a test drive: + +```bash +ana@autonoma:~/git/timberio/banana$ ../vector/target/release/vector --config banana.toml +Aug 25 10:29:19.705 INFO vector: Log level "info" is enabled. +Aug 25 10:29:19.706 INFO vector: Loading configs. path=["banana.toml"] +Aug 25 10:29:19.708 INFO vector: Vector is starting. version="0.11.0" git_version="v0.9.0-530-g1b9eadd" released="Mon, 17 Aug 2020 20:48:21 +0000" arch="x86_64" +Aug 25 10:29:19.708 INFO vector::sources::stdin: Capturing STDIN. +Aug 25 10:29:19.708 INFO vector::internal_events::wasm::compilation: WASM Compilation via `lucet` state="beginning" role="transform" +Aug 25 10:29:19.708 INFO vector::internal_events::wasm::compilation: WASM Compilation via `lucet` state="cached" role="transform" +Aug 25 10:29:19.708 INFO vector::topology: Running healthchecks. +Aug 25 10:29:19.708 INFO vector::topology: Starting source "source0" +Aug 25 10:29:19.708 INFO vector::topology: Starting transform "transform0" +Aug 25 10:29:19.708 INFO vector::topology: Starting sink "sink0" +Aug 25 10:29:19.708 INFO vector::topology::builder: Healthcheck: Passed. +{ "foo": "bar" } +{"foo":"bar"} +123 +Aug 25 10:29:29.478 ERROR transform{name=transform0 type=wasm}: vector::wasm: WASM plugin errored: Was provided 123, not an object +{ "foo": +"bar" } +{"foo":"bar"} +Aug 25 10:29:38.135 INFO vector::shutdown: All sources have finished. +Aug 25 10:29:38.135 INFO source{name=source0 type=stdin}: vector::sources::stdin: finished sending +Aug 25 10:29:38.135 INFO vector: Shutting down. +``` + +Good enough to start. + +Before you go and deploy it, give it a more thorough testing, try using a `file/wasm/file` pipeline and checking +to make sure the results are your expectation. Try to also think of some potential issues! + +When you have some ideas of what to test, you can add a new behavior test to Vector: + +```toml +[[tests]] + name = "test" + + [[tests.inputs]] + insert_at = "transform0" + type = "log" + log_fields.message = "{ \"foo\":" + + [[tests.inputs]] + insert_at = "transform0" + type = "log" + log_fields.message = "\"bar\" }" + + [[tests.outputs]] + extract_from = "transform0" + + [[tests.outputs.conditions]] + "foo.equals" = "bar" +``` + +Running the test: + +```bash +ana@autonoma:~/git/timberio/banana$ ../vector/target/release/vector test banana.toml +Aug 25 10:49:42.370 INFO vector: Log level "info" is enabled. +Running banana.toml tests +Aug 25 10:49:42.374 INFO vector::internal_events::wasm::compilation: WASM Compilation via `lucet` state="beginning" role="transform" +Aug 25 10:49:42.374 INFO vector::internal_events::wasm::compilation: WASM Compilation via `lucet` state="cached" role="transform" +test banana.toml: test ... passed +``` + +Perfect! Great job! + +## Next steps + +You may have noticed, the plugin we made does not persist `timestamp` or `host` keys. Our plugin also doesn't support +any options, such as changing the key to parse from, or the key to save to. + +These would be great next steps, but you are free to soar as you please! 🐦 + +## Worked example + +```rust title="src/main.rs" +#![deny(improper_ctypes)] +use std::{convert::TryInto, sync::Mutex}; +use once_cell::sync::Lazy; +use vector_wasm::{hostcall, Registration, Role}; +use anyhow::Error; + +static STATE: Lazy> = Lazy::new(|| Mutex::new(String::new())); + +/// Perform one time initialization and registration. +/// +/// During this time Vector and the plugin can validate that they can indeed work together, +/// do any one-time initialization, or validate configuration settings. +/// +/// It's required that the plugin call [`vector_wasm::Registration::register`] before returning. +#[no_mangle] +pub extern "C" fn init() { + // Vector provides you with a [`vector_wasm::WasmModuleConfig`] to validate for yourself. + let config = hostcall::config().unwrap(); + assert_eq!(config.role, Role::Transform); + + // Finally, pass Vector a [`vector_wasm::Registration`] + Registration::transform().register().unwrap(); +} + +/// Process data starting from a given point in memory to another point. +/// +/// It's not necessary for the plugin to actually read, or parse this data. +/// +/// Call [`vector_wasm::hostcall::emit`] to emit a message out. +/// +/// # Returns +/// +/// This function should return the number of emitted messages. +#[no_mangle] +pub extern "C" fn process(data: u32, length: u32) -> u32 { + // Vector allocates a chunk of memory through the hostcall interface. + // You can view the data as a slice of bytes. + let data = unsafe { + std::ptr::slice_from_raw_parts_mut(data as *mut u8, length.try_into().unwrap()) + .as_mut() + .unwrap() + }; + let value: serde_json::Value = serde_json::de::from_slice(data).unwrap(); + + let message_field = value.get("message").and_then(serde_json::Value::as_str) + .unwrap_or(Default::default()); // Fall back to empty. + match transform(&mut *STATE.lock().unwrap(), message_field) { + Ok(Some(value)) => { + let value_string = value.to_string(); + hostcall::emit(value_string.into_bytes()).unwrap(); + 1 + }, + Ok(None) => 0, + Err(e) => { + // This is an unexpected error. The most we can do is report it and clear our state. + hostcall::raise(e).unwrap(); + 0 + }, + } +} + +/// Perform one-time optional shutdown events. +/// +/// **Note:** There is no guarantee this function will be called before shutdown, +/// as we may be forcibly killed. +#[no_mangle] +pub extern "C" fn shutdown() {} + +fn transform(state: &mut String, arrival: impl AsRef) -> Result, Error> { + // Add the new arrival on. + state.push_str(&mut arrival.as_ref()); + + // Try to read from it using a "reader" non-destructively. + let mut working_state = state.clone(); + let de = serde_json::Deserializer::from_str(&working_state); + let mut de_stream = de.into_iter::(); + + let output = de_stream.next(); + match output { + Some(Ok(value)) if value.is_object() => { + let offset = de_stream.byte_offset(); + + let new_state = working_state.split_off(offset); + *state = new_state; + Ok(Some(value)) + }, + Some(Ok(value)) => { + // This is an unexpected error. The most we can do is report it and clear our state. + state.clear(); + Err(anyhow::anyhow!("Was provided {}, not an object", value)) + } + Some(Err(e)) if e.is_eof() => { + // Not an error, keep going! + Ok(None) + }, + None => { + // Not an error, keep going! + Ok(None) + } + Some(Err(e)) => { + // This is an unexpected error. The most we can do is report it and clear our state. + state.clear(); + Err(e.into()) + }, + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn single() -> Result<(), Error> { + let expected = serde_json::json!({ + "foo": "bar", + }); + let mut working_buffer = String::from(""); + + let out_result = transform( + &mut working_buffer, + &r#"{ "foo": "bar" }"#, + ); + + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_some()); + let out_json = out_option.unwrap(); + assert_eq!(out_json, expected); + Ok(()) + } + + #[test] + fn errors() -> Result<(), Error> { + let mut working_buffer = String::from(""); + + let out_result = transform( + &mut working_buffer, + &r#"{ "foo" }"#, + ); + assert!(out_result.is_err()); + Ok(()) + } + + #[test] + fn double() -> Result<(), Error> { + let expected = serde_json::json!({ + "foo": "bar", + }); + let mut working_buffer = String::from(""); + + let out_result = transform( + &mut working_buffer, + &r#"{ "foo":"#, + ); + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_none()); + + let out_result = transform( + &mut working_buffer, + &r#""bar" }"#, + ); + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_some()); + let out_json = out_option.unwrap(); + assert_eq!(out_json, expected); + + Ok(()) + } + + #[test] + fn multiple_expected() -> Result<(), Error> { + let expected = serde_json::json!({ + "foo": "bar", + }); + let mut working_buffer = String::from(""); + + let out_result = transform( + &mut working_buffer, + &r#"{ "foo":"#, + ); + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_none()); + + let out_result = transform( + &mut working_buffer, + &r#""bar" }"#, + ); + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_some()); + let out_json = out_option.unwrap(); + assert_eq!(out_json, expected); + + let expected = serde_json::json!({ + "baz": "bean", + }); + + let out_result = transform( + &mut working_buffer, + &r#"{ "baz":"#, + ); + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_none()); + + let out_result = transform( + &mut working_buffer, + &r#""bean" }"#, + ); + assert!(out_result.is_ok()); + let out_option = out_result?; + assert!(out_option.is_some()); + let out_json = out_option.unwrap(); + assert_eq!(out_json, expected); + + Ok(()) + } +} +``` + +[unit_tests]: /guides/advanced/unit-testing +[wasm_guide]: /guides/advanced/wasm-hello diff --git a/docs/content/en/guides/level-up/_index.md b/docs/content/en/guides/level-up/_index.md new file mode 100644 index 0000000000000..aab25611148e2 --- /dev/null +++ b/docs/content/en/guides/level-up/_index.md @@ -0,0 +1,6 @@ +--- +title: Level up +description: Go from Vector beginner to pro! Everything you need to use Vector confidently. +weight: 3 +tags: ["level up", "guides", "guide"] +--- diff --git a/docs/content/en/guides/level-up/managing-complex-configs.md b/docs/content/en/guides/level-up/managing-complex-configs.md new file mode 100644 index 0000000000000..a0f2e9f2be2e8 --- /dev/null +++ b/docs/content/en/guides/level-up/managing-complex-configs.md @@ -0,0 +1,194 @@ +--- +title: Building and Managing Complex Configs +description: Strategies for building and managing complex Vector configs +author_github: https://github.com/Jeffail +domain: config +weight: 3 +tags: ["configuration", "config", "level up", "guides", "guide"] +aliases: ["/docs/setup/guides/advanced-configs"] +--- + +{{< requirement >}} +Before you begin, this guide assumes the following: + +* You understand the [basic Vector concepts][docs.about.concepts] +* You understand [how to set up a basic pipeline][docs.setup.quickstart]. + +[docs.about.concepts]: /docs/about/concepts +[docs.setup.quickstart]: /docs/setup/quickstart +{{< /requirement >}} + +Writing large configuration files is not yet an official olympic event. However, +it's still a good idea to get yourself ahead of the competition. In this guide +we're going to cover some tips and tricks that will help you write clear, bug +free Vector configs that are easy to maintain. + +## Generating Configs + +In Vector each component of a pipeline specifies which components it consumes +events from. This makes it very easy to build multiplexed topologies. However, +writing a chain of transforms this way can sometimes be frustrating as the +number of transforms increases. + +Luckily, the Vector team are desperate for your approval and have worked hard to +mitigate this with the `generate` subcommand, which can be used to generate the +boilerplate for you. The command expects a list of components, where it then +creates a config with all of those components connected in a linear chain. + +For example, if we wished to create a chain of three transforms; `json_parser`, +`add_fields`, and `remove_fields`, we can run: + +```bash +vector generate /json_parser,add_fields,remove_fields > vector.toml +# Find out more with `vector generate --help` +``` + +And most of the boilerplate will be written for us, with each component printed +with an `inputs` field that specifies the component before it: + +```toml title="vector.toml" +[transforms.transform0] + inputs = [ "somewhere" ] + type = "json_parser" + # etc ... + +[transforms.transform1] + inputs = [ "transform0" ] + type = "add_fields" + # etc ... + +[transforms.transform2] + inputs = [ "transform1" ] + type = "remove_fields" + # etc ... +``` + +The names of the generated components are sequential (`transform0`, +`transform1`, and so on). It's therefore worth doing a search and replace with +your editor to give them better names, e.g. `s/transform2/scrub_emails/g`. + +## Testing Configs + +Test driven Configurationn is a paradigm we just made up, so there's still time +for you to adopt it _before_ it's cool. Vector supports complementing your +configs with [unit tests][guides.unit-testing], and as it turns out +they're also pretty useful during the building stage. + +Let's imagine we are in the process of building the config from the [unit test +guide][guides.unit-testing], we might start off with our source and +the grok parser: + +```toml title="vector.toml" +[sources.over_tcp] + type = "socket" + mode = "tcp" + address = "0.0.0.0:9000" + +[transforms.foo] + type = "grok_parser" + inputs = ["over_tcp"] + pattern = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" +``` + +A common way to test this transform might be to temporarily change the source +into a `stdin` type, add a `console` sink pointed to our target transform, and +run it with some sample data. However, this is awkward as it means distorting +our config to run tests rather than focusing on features. + +Instead, we can leave our source as a `socket` type and add a unit test to the +end of our config: + +```toml title="vector.toml" +[[tests]] + name = "check_simple_log" + + [[tests.inputs]] + insert_at = "foo" + type = "raw" + value = "2019-11-28T12:00:00+00:00 info Sorry, I'm busy this week Cecil" + + [[tests.outputs]] + extract_from = "foo" +``` + +When we add a unit test output without any conditions it will simply print the +input and output events of a transform, allowing us to inspect its behavior: + +```sh +$ vector test ./vector.toml +Running vector.toml tests +test vector.toml: check_simple_log ... passed + +inspections: + +--- vector.toml --- + +test 'check_simple_log': + +check transform 'foo' payloads (events encoded as JSON): + input: {"timestamp":"2020-02-11T15:04:02.361999Z", "message":"2019-11-28T12:00:00+00:00 info Sorry, I'm busy this week Cecil"} + output: {"level":"info","message":"Sorry, I'm busy this week Cecil", "timestamp":"2019-11-28T12:00:00+00:00"} +``` + +As we introduce new transforms to our config we can change the test output +to check the latest transform. Or, occasionally, we can add conditions to an +output in order to turn it into a regression test: + +```toml title="vector.toml" +[[tests]] + name = "check_simple_log" + + [[tests.inputs]] + insert_at = "foo" + type = "raw" + value = "2019-11-28T12:00:00+00:00 info Sorry, I'm busy this week Cecil" + + # This is now a regression test + [[tests.outputs]] + extract_from = "foo" + [[tests.outputs.conditions]] + type = "check_fields" + "message.equals" = "Sorry, I'm busy this week Cecil" + + # And we add a new output without conditions for inspecting + # a new transform + [[tests.outputs]] + extract_from = "bar" +``` + +How many tests you add is at your discretion, but you probably don't need to +test every single transform. We recommend every four transforms, except during a +full moon when you should test every two just to be sure. + +## Organizing Configs + +Building configs is only the beginning. Once it's built you need to make sure +pesky meddlers don't ruin it. The best way to keep on top of that is to break +large configs down into smaller more manageable pieces. + +With Vector you can split a config down into as many files as you like and run +them all as a larger topology: + +```bash +# These three examples run the same two configs together: +vector -c ./configs/foo.toml -c ./configs/bar.toml +vector -c ./configs/*.toml +vector -c ./configs/foo.toml ./configs/bar.toml +``` + +If you have a large chain of components it's a good idea to break them out into +individual files, each with its own unit tests. + +## Updating Configs + +Sometimes it's useful to update Vector configs on the fly. If you find yourself +tinkering with a config that Vector is already running you can prompt it to +reload the changes you've made by sending it a `SIGHUP` signal. + +If you're running Vector in environments where it's not possible to issue +`SIGHUP` signals you can instead run it with the `--watch-config` flag and it'll +automatically gobble up changes whenever the file is written to. + +[docs.about.concepts]: /docs/about/concepts/ +[docs.setup.quickstart]: /docs/setup/quickstart/ +[guides.unit-testing]: /guides/level-up/unit-testing/ diff --git a/docs/content/en/guides/level-up/managing-schemas.md b/docs/content/en/guides/level-up/managing-schemas.md new file mode 100644 index 0000000000000..b1d7168824738 --- /dev/null +++ b/docs/content/en/guides/level-up/managing-schemas.md @@ -0,0 +1,344 @@ +--- +title: Encoding, Decoding, and Managing Schemas +short: Schemas +description: Learn how to manage log schemas with Vector. +author_github: https://github.com/hoverbear +domain: schemas +weight: 2 +tags: ["schemas", "schema management", "logs", "level up", "guides", "guide"] +--- + +{{< requirement >}} +Before you begin, this guide assumes the following: + +* You understand the [basic Vector concepts][docs.about.concepts] +* You understand [how to set up a basic pipeline][docs.setup.quickstart]. + +[docs.about.concepts]: /docs/about/concepts/ +[docs.setup.quickstart]: /docs/setup/quickstart/ +{{< /requirement >}} + +Data comes in all shapes and sizes. Vector has an array (let's call it a vector 😎) of composable functionality for +decoding your events in the right format, transforming them into the right shape, and passing that data on downstream. + +While your first uses of Vector might be connecting `stdin` to `honeycomb`, eventually you're going to have other +requirements. Maybe regional laws prevent you from shipping certain data, or you need to do some data mudging to conform +some logs to the rest of your system. With a little configuration we can teach Vector to solve all these problems! + +## Overriding Global Field Names + +By default, Vector primarily operates on three fields: `host`, `message`, and `timestamp`. + +```json +{ + "host": "my.host.com", + "message": "some important content", + "timestamp": "2019-11-01T21:15:47+00:00" +} +``` + +Vector sets these fields on logs as it ingests data (from a [source][docs.sources]). It may be that your data does not +follow this convention. In this case you can modify the global defaults for all incoming data in the `log_schema` +section of your `vector.toml`. + +```toml title="vector.toml" +[log_schema] +host_key = "instance" # default "host" +message_key = "info" # default "message" +timestamp_key = "datetime" # default "timestamp" + +# Sources, transforms, and sinks... +``` + +{{< warning >}} +Not all sources use the `host` field. +{{< /warning >}} + +We find this feature is useful when used with simple configs! As your number of components grows, your needs will change +and you'll likely need to configure this at a more fine grained level. + + +### Example: Custom timestamp field + +Some services will produce logs with the timestamp field mapped to `@timestamp` or some other value. + +If your vector pipeline is only working with data passing through these systems, you can add the following to your +`vector.toml`: + +```toml title="vector.toml" +[log_schema] + timestamp_key = "@timestamp" # Applies to all sources, sinks, and transforms! + +[sources.my_naming_confused_source] + type = "logplex" + address = "0.0.0.0:8088" +``` + + +## Pipeline field filtering + +Sometimes it is advantageous to filter out specific fields during the pipeline. You can use a `remap` transform +to do this. + +Commonly you'll want to do this near either the source or sink of your pipeline. Some example use cases: + +* Dropping `email`, `passport_number`, or other personally identifiable information from logs before distributing them + to third party services. +* Filtering data for compliance with the GDPR or other regional laws. (eg EU to US dataflows) +* Reducing the volume of data on a particular endpoint. + +A transform of this type looks like this: + +```toml title="vector.toml" +[transforms.strip_personal_details] +type = "remap" +inputs = ["my-source-id"] +source = ''' + del(.email, .passport_number) +''' +``` + +The `remap` transform has a wealth of mapping functions, and in cases where we wish to flip this concept and drop all fields except for a list of exceptions we can do that with the `only_fields` function: + +```toml title="vector.toml" +[transforms.strip_personal_details] +type = "remap" +inputs = ["my-source-id"] +source = ''' + only_fields(.timestamp, .message, .host, .user_id) +''' +``` + +### Example: Filtering data for GDPR compliance + +Let's pretend we have a nice well behaved application piping Vector logs like the following: + +```json +{ "id": "user1", "gdpr": false, "email": "us-user1@timber.io" } +{ "id": "user2", "gdpr": false, "email": "us-user2@timber.io" } +{ "id": "user3", "gdpr": true, "email": "eu-user3@timber.io" } +``` + +In our theoretical product, we're expanding into the EU and want to comply with the GDPR. In our case, that means our +application can't send EU user data to our US based kafka. (We're not lawyers, this is not a magic GDPR-compliance +config, just a little example!) + +We can build a config that will do the first part of this, but we'll just output to console for ease of this example. + +```toml title="vector.toml" +data_dir = "./data" +dns_servers = [] + +[sources.application] +max_length = 102400 +type = "stdin" + +[transforms.parse] +inputs = ["application"] +drop_field = true +drop_invalid = false +type = "json_parser" + +[transforms.not_gdpr] +type = "filter" +inputs = ["parse"] +condition.type = "check_fields" +condition."gdpr.eq" = "false" + +[transforms.gdpr_to_strip] +type = "filter" +inputs = ["parse"] +condition.type = "check_fields" +condition."gdpr.eq" = "true" + +[transforms.gdpr_stripped] +type = "remap" +inputs = ["gdpr_to_strip"] +source = "del(.email)" + +[sinks.console] +healthcheck = true +inputs = ["not_gdpr", "gdpr_stripped"] +type = "console" +encoding = "json" +[sinks.console.buffer] +type = "memory" +max_events = 500 +when_full = "block" +``` + +Let's have a look: + +```bash +$ cat <<-EOF | cargo run -- --config test.toml +{ "id": "user1", "gdpr": false, "email": "us-user1@timber.io" } +{ "id": "user2", "gdpr": false, "email": "us-user2@timber.io" } +{ "id": "user3", "gdpr": true, "email": "eu-user3@timber.io" } +EOF +Feb 05 16:13:59.241 INFO source{name=application type=stdin}: vector::sources::stdin: finished sending +{"id":"user1","timestamp":"2020-02-06T00:13:59.241801798Z","host":"obsidian","email":"us-user1@timber.io","gdpr":false} +{"gdpr":false,"host":"obsidian","email":"us-user2@timber.io","timestamp":"2020-02-06T00:13:59.241815255Z","id":"user2"} +{"id":"user3","gdpr":true,"host":"obsidian","timestamp":"2020-02-06T00:13:59.241816010Z"} +Feb 05 16:15:27.945 INFO vector: Shutting down. +``` + +Don't know where events are coming from? You can use the `geoip` transform an `ipv4` field and get a grip on that! + + +## Sink field filtering + +While it's often reasonable to remove this kind of data at the pipeline level, we identified use cases that involve +using values in sinks from these fields in sink configuration. + +The applications for this include some of the reasons discussed in +[Pipeline field filtering](#pipeline-field-filtering), but also: + +* Stripping off routing related fields +* Ensuring a specific sink will only ever output specific fields (or never output certain fields) + + +### Example: Per host kafka topics + +Lets take a look at what that might look like: + +```toml title="vector.toml" +[sinks.output] + inputs = ["demo"] + type = "kafka" + + # Put events in the host specific topic. + topic = "{{service}}" + encoding.except_fields = ["service"] # Remove this field now and save some bytes + # ... +``` + +{{< warning >}} +Beware: not all fields are templatable! Make sure to check the documentation and test before deploying. If you find +a field which you want templatable open an issue and let us know. +{{< /warning >}} + +## Moving and Concatenating Fields + +It's fairly common for one part of your pipeline to expect a field to be named differently than another part! The `remap` transform can also be used to slide data around for you. + +```toml title="vector.toml" +[transforms.rename_timestamp] + type = "remap" + inputs = ["source0"] + source = ''' + ."@timestamp" = .timestamp + del(.timestamp) + ''' +``` + +Other times you might need to concatenate fields together, or perform arithmetic on their numerical values, the [`remap`][docs.transforms.remap] transform can be used to do all of these things. + +It's useful for when: + +* You need to adapt or reshape data to fit into possibly older or newer systems. +* You need to concatenate `first_name` and `last_name` into a `name` field. (Suppose they didn't read + [Falsehoods about names](https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)). + + +### Example: Mooshing together name fields + +Let's pretend one of your teammates falsely assumed folks always have first and last names, so we have a `first_name` +and a `last_name` field coming from a source, and we'd like to output a `name` field to a sink. + +```toml title="vector.toml" +[transforms.moosh_names] + type = "remap" + inputs = ["source0"] + source = ''' + .name = .first_name + " " + .last_name + del(.first_name, .last_name) + ''' +``` + +{{< info >}} +What if you had to do this in reverse? Try using the [`regex_parser`][docs.transforms.regex_parser] or +[`split`][docs.transforms.split] transforms. + +[docs.transforms.regex_parser]: /docs/reference/vrl/functions/#parse_regex +[docs.transforms.split]: /docs/reference/vrl/functions/#split +{{< /info >}} + +## Coercing Data Types + +Occasionally services will provide you with data that is in the right shape, but the types are wrong. Perhaps a string +should be a number, or vice versa. + +Gadzooks! The [`remap`][docs.transforms.remap] transform is also the correct tool for this job! + +```toml title="vector.toml" +[transforms.correct_source_types] + type = "remap" + inputs = ["source0"] + source = ''' + .count = int(.count) + .date = timestamp(.date, "%F") + ''' +``` + +Remember that you can follow the coercion mappings with `del` or `only_fields` functions, empowering it to drop +fields you've not specified. Coercer? More like enforcer. + +### Example: Coercing into a specific format + +There are a lot of ways to represent time. In the US folks tend to use `MM/DD/YYYY` or the (more reasonable) +`YYYY/MM/DD` which Canada and China like. In the EU, South America, and Africa they prefer `DD/MM/YYYY`. Like personal +identities, all are valid. Vector lets us take in timestamps and output specific formats easily. + +To do this we'll use the `timestamp` function with a format string argument. To build a format string, we can reference the +[`strftime`](https://docs.rs/chrono/0.4.10/chrono/format/strftime/index.html) documentation. Let's ship some Canadian +friendly logs up to the great white north! + +```toml title="vector.toml" +[transforms.format_timestamp] + type = "remap" + source = ''' + .timestamp = timestamp(.timestamp, "%Y/%m/%d:%H:%M:%S %z") + ''' +``` + +## Working with data formats + +Not all logs come structured. Some services provide JSON, some provide plaintext, others ship around protobufs. With +Vector you can handle them all. + +Generally Vector will be able to determine the encodings to use by the source or sink used. In some cases, multiple are +supported. In these cases, you can use the `encoding` option. + +The [`console`][docs.sinks.console] sink supports both `json` and `text` as its +output format + +```toml title="vector.toml" +[sinks.print] + type = "console" + inputs = ["source0"] + target = "stdout" + encoding = "json" +``` + +You can also use a transform like [`json_parser`][docs.transforms.json_parser] or +[`grok_parser`][docs.transforms.grok_parser] to parse out data in a given field. + +## Parting thoughts + +Exploring this article, we can see that Vector is able to consume multiple (even non-standard) formats of logs. We saw +that Vector can then reshape the data according to your needs. Then Vector can pass this data along. + +Let's consider some novel uses for Vector, given these tools! Vector can work as: + +* A sanitization tool, ensuring malformed events never reach a service. +* A privacy tool, removing sensitive data before it leaves your infrastructure. +* A data corrector, adapting legacy systems to more modern systems which have evolved. + +Where are you deploying Vector? Let us know, maybe we can help optimize it! + +[docs.sinks.console]: /docs/reference/configuration/sinks/console/ +[docs.sources]: /docs/reference/configuration/sources/ +[docs.transforms.grok_parser]: /docs/reference/vrl/functions/#parse_grok +[docs.transforms.json_parser]: /docs/reference/vrl/functions/#parse_json +[docs.transforms.remap]: /docs/reference/configuration/transforms/remap/ + diff --git a/docs/manual/setup/transformation.md b/docs/content/en/guides/level-up/transformation.md similarity index 60% rename from docs/manual/setup/transformation.md rename to docs/content/en/guides/level-up/transformation.md index 15c7ef33f1b2f..8a2b69d3148df 100644 --- a/docs/manual/setup/transformation.md +++ b/docs/content/en/guides/level-up/transformation.md @@ -1,24 +1,39 @@ --- -title: Transformation -description: Use Vector to transform observability data +title: Structuring, Shaping, and Transforming Data +short: Transforming +description: Use Vector to parse, structure, shape, and transform observability data +author_github: lucperkins +domain: processing +weight: 1 +tags: ["transform", "observability", "level up", "guides", "guide"] --- +{{< requirement >}} +Before you begin, this guide assumes the following: + +* You understand the [basic Vector concepts][concepts] +* You understand [how to set up a basic pipeline][pipeline] + +[concepts]: /docs/about/concepts +[pipeline]: /docs/setup/quickstart +{{< /requirement >}} + Vector provides multiple [transforms][docs.transforms] that you can use to modify your observability data as it passes through your Vector -[topology][docs.topology]. +[topology][docs.architecture.pipeline-model]. -The transform that you will likely use most often is the [`remap`][docs.remap] +The transform that you will likely use most often is the [`remap`][docs.transforms.remap] transform, which uses a single-purpose data transformation language called [Vector Remap Language][docs.vrl] (VRL for short) to define event transformation logic. VRL has several features that should make it your first choice for transforming data in Vector: * It offers a wide range of observability-data-specific - [functions][docs.vrl.funcs] that map directly to observability use cases. + [functions][docs.vrl.functions] that map directly to observability use cases. * It's built for the very specific use case of working with Vector logs and metrics, which means that it has no extraneous functionality, its data model - maps directly to Vector's internal data model, and its performance comes quite - close to native [Rust][urls.rust] performance. + maps directly to Vector's internal data model, and its performance is comparable + to native [Rust][urls.rust] performance. * The VRL compiler built into Vector performs several compile-time checks to ensure that your VRL code is sound, meaning no dead code, no unhandled errors, and no type mismatches. @@ -27,21 +42,16 @@ In cases where VRL doesn't fit your use case, Vector also offers two [runtime transforms](#runtime-transforms) that offer a bit more flexibility than VRL but also come with downsides (listed below) that should always be borne in mind. -> If your observability use case isn't covered by VRL, please feel *very* -> welcome to [open an issue][urls.issue] describing your use case. The Vector -> team will follow up with potential solutions and workarounds or, in some -> cases, updates to VRL that directly address your needs. - ## Transforming data using VRL Let's jump straight into an example of using VRL to modify some data. We'll create a simple topology consisting of three components: -1. A [`generator`][docs.generator] source produces random [Syslog][urls.syslog] +1. A [`generator`][docs.sources.generator] source produces random [Syslog][urls.syslog] messages at a rate of 10 per second. -2. A [`remap`][docs.remap] transform uses VRL to parse incoming Syslog lines +2. A [`remap`][docs.transforms.remap] transform uses VRL to parse incoming Syslog lines into named fields (`severity`, `timestamp`, etc.). -3. A [`console`][docs.console] sink pipes the output of the topology to stdout, +3. A [`console`][docs.sinks.console] sink pipes the output of the topology to stdout, so that we can see the results on the command line. This configuration defines that topology: @@ -66,8 +76,12 @@ This configuration defines that topology: encoding.codec = "json" ``` -> Although we're using [TOML][urls.toml] for the configuration here, Vector also -> supports JSON and YAML. +{{< info >}} +Although we're using [TOML][urls.toml] for the configuration here, Vector also +supports JSON and YAML. + +[urls.toml]: https://github.com/toml-lang/toml +{{< /info >}} To start Vector using this topology: @@ -100,25 +114,25 @@ transform to make some ad hoc transformations: type = "remap" inputs = ["logs"] source = ''' - . = parse_syslog!(.message) + . = parse_syslog!(.message) - # Convert the timestamp to a Unix timestamp, aborting on error - .timestamp = to_unix_timestamp!(.timestamp) + # Convert the timestamp to a Unix timestamp, aborting on error + .timestamp = to_unix_timestamp!(.timestamp) - # Remove the "facility" and "procid" fields - del(.facility); del(.procid) + # Remove the "facility" and "procid" fields + del(.facility); del(.procid) - # Replace the "msgid" field with a unique ID - .msgid = uuid_v4() + # Replace the "msgid" field with a unique ID + .msgid = uuid_v4() - # If the log message contains the phrase "Great Scott!", set the new field - # "critical" to true, otherwise set it to false. If the "contains" function - # errors, log the error (instead of aborting the script, as above). - if (is_critical, err = contains(.message, "Great Scott!"); err != null) { - log(err, level: "error") - } + # If the log message contains the phrase "Great Scott!", set the new field + # "critical" to true, otherwise set it to false. If the "contains" function + # errors, log the error (instead of aborting the script, as above). + if (is_critical, err = contains(.message, "Great Scott!"); err != null) { + log(err, level: "error") + } - .critical = is_critical + .critical = is_critical ''' ``` @@ -131,7 +145,7 @@ A few things to notice about this script: * VRL has language constructs like variables, `if` statements, comments, and logging. * The `.` acts as a sort of "container" for the event data. `.` by itself refers - to the root event, while you can use [paths][docs.vrl.paths] like `.foo`, + to the root event, while you can use [paths] like `.foo`, `.foo[0]`, `.foo.bar`, `.foo.bar[0]`, and so on to reference subfields, array indices, and more. @@ -154,9 +168,9 @@ And that's it! We've successfully created a Vector topology that transforms every event that passes through it. If you'd like to know more about VRL, we recommend checking out the following documentation: -* A full list listing of [VRL functions][docs.vrl.funcs] +* A full list listing of [VRL functions][docs.vrl.functions] * [VRL examples][docs.vrl.examples] -* The [VRL specification][docs.vrl.spec], which describes things VRL's syntax +* [VRL expressions][docs.vrl.expressions], which describes things VRL's syntax and type system in great detail ## Runtime transforms @@ -164,7 +178,7 @@ recommend checking out the following documentation: If VRL doesn't cover your use case—and that should happen rarely—Vector also offers two **runtime transforms** that you can use instead of VRL: -* The [`wasm`][docs.wasm] transform enables you to run compiled +* The [`wasm`][docs.transforms.wasm] transform enables you to run compiled [WebAssembly][urls.wasm] code using a Wasm runtime inside of Vector. * The [`lua`][docs.lua] transform enables you to run [Lua][urls.lua] code that you can include directly in your Vector configuration @@ -178,25 +192,25 @@ recommend using these transforms only when truly necessary, for several reasons: 2. Both require you to add a coding/testing/debugging workflow to using Vector, which is worth the effort if there's no other way to satisfy your use case but best avoided if possible. -3. Both impose a performance penalty vis-à-vis VRL. Wasm does tend to be faster - than Lua, but Wasm is more difficult to use given the need to add a +3. Both impose a performance penalty vis-à-vis VRL. Wasm *does* tend to be faster + than Lua, but Wasm is more difficult to use because you need to add a Wasm compilation step to your Vector workflow. -[docs.console]: /docs/reference/transforms/console -[docs.generator]: /docs/reference/transforms/generator -[docs.lua]: /docs/reference/transforms/lua -[docs.remap]: /docs/reference/transforms/remap -[docs.topology]: /docs/about/under-the-hood/architecture/topology-model -[docs.transforms]: /docs/reference/transforms +[docs.architecture.pipeline-model]: /docs/about/under-the-hood/architecture/pipeline-model/ +[docs.lua]: /docs/reference/configuration/transforms/lua/ +[docs.setup.quickstart]: /docs/setup/quickstart/ +[docs.sinks.console]: /docs/reference/configuration/sinks/console/ +[docs.sources.generator]: /docs/reference/configuration/sources/generator/ +[docs.transforms.remap]: /docs/reference/configuration/transforms/remap/ +[docs.transforms.wasm]: /docs/reference/configuration/transforms/wasm/ +[docs.transforms]: /docs/reference/configuration/transforms/ +[docs.vrl.examples]: /docs/reference/vrl/examples/ +[docs.vrl.expressions]: /docs/reference/vrl/expressions/ +[docs.vrl.functions]: /docs/reference/vrl/functions/ [docs.vrl]: /docs/reference/vrl -[docs.vrl.examples]: /docs/reference/vrl/examples -[docs.vrl.funcs]: /docs/reference/vrl/functions -[docs.vrl.paths]: /docs/reference/vrl/spec/#path -[docs.vrl.spec]: /docs/reference/vrl/spec -[docs.wasm]: /docs/reference/transforms/wasm -[urls.issue]: https://github.com/timberio/vector/issues/new?assignees=&labels=type%3A+enhancement&template=enhancement.md&title= +[paths]: /docs/reference/vrl/expressions/#path [urls.lua]: https://www.lua.org -[urls.rust]: https://rust-lang.org +[urls.new_feature_request]: https://github.com/timberio/vector/issues/new?labels=type%3A+new+feature +[urls.rust]: https://www.rust-lang.org/ [urls.syslog]: https://en.wikipedia.org/wiki/Syslog -[urls.toml]: https://toml.io -[urls.wasm]: https://webassembly.org +[urls.wasm]: https://webassembly.org/ diff --git a/docs/content/en/guides/level-up/troubleshooting.md b/docs/content/en/guides/level-up/troubleshooting.md new file mode 100644 index 0000000000000..e816157fce077 --- /dev/null +++ b/docs/content/en/guides/level-up/troubleshooting.md @@ -0,0 +1,115 @@ +--- +title: Troubleshooting +description: A guide to debugging and troubleshooting Vector +author_github: binarylogic +domain: operations +weight: 5 +tags: ["troubleshooting", "level up", "guides", "guide"] +--- + +This guide covers troubleshooting Vector. The sections are intended to be +followed in order. + +First, we're sorry to hear that you're having trouble with Vector! Reliability +and operator friendliness are _very_ important to us, and we urge you to +[open an issue][urls.new_bug_report] to let us know what's going on. This helps +us improve Vector. + +## 1. Check for any known issues + +Start by searching [Vector's issues][urls.vector_issues]. You can filter +to the specific component via the `label` filter. + +## 2. Check Vector's logs + +We've taken great care to ensure that Vector's logs are high quality and helpful. +In most cases the logs will surface the issue: + +{{< tabs default="Manual" >}} +{{< tab title="Manual" >}} +If you aren't using a service manager and you're redirecting Vector's output to a file, you can use +a utility like `tail` to access your logs: + +```shell +tail /var/log/vector.log +``` +{{< /tab >}} + +{{< tab title="Systemd" >}} +Tail logs: + +```shell +sudo journalctl -fu vector +``` +{{< /tab >}} + +{{< tab title="Initd" >}} +Tail logs: + +```shell +tail -f /var/log/vector.log +``` +{{< /tab >}} +{{< tab title="Homebrew" >}} +Tail logs: + +```shell +tail -f /usr/local/var/log/vector.log +``` +{{< /tab >}} +{{< /tabs >}} + +## 3. Enable backtraces + +{{< info >}} +You can skip to the [next section](#4-enable-debug-logging) if you don't +have an exception in your logs. +{{< /info >}} + +If you see an exception in Vector's logs then we've clearly found the issue. +Before you report a bug, please enable backtraces: + +```bash +RUST_BACKTRACE=full vector --config=/etc/vector/vector.toml +``` + +Backtraces are _critical_ for debugging errors. Once you have the backtrace +please [open a bug report issue][urls.new_bug_report]. + +## 4. Enable debug logging + +If you don't see an error in your Vector logs and the Vector logs appear +to be frozen, then you'll want to drop your log level to `debug`: + +{{< info >}} +Vector rate limits logs in the hot path. As a result, dropping to the +`debug` level is safe for production environments. +{{< /info >}} + +{{< tabs default="Env Var" >}} +{{< tab title="Env Var" >}} +```shell +LOG=debug vector --config=/etc/vector/vector.toml +``` +{{< /tab >}} +{{< tab title="Flag" >}} +```bash +vector --verbose --config=/etc/vector/vector.toml +``` +{{< /tab >}} +{{< /tabs >}} + +## 5. Get help + +At this point, we recommend reaching out to the community for help. + +1. If you've encountered a bug, please [file a bug report][urls.new_bug_report] + +2. If you've identified a missing feature, please [file a feature request][urls.new_feature_request]. + +3. If you need help, [join our chat community][urls.vector_chat]. You can post a question and search previous questions. + +[urls.new_bug_report]: https://github.com/timberio/vector/issues/new?labels=type%3A+bug +[urls.new_feature_request]: https://github.com/timberio/vector/issues/new?labels=type%3A+new+feature +[urls.vector_chat]: https://chat.vector.dev +[urls.vector_issues]: https://github.com/timberio/vector/issues diff --git a/docs/content/en/guides/level-up/unit-testing.md b/docs/content/en/guides/level-up/unit-testing.md new file mode 100644 index 0000000000000..2b3cc79b01b92 --- /dev/null +++ b/docs/content/en/guides/level-up/unit-testing.md @@ -0,0 +1,220 @@ +--- +title: Unit Testing Your Configs +description: Learn how to write and execute unit tests for your Vector configs +author_github: jeffail +domain: config +weight: 4 +tags: ["testing", "configs", "unit testing", "level up", "guides", "guide"] +--- + +{{< requirement >}} +Before you begin, this guide assumes the following: + +* You understand the [basic Vector concepts][concepts] +* You understand [how to set up a basic pipeline][pipeline] + +[concepts]: /docs/about/concepts +[pipeline]: /docs/setup/quickstart +{{< /requirement >}} + +You can define unit tests in a Vector configuration file that cover a network of +transforms within the topology. These tests help you develop configs containing +larger and more complex topologies and to improve their maintainability. + +The full spec can be found [here][docs.reference.configuration.tests]. This guide covers +writing and executing a unit test for the following config: + +```toml title="vector.toml" +[sources.over_tcp] + type = "socket" + mode = "tcp" + address = "0.0.0.0:9000" + +[transforms.foo] + type = "grok_parser" + inputs = ["over_tcp"] + pattern = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" + +[transforms.bar] + type = "add_fields" + inputs = ["foo"] + [transforms.bar.fields] + new_field = "this is a static value" + +[transforms.baz] + type = "remove_fields" + inputs = ["foo"] + fields = ["level"] + +[sinks.over_http] + type = "http" + inputs = ["baz"] + uri = "http://localhost:4195/post" + encoding = "text" +``` + +In this config we: + +* Parse a log line into the fields `timestamp`, `level` and `message` with the + transform `foo`. +* Add a static string field `new_field` using the transform `bar`. +* Remove the field `level` with the transform `baz`. + +In reality, it's unlikely that a config this simple would be worth the investment +of writing unit tests. Regardless, for the purpose of this guide we've concluded +that yes, we do wish to unit test this config. + +Specifically, we need to ensure that the resulting events of our topology +(whatever comes out of the `baz` transform) always meets the following +requirements: + +* Does *not* contain the field `level`. +* Contains the field `new_field`, with a static value `this is a static value`. +* Has a `timestamp` and `message` field containing the values extracted from the + raw message of the input log. + +Otherwise our system fails and an annoying relative (uncle Cecil) moves in to +live with us indefinitely. We will do _anything_ to prevent that. + +## Input + +First we shall write a single unit test at the bottom of our config called +`check_simple_log`. Each test must define input events (usually just one), which +initiates the test by injecting those events into a transform of the topology: + +```toml +[[tests]] + name = "check_simple_log" + + [[tests.inputs]] + insert_at = "foo" + type = "raw" + value = "2019-11-28T12:00:00+00:00 info Sorry, I'm busy this week Cecil" +``` + +Here we've specified that our test should begin by injecting an event at the +transform `foo`. The `raw` input type creates a log with only a `message` field +and `timestamp` (set to the time of the test), where `message` is populated with +the contents of the `value` field. + +## Outputs + +This test won't run in its current state because there's nothing to check. In +order to perform checks with this unit test we define an output to inspect: + +```toml +[[tests]] + name = "check_simple_log" + + [[tests.inputs]] + insert_at = "foo" + type = "raw" + value = "2019-11-28T12:00:00+00:00 info Sorry, I'm busy this week Cecil" + + [[tests.outputs]] + extract_from = "baz" + + [[tests.outputs.conditions]] + type = "check_fields" + "level.exists" = false + "new_field.equals" = "this is a static value" + "timestamp.equals" = "2019-11-28T12:00:00+00:00" + "message.equals" = "Sorry, I'm busy this week Cecil" +``` + +We can define any number of outputs for a test, and must specify at which +transform the output events should be extracted for checking. This allows us to +check the events from different transforms in a single test. For our purposes we +only need to check the output of `baz`. + +An output can also have any number of conditions to check, and these are how we +determine whether a test has failed or succeeded. In order for the test to pass +each condition for an output must resolve to `true`. + +It's possible for a topology to result in >1 events extracted from a single +transform, in which case each condition must pass for one or more of the +extracted events in order for the test to pass. + +An output without any conditions cannot fail a test, and instead prints the +input and output events of a transform during the test. This is useful when +building a config as it allows us to inspect the behavior of each transform in +isolation. + +The only condition we've defined here is a `check_fields` type. This is +currently the _only_ condition type on offer, and it allows us to specify any +number of field queries (of the format `"." = ""`). + +## Executing + +With this test added to the bottom of our config we are now able to execute it. +Executing tests within a config file can be done with the `test` subcommand: + +```bash +vector test ./example.toml +``` + +Doing this results in the following output: + +```shell +vector test ./example.toml +Running ./example.toml tests +test ./example.toml: check_simple_log ... failed + +failures: + +--- ./example.toml --- + +test 'check_simple_log': + +check transform 'baz' failed conditions: + condition[0]: predicates failed: [ new_field.equals: "this is a static value" ] +payloads (events encoded as JSON): + input: {"level":"info","timestamp":"2019-11-28T12:00:00+00:00","message":"Sorry, I'm busy this week Cecil"} + output: {"timestamp":"2019-11-28T12:00:00+00:00","message":"Sorry, I'm busy this week Cecil"} +``` + +Whoops! Something isn't right. Vector has told us that condition `0` (our only +condition) failed for the predicate `new_field.equals`. We also get to see a +JSON encoded representation of the input and output of the transform `baz`. +Try reviewing our config topology to see if you can spot the mistake. + +**Spoiler alert**: The problem is that transform `baz` is configured with the input +`foo`, which means `bar` is skipped in the topology! + +{{< info >}} +Side note: We would have also caught this particular issue with: + +```shell +vector validate --topology ./example.toml +``` +{{< /info >}} + +The fix is easy, we simply change the input of `baz` from `foo` to `bar`: + +```diff +--- a/example.toml ++++ b/example.toml +@@ -16,7 +16,7 @@ + + [transforms.baz] + type = "remove_fields" +- inputs = ["foo"] ++ inputs = ["bar"] + fields = ["level"] +``` + +And running our test again gives us an exit status 0: + +```sh +vector test ./example.toml +Running ./example.toml tests +Test ./example.toml: check_simple_log ... passed +``` + +The test passed! Now if we configure our CI system to execute our test we can +ensure that uncle Cecil remains in Shoreditch after any future config change. +What an insufferable hipster he is. + +[docs.about.concepts]: /docs/about/concepts +[docs.reference.configuration.tests]: /docs/reference/configuration/tests +[docs.setup.quickstart]: /docs/setup/quickstart diff --git a/docs/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md b/docs/content/en/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md similarity index 76% rename from docs/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md rename to docs/content/en/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md index 33999b8bea4a4..c04cae5644dc3 100644 --- a/docs/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md +++ b/docs/content/en/highlights/2019-10-21-require-encoding-option-for-console-and-file-sinks.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Require `encoding` option for console and file sinks" description: "The `encoding` option is now required for these sinks" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1033] release: "0.6.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sinks", "sink: console", "sink: file"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["console", "file"] --- The dynamic `encoding` concept in Vector was confusing users, so we've made @@ -29,5 +31,3 @@ Make the following changes in your `vector.toml` file: ``` That's it! - - diff --git a/docs/highlights/2019-11-19-arm-support-on-linux.md b/docs/content/en/highlights/2019-11-19-arm-support-on-linux.md similarity index 85% rename from docs/highlights/2019-11-19-arm-support-on-linux.md rename to docs/content/en/highlights/2019-11-19-arm-support-on-linux.md index f517a7f76d8df..d2290848f7c1a 100644 --- a/docs/highlights/2019-11-19-arm-support-on-linux.md +++ b/docs/content/en/highlights/2019-11-19-arm-support-on-linux.md @@ -1,19 +1,16 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" -title: "ARMv7 & ARM64 Support on Linux" -description: "These architectures are widely used in embeded devices & servers" -author_github: "https://github.com/binarylogic" +date: "2020-03-31" +title: "ARMv7 and ARM64 Support on Linux" +description: "These architectures are widely used in embeded devices and servers" +authors: ["binarylogic"] pr_numbers: [1054, 1292] release: "0.6.0" hide_on_release_notes: false -tags: - [ - "type: new feature", - "domain: platforms", - "platform: arm64", - "platform: armv7", - ] +badges: + type: "new feature" + domains: ["platforms"] + platforms: ["arm64", "arm7"] +aliases: ["/blog/arm-support-on-linux"] --- Vector now supports [ARM architectures][urls.arm] on the Linux platform! These @@ -27,7 +24,7 @@ instructions for your preferred method: - [From archives][docs.manual.from-archives] - [Or, download the files directly][pages.releases] - + ## Fully-static without dependencies @@ -36,7 +33,7 @@ This makes installation as simple as copying the Vector binary onto your machine. There are no dependencies to install or environment changes required. -## DPKG, RPM, & Docker support +## DPKG, RPM, and Docker support In addition to providing archives for these architectures, we went the extra mile to ensure [DPKG][docs.package-managers.dpkg], @@ -55,11 +52,11 @@ instances][urls.aws_arm_g2_announcement]. These instances are based on Amazon's ARM-based Graviton2 processors. Amazon claims they "deliver up to 40% improved price/performance over current generation `M5`, `C5`, and `R5` instances". -### Raspbian, IoT, & embedded devices +### Raspbian, IoT, and embedded devices ARM architectures are widely used on IoT devices. Vector is the perfect candidate for resource constrainted environments like this, especially given -[Vector's superior memory efficiency][pages.index#performance]. +Vector's superior memory efficiency. ## The case for Vector @@ -72,7 +69,6 @@ Supporting these platforms, properly, is Vector's core competency. [docs.package-managers.dpkg]: /docs/setup/installation/package-managers/dpkg/ [docs.package-managers.rpm]: /docs/setup/installation/package-managers/rpm/ [docs.platforms.docker]: /docs/setup/installation/platforms/docker/ -[pages.index#performance]: /#performance [pages.releases]: /releases/ [urls.arm]: https://en.wikipedia.org/wiki/ARM_architecture [urls.aws_arm_g2_announcement]: https://aws.amazon.com/about-aws/whats-new/2019/12/announcing-new-amazon-ec2-m6g-c6g-and-r6g-instances-powered-by-next-generation-arm-based-aws-graviton2-processors/ diff --git a/docs/highlights/2019-11-21-windows-support.md b/docs/content/en/highlights/2019-11-21-windows-support.md similarity index 90% rename from docs/highlights/2019-11-21-windows-support.md rename to docs/content/en/highlights/2019-11-21-windows-support.md index d7600a4891dd4..dff517090b098 100644 --- a/docs/highlights/2019-11-21-windows-support.md +++ b/docs/content/en/highlights/2019-11-21-windows-support.md @@ -1,13 +1,16 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" +date: "2020-03-31" title: "Windows Support Is Here!" description: "Bringing the performance and reliability of Vector to Windows" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1205] release: "0.6.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: platforms", "platform: windows"] +badges: + type: "new feature" + domains: ["platforms"] + platforms: ["windows"] +aliases: ["/blog/windows-support"] --- We're excited to announce that Vector can now be installed on Windows! @@ -46,7 +49,7 @@ Or manually through the GUI installer: ## An important step for Vector -A core tenant of Vector is that users should own and control their data; this +A core tenet of Vector is that users should own and control their data; this starts with data collection. So often we see organizations deploying many (sometimes 10 or more) data collectors just because upstream and downstream support is lacking. This is especially true when Windows environments are diff --git a/docs/highlights/2019-11-25-unit-testing-vector-config-files.md b/docs/content/en/highlights/2019-11-25-unit-testing-vector-config-files.md similarity index 84% rename from docs/highlights/2019-11-25-unit-testing-vector-config-files.md rename to docs/content/en/highlights/2019-11-25-unit-testing-vector-config-files.md index 7ba4c71b6db28..a71b6a24f3f83 100644 --- a/docs/highlights/2019-11-25-unit-testing-vector-config-files.md +++ b/docs/content/en/highlights/2019-11-25-unit-testing-vector-config-files.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" +date: "2020-03-31" title: "Unit Testing Your Vector Config Files" description: "Treating your Vector configuration files as code" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1220] release: "0.6.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: config"] +badges: + type: "new feature" + domains: ["config"] +aliases: ["/blog/unit-testing-vector-config-files"] --- Today we're excited to announce beta support for unit testing Vector @@ -17,7 +19,7 @@ configuration file. These tests are used to assert the output from topologies of that your configuration behavior does not regress; a very powerful feature for mission-critical production pipelines that are collaborated on. - + ## Example @@ -93,9 +95,9 @@ works well for everyone. Please let us know what you think either in our [community chat](https://chat.vector.dev/) or by [raising an issue](https://github.com/timberio/vector/issues/new). -[docs.reference.tests]: /docs/reference/tests/ -[docs.sinks.aws_cloudwatch_logs]: /docs/reference/sinks/aws_cloudwatch_logs/ -[docs.sources.file]: /docs/reference/sources/file/ -[docs.transforms.regex_parser]: /docs/reference/transforms/regex_parser/ -[docs.transforms]: /docs/reference/transforms/ -[guides.advanced.unit_testing]: /guides/advanced/unit-testing/ +[docs.reference.tests]: /docs/reference/configuration/tests +[docs.sinks.aws_cloudwatch_logs]: /docs/reference/configuration/sinks/aws_cloudwatch_logs +[docs.sources.file]: /docs/reference/configuration/sources/file +[docs.transforms.regex_parser]: /docs/reference/vrl/functions/#parse_regex +[docs.transforms]: /docs/reference/configuration/transforms +[guides.advanced.unit_testing]: /guides/level-up/unit-testing diff --git a/docs/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md b/docs/content/en/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md similarity index 74% rename from docs/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md rename to docs/content/en/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md index a439b7be73875..4b401d5116e6c 100644 --- a/docs/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md +++ b/docs/content/en/highlights/2019-12-04-rename-datadog-sink-to-datadog_metrics.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "The `datadog` sink has been renamed to `datadog_metrics`" description: "This ensures that naming is consistent for the upcoming `datadog_logs` sink" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1314] release: "0.6.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sinks", "sink: datadog_metrics"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["datadog_metrics"] --- The `datadog` sink has been renamed to `datadog_metrics` to make way for the @@ -24,5 +26,3 @@ Make the following changes in your `vector.toml` file: ``` That's it! - - diff --git a/docs/highlights/2019-12-13-custom-dns.md b/docs/content/en/highlights/2019-12-13-custom-dns.md similarity index 77% rename from docs/highlights/2019-12-13-custom-dns.md rename to docs/content/en/highlights/2019-12-13-custom-dns.md index 74c48f8fbf9aa..3fcbd88fd24c0 100644 --- a/docs/highlights/2019-12-13-custom-dns.md +++ b/docs/content/en/highlights/2019-12-13-custom-dns.md @@ -1,20 +1,22 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Use Custom DNS Servers" description: "Point Vector to custom DNS servers" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1118, 1362, 1371, 1400, 1451] release: "0.6.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: networking"] +badges: + type: "new feature" + domains: ["networking"] +aliases: ["/blog/custom-dns"] --- We're modern progressive parents and aren't about to tell Vector who it can and can't hang out with. As such, we're now allowing you to specify custom DNS servers in your configs. - + The configuration isn't complicated, it's a global array field `dns_servers`: @@ -24,5 +26,3 @@ dns_servers = ["0.0.0.0:53"] When `dns_servers` is set Vector will ignore the system configuration and use only the list of DNS servers provided. - - diff --git a/docs/highlights/2019-12-14-kubernetes-source-alpha.md b/docs/content/en/highlights/2019-12-14-kubernetes-source-alpha.md similarity index 80% rename from docs/highlights/2019-12-14-kubernetes-source-alpha.md rename to docs/content/en/highlights/2019-12-14-kubernetes-source-alpha.md index 1024ef1ddf2cb..c00ec13612d13 100644 --- a/docs/highlights/2019-12-14-kubernetes-source-alpha.md +++ b/docs/content/en/highlights/2019-12-14-kubernetes-source-alpha.md @@ -1,13 +1,16 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" +date: "2020-03-31" title: "New Kubernetes Source (alpha)" description: "Early adopters have a new Kuberenetes source to chew on" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [893] release: "0.6.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sources", "source: kubernetes"] +badges: + type: "new feature" + domains: ["sources"] + sources: ["kubernetes"] +aliases: ["/blog/kubernetes-source-alpha"] --- We're currently [experimenting with Kubernetes integration](https://github.com/timberio/vector/issues/260) @@ -15,7 +18,7 @@ This functionality is undocumented and not yet ready for general use. However, we consider it to be at Alpha stage and suitable for adventurous early adopters to try out. - + We consider Kubernetes integration to be extremely important and we want to get this right, so we'd love to [get feedback][urls.vector_chat] from anyone willing. diff --git a/docs/highlights/2019-12-16-ec2-metadata.md b/docs/content/en/highlights/2019-12-16-ec2-metadata.md similarity index 72% rename from docs/highlights/2019-12-16-ec2-metadata.md rename to docs/content/en/highlights/2019-12-16-ec2-metadata.md index 5c4669c0b737d..58d92e577ad63 100644 --- a/docs/highlights/2019-12-16-ec2-metadata.md +++ b/docs/content/en/highlights/2019-12-16-ec2-metadata.md @@ -1,19 +1,22 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" -title: "New AWS EC2 Medata Transform" +date: "2020-03-31" +title: "New AWS EC2 Metadata Transform" description: "Enrich your events with EC2 metadata" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1325] release: "0.6.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: transforms", "transform: aws_ec2_metadata"] +badges: + type: "new feature" + domains: ["transforms"] + transforms: ["aws_ec2_metadata"] +aliases: ["/blog/ec2-metadata"] --- Are your events the laughing-stock of the data warehouse? Then enrich them with our brand spanking new [`aws_ec2_metadata` transform][docs.transforms.aws_ec2_metadata]. - + Configuration isn't complicated, just add and hook up the transform. If you don't want all enrichments added then white-list them with the `fields` option: @@ -39,4 +42,4 @@ For more guidance get on the [reference page][docs.transforms.aws_ec2_metadata]. Data is better when it's thicc 👌 -[docs.transforms.aws_ec2_metadata]: /docs/reference/transforms/aws_ec2_metadata/ +[docs.transforms.aws_ec2_metadata]: /docs/reference/configuration/transforms/aws_ec2_metadata diff --git a/docs/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md b/docs/content/en/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md similarity index 76% rename from docs/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md rename to docs/content/en/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md index dff5bdcdb9aa0..7bfe029fe48e2 100644 --- a/docs/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md +++ b/docs/content/en/highlights/2020-01-03-merge-existing-tcp-and-udp-sources-into-a-single-socket-source.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Merge existing `tcp` and `udp` sources into a single `socket` source" description: "We've simplified our socket based sources into a single `socket` source" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1485] release: "0.7.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sources", "source: tcp", "source: udp"] +badges: + type: "breaking change" + domain: ["sources"] + sources: ["tcp", "udp"] --- The `tcp` and `udp` sources no longer exist and have been merged into a new @@ -25,5 +27,3 @@ field `mode` to match the socket type (`tcp` or `udp`): address = "0.0.0.0:9000" + mode = "tcp" ``` - - diff --git a/docs/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md b/docs/content/en/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md similarity index 76% rename from docs/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md rename to docs/content/en/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md index 8b52ea269f601..bb3b4ab34a267 100644 --- a/docs/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md +++ b/docs/content/en/highlights/2020-01-03-move-existing-tcp-sink-into-socket-sink.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Rename existing `tcp` sink to `socket` sink" description: "This renames the existing `tcp` sink to `socket`" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1404] release: "0.7.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sinks", "sink: tcp"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["tcp"] --- The `tcp` sink has been renamed to `socket`. This is part of an overall effort @@ -23,5 +25,3 @@ foundation for upcoming sinks. address = "92.12.333.224:5000" + mode = "tcp" ``` - - diff --git a/docs/highlights/2020-01-07-prometheus-source.md b/docs/content/en/highlights/2020-01-07-prometheus-source.md similarity index 72% rename from docs/highlights/2020-01-07-prometheus-source.md rename to docs/content/en/highlights/2020-01-07-prometheus-source.md index 416ee053dff53..2d1797aff9749 100644 --- a/docs/highlights/2020-01-07-prometheus-source.md +++ b/docs/content/en/highlights/2020-01-07-prometheus-source.md @@ -1,20 +1,23 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" +date: "2020-03-31" title: "New Prometheus Source" description: "Scrape prometheus metrics with Vector" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1264] release: "0.7.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sources", "source: prometheus"] +badges: + type: "new feature" + domains: ["sources"] + sources: ["prometheus"] +aliases: ["/blog/prometheus-source"] --- We love [Prometheus][urls.prometheus], but we also love [options](https://www.mms.com/en-us/shop/single-color) -and so we've added a [`prometheus` source][docs.sources.prometheus] to let you +and so we've added a [`prometheus_scrape` source][docs.sources.prometheus] to let you send Prometheus format metrics anywhere you like. - + This was an important feat for Vector because it required us to mature our metrics data model and tested our interoperability between metrics sources. @@ -24,7 +27,7 @@ to scrape: ```toml [sources.my_source_id] - type = "prometheus" + type = "prometheus_scrape" hosts = ["http://localhost:9090"] scrape_interval_secs = 1 ``` @@ -36,6 +39,6 @@ For more guidance get on the [reference page][docs.sources.prometheus]. We believe the most common use cases for this source will be backups and migration, if you have an interesting use case we'd [love to hear about it][urls.vector_chat]. -[docs.sources.prometheus]: /docs/reference/sources/prometheus/ +[docs.sources.prometheus]: /docs/reference/configuration/sources/prometheus_scrape [urls.prometheus]: https://prometheus.io/ [urls.vector_chat]: https://chat.vector.dev diff --git a/docs/highlights/2020-01-12-request-options-refactored.md b/docs/content/en/highlights/2020-01-12-request-options-refactored.md similarity index 88% rename from docs/highlights/2020-01-12-request-options-refactored.md rename to docs/content/en/highlights/2020-01-12-request-options-refactored.md index 2b47a34203dc8..c81a16d96241d 100644 --- a/docs/highlights/2020-01-12-request-options-refactored.md +++ b/docs/content/en/highlights/2020-01-12-request-options-refactored.md @@ -1,19 +1,14 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Sink options have been refactored" description: "We've simplified and organized our sink options" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1006, 1493, 1494, 1495] release: "0.7.0" hide_on_release_notes: false -tags: - [ - "type: breaking change", - "domain: buffers", - "domain: config", - "domain: sinks", - ] +badges: + type: "breaking change" + domains: ["buffers", "config", "sinks"] --- In our preparation for 1.0 we took time to organize and cleanup our diff --git a/docs/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md b/docs/content/en/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md similarity index 79% rename from docs/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md rename to docs/content/en/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md index bda2ae461c372..90a02b2aad28c 100644 --- a/docs/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md +++ b/docs/content/en/highlights/2020-01-12-use-comma-delim-server-list-instead-of-an-array.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Use comma delim server list in `kafka` sink" description: "This change achieve consistency with our `kafka` source and other Kafka clients" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1502] release: "0.7.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sinks", "sink: kafka"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["kafka"] --- The `kafka` sink field `bootstrap_servers` has been changed from an array to a @@ -23,5 +25,3 @@ string, expecting a comma separated list of bootstrap servers similar to the - bootstrap_servers = ["10.14.22.123:9092", "10.14.23.332:9092"] + bootstrap_servers = "10.14.22.123:9092,10.14.23.332:9092" ``` - - diff --git a/docs/highlights/2020-01-14-rename-line-field-to-message.md b/docs/content/en/highlights/2020-01-14-rename-line-field-to-message.md similarity index 74% rename from docs/highlights/2020-01-14-rename-line-field-to-message.md rename to docs/content/en/highlights/2020-01-14-rename-line-field-to-message.md index 8879d164b6152..67ab35f529498 100644 --- a/docs/highlights/2020-01-14-rename-line-field-to-message.md +++ b/docs/content/en/highlights/2020-01-14-rename-line-field-to-message.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "Rename `line` field to `message` in `splunk_hec` source" description: "This change ensures the `splunk_hec` source conforms to Vector's schema" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1457] release: "0.7.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sources", "source: splunk_hec"] +badges: + type: "breaking change" + domains: ["sources"] + sources: ["splunk_hec"] --- The `splunk_hec` source now emits events with a `message` key instead of a @@ -19,4 +21,4 @@ options][docs.reference.configuration.global-options#log_schema]. There are no changes you need to make. Just be aware that your events will no longer have a `line` field. -[docs.reference.configuration.global-options#log_schema]: /docs/reference/global-options/#log_schema +[docs.reference.configuration.global-options#log_schema]: /docs/reference/configuration/global-options/#log_schema diff --git a/docs/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md b/docs/content/en/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md similarity index 79% rename from docs/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md rename to docs/content/en/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md index f13efc85cea29..e8d6f6a018f61 100644 --- a/docs/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md +++ b/docs/content/en/highlights/2020-01-20-splunk-hec-specify-indexed-fields.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "The `splunk_hec` sink does not index fields by default" description: "This gives you full control over which fields are indexed" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1537] release: "0.7.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sinks", "sink: splunk_hec"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["splunk_hec"] --- There is no longer a distinction within Vector between explicit and implicit @@ -25,5 +27,3 @@ configuration option `indexed_fields`: inputs = ["my-source-id"] + indexed_fields = ["foo", "bar"] ``` - - diff --git a/docs/highlights/2020-02-05-drop-aws-options.md b/docs/content/en/highlights/2020-02-05-drop-aws-options.md similarity index 72% rename from docs/highlights/2020-02-05-drop-aws-options.md rename to docs/content/en/highlights/2020-02-05-drop-aws-options.md index 71a2dd4d36d97..bc3da5d85adf3 100644 --- a/docs/highlights/2020-02-05-drop-aws-options.md +++ b/docs/content/en/highlights/2020-02-05-drop-aws-options.md @@ -1,19 +1,16 @@ --- -last_modified_on: "2020-04-15" -$schema: ".schema.json" +date: "2020-04-15" title: "AWS specific options have been dropped in the Elasticsearch sink" description: "We've dropped redundant AWS options that may break backward compatibility" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1703] release: "0.8.0" hide_on_release_notes: true -tags: - [ - "type: breaking change", - "provider: aws", - "domain: sinks", - "sink: elasticsearch", - ] +badges: + type: "breaking change" + providers: ["aws"] + domains: ["sinks"] + sinks: ["elasticsearch"] --- The `endpoint` and `region` options have been dropped in the [`elasticsearch` @@ -32,4 +29,4 @@ sink][docs.sinks.elasticsearch] in favor of using the `host` option. You can find your AWS ES domain in the AWS console. Simply provide the full domain URL as the `host` value. -[docs.sinks.elasticsearch]: /docs/reference/sinks/elasticsearch/ +[docs.sinks.elasticsearch]: /docs/reference/configuration/sinks/elasticsearch/ diff --git a/docs/highlights/2020-02-05-merge-partial-docker-events.md b/docs/content/en/highlights/2020-02-05-merge-partial-docker-events.md similarity index 83% rename from docs/highlights/2020-02-05-merge-partial-docker-events.md rename to docs/content/en/highlights/2020-02-05-merge-partial-docker-events.md index dfbf8537aab62..2dc7a049aba31 100644 --- a/docs/highlights/2020-02-05-merge-partial-docker-events.md +++ b/docs/content/en/highlights/2020-02-05-merge-partial-docker-events.md @@ -1,14 +1,16 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Automatically merge partial Docker events" description: "Docker splits long messages by default, and now Vector merges them back for you" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1457] release: "0.8.0" hide_on_release_notes: false -tags: - ["type: enhancement", "domain: sources", "source: docker", "platform: docker"] +badges: + type: "enhancement" + domains: ["sources"] + sources: ["docker"] + platforms: ["docker"] --- Anyone that was worked with Docker logs knows how frustrating this problem diff --git a/docs/highlights/2020-02-07-multi-config-files.md b/docs/content/en/highlights/2020-02-07-multi-config-files.md similarity index 80% rename from docs/highlights/2020-02-07-multi-config-files.md rename to docs/content/en/highlights/2020-02-07-multi-config-files.md index 7de1d5fcc7eab..973f16e622f73 100644 --- a/docs/highlights/2020-02-07-multi-config-files.md +++ b/docs/content/en/highlights/2020-02-07-multi-config-files.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "Support For Multiple Config Files" description: "A better way to manage complex Vector configurations" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1725] release: "0.8.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: config"] +badges: + type: "new feature" + domains: ["config"] --- Vector is now able to execute a topology spread across multiple config files, diff --git a/docs/highlights/2020-02-11-improved-syslog-parsing.md b/docs/content/en/highlights/2020-02-11-improved-syslog-parsing.md similarity index 72% rename from docs/highlights/2020-02-11-improved-syslog-parsing.md rename to docs/content/en/highlights/2020-02-11-improved-syslog-parsing.md index 6ddab406d5600..a50d1c73a9cea 100644 --- a/docs/highlights/2020-02-11-improved-syslog-parsing.md +++ b/docs/content/en/highlights/2020-02-11-improved-syslog-parsing.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "Improved Syslog Parsing" description: "Best effort parsing support for Syslog" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1757] release: "0.8.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sources", "source: syslog"] +badges: + type: "new feature" + domains: ["sources"] + sources: ["syslog"] --- Anyone that dealt with Syslog knows that the format specification is a "goal". @@ -20,8 +22,8 @@ format you can always use the [`socket` source][docs.sources.socket] and the [`regex_parser` transform][docs.transforms.regex_parser] to roll your own collection parsing pipeline. -[docs.sources.socket]: /docs/reference/sources/socket/ -[docs.sources.syslog]: /docs/reference/sources/syslog/ -[docs.transforms.regex_parser]: /docs/reference/transforms/regex_parser/ +[docs.sources.socket]: /docs/reference/configuration/sources/socket/ +[docs.sources.syslog]: /docs/reference/configuration/sources/syslog/ +[docs.transforms.regex_parser]: /docs/reference/vrl/functions/#parse_regex [urls.syslog_3164]: https://tools.ietf.org/html/rfc3164 [urls.syslog_5424]: https://tools.ietf.org/html/rfc5424 diff --git a/docs/highlights/2020-02-14-global-log-schema.md b/docs/content/en/highlights/2020-02-14-global-log-schema.md similarity index 67% rename from docs/highlights/2020-02-14-global-log-schema.md rename to docs/content/en/highlights/2020-02-14-global-log-schema.md index cf7712e6539da..f9642026aab6f 100644 --- a/docs/highlights/2020-02-14-global-log-schema.md +++ b/docs/content/en/highlights/2020-02-14-global-log-schema.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-04-19" -$schema: ".schema.json" +date: "2020-04-19" title: "Introducing Vector's Global Log Schema" description: "Set defaults for Vector's common log key names" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1769, 1795] release: "0.8.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: config"] +badges: + type: "new feature" + domains: ["config"] --- Vector does not require a rigid schema for it's [`log` @@ -15,7 +16,7 @@ events][docs.data-model.log]. You are welcome to use any field names you like, such as the `timestamp`, `message`, and `host`. Until recently, the default names of these fields were not easily customizable. You either had to set these names within the [source][docs.sources] itself, or rename these fields -using the [`rename_fields` transform][docs.transforms.rename_fields]. While this +using the [`rename_fields` transform][docs.transforms.remap]. While this works, it's combersome and is not obvious to anyone reading your Vector configuration file. Enter Vector's new [global log schema][docs.global-options#log_schema]. These new options allow you to change @@ -39,10 +40,10 @@ Why is this useful? [sinks][docs.sinks] to ensure that Vector's internal "host" field is mapped to the downstream service's "host" field. -[docs.data-model.log]: /docs/about/data-model/log/ -[docs.global-options#host_key]: /docs/reference/global-options/#host_key -[docs.global-options#log_schema]: /docs/reference/global-options/#log_schema -[docs.global-options#message_key]: /docs/reference/global-options/#message_key -[docs.sinks]: /docs/reference/sinks/ -[docs.sources]: /docs/reference/sources/ -[docs.transforms.rename_fields]: /docs/reference/transforms/rename_fields/ +[docs.data-model.log]: /docs/about/under-the-hood/architecture/data-model/log +[docs.global-options#host_key]: /docs/reference/configuration/global-options/#log_schema.host_key +[docs.global-options#log_schema]: /docs/reference/configuration/global-options/#log_schema +[docs.global-options#message_key]: /docs/reference/configuration/global-options/#log_schema.message_key +[docs.sinks]: /docs/reference/configuration/sinks/ +[docs.sources]: /docs/reference/configuration/sources/ +[docs.transforms.remap]: /docs/reference/configuration/transforms/remap diff --git a/docs/highlights/2020-02-17-add-fields-transform-templating.md b/docs/content/en/highlights/2020-02-17-add-fields-transform-templating.md similarity index 56% rename from docs/highlights/2020-02-17-add-fields-transform-templating.md rename to docs/content/en/highlights/2020-02-17-add-fields-transform-templating.md index aa9701664deba..661d86a465e01 100644 --- a/docs/highlights/2020-02-17-add-fields-transform-templating.md +++ b/docs/content/en/highlights/2020-02-17-add-fields-transform-templating.md @@ -1,20 +1,22 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "The Add Fields Transform Supports Templating" description: "Use Vector's templating syntax to add new fields" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1799] release: "0.8.0" hide_on_release_notes: true -tags: ["type: enhancement", "domain: transforms", "transform: add_fields"] +badges: + type: "enhancement" + domains: ["transforms"] + transforms: ["add_fields"] --- Vector offers a [template syntax][docs.reference.templates] that you can use to build dynamic values in your [Vector configuration][docs.setup.configuration] files. This -has now been added to the [`add_fields` transform][docs.transforms.add_fields], +has now been added to the [`add_fields` transform][docs.transforms.remap], enabling the ability to create fields from other fields values. -[docs.setup.configuration]: /docs/setup/configuration/ -[docs.reference.templates]: /docs/reference/templates/ -[docs.transforms.add_fields]: /docs/reference/transforms/add_fields/ +[docs.setup.configuration]: /docs/reference/configuration/ +[docs.reference.templates]: /docs/reference/configuration/template-syntax +[docs.transforms.remap]: /docs/reference/configuration/transforms/remap/ diff --git a/docs/content/en/highlights/2020-02-20-new-sinks.md b/docs/content/en/highlights/2020-02-20-new-sinks.md new file mode 100644 index 0000000000000..88deed9202d69 --- /dev/null +++ b/docs/content/en/highlights/2020-02-20-new-sinks.md @@ -0,0 +1,30 @@ +--- +date: "2020-04-13" +title: "Lots of New Sinks!" +description: "7 new sinks have been added to Vector" +authors: ["binarylogic"] +pr_numbers: [1555, 1562, 1668, 1716, 1759, 1783, 1794] +release: "0.8.0" +hide_on_release_notes: false +badges: + type: "new feature" + domains: ["sinks"] +--- + +We all love a good sink. Now you can enjoy our latest offerings: + +- [`gcp_stackdriver_logging` sink][docs.sinks.gcp_stackdriver_logs] +- [`gcp_cloud_storage` sink][docs.sinks.gcp_cloud_storage] +- [`logdna` sink][docs.sinks.logdna] +- [`humio_logs` sink][docs.sinks.humio_logs] +- [`influxdb_metrics` sink][docs.sinks.influxdb_metrics] +- [`loki` sink][docs.sinks.loki] +- [`sematext_logs` sink][docs.sinks.sematext_logs] + +[docs.sinks.gcp_cloud_storage]: /docs/reference/configuration/sinks/gcp_cloud_storage/ +[docs.sinks.gcp_stackdriver_logs]: /docs/reference/configuration/sinks/gcp_stackdriver_logs/ +[docs.sinks.humio_logs]: /docs/reference/configuration/sinks/humio_logs/ +[docs.sinks.influxdb_metrics]: /docs/reference/configuration/sinks/influxdb_metrics/ +[docs.sinks.logdna]: /docs/reference/configuration/sinks/logdna/ +[docs.sinks.loki]: /docs/reference/configuration/sinks/loki/ +[docs.sinks.sematext_logs]: /docs/reference/configuration/sinks/sematext_logs/ diff --git a/docs/highlights/2020-02-21-file-source-multiline-support.md b/docs/content/en/highlights/2020-02-21-file-source-multiline-support.md similarity index 69% rename from docs/highlights/2020-02-21-file-source-multiline-support.md rename to docs/content/en/highlights/2020-02-21-file-source-multiline-support.md index ddab2f6795993..762faf8c73e4f 100644 --- a/docs/highlights/2020-02-21-file-source-multiline-support.md +++ b/docs/content/en/highlights/2020-02-21-file-source-multiline-support.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-14" -$schema: ".schema.json" +date: "2020-04-14" title: "Improved Multiline Support In The File Source" description: "Merge multiple lines together based on rules" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1852] release: "0.8.0" hide_on_release_notes: false -tags: ["type: enhancement", "domain: sources", "source: file"] +badges: + type: "enhancement" + domains: ["sources"] + sources: ["file"] --- One of the biggest frustrations we've heard from users in this space is the @@ -44,10 +46,9 @@ You can merge them with the following config: timeout_ms = 1000 ``` -And if this doesn't do it, you can always fallback -to our [`lua` transform][docs.transforms.lua]. +And if this doesn't do it, you can always fall back to the [`lua` transform][docs.transforms.lua]. -[docs.sources.docker_logs#auto_partial_merge]: /docs/reference/sources/docker/#auto_partial_merge -[docs.sources.file#multiline]: /docs/reference/sources/file/#multiline -[docs.sources.file]: /docs/reference/sources/file/ -[docs.transforms.lua]: /docs/reference/transforms/lua/ +[docs.sources.docker_logs#auto_partial_merge]: /docs/reference/configuration/sources/docker_logs/#auto_partial_merge +[docs.sources.file#multiline]: /docs/reference/configuration/sources/file/#multiline +[docs.sources.file]: /docs/reference/configuration/sources/file/ +[docs.transforms.lua]: /docs/reference/configuration/transforms/lua/ diff --git a/docs/highlights/2020-02-24-log-data-model-changes.md b/docs/content/en/highlights/2020-02-24-log-data-model-changes.md similarity index 79% rename from docs/highlights/2020-02-24-log-data-model-changes.md rename to docs/content/en/highlights/2020-02-24-log-data-model-changes.md index 4303e7d756f3f..0a1a85aba5657 100644 --- a/docs/highlights/2020-02-24-log-data-model-changes.md +++ b/docs/content/en/highlights/2020-02-24-log-data-model-changes.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" -title: "Log Data Model Changes & Disk Buffers" +date: "2020-04-13" +title: "Log Data Model Changes and Disk Buffers" description: "We're bringing our log data model closer to JSON" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1836, 1898] release: "0.8.0" hide_on_release_notes: true -tags: ["type: breaking change", "domain: buffers", "event type: log"] +badges: + type: "breaking change" + domains: ["buffers"] + "event type": "log" --- We are currently working to improve and optimize our [`log` data @@ -32,4 +34,4 @@ drain your disk buffer before upgrading Vector. Note, Vector will discard invalid disk buffer data, bad data will not prevent Vector from starting. -[docs.data-model.log]: /docs/about/data-model/log/ +[docs.data-model.log]: /docs/about/under-the-hood/architecture/data-model/log/ diff --git a/docs/content/en/highlights/2020-02-24-rename-fields-transform.md b/docs/content/en/highlights/2020-02-24-rename-fields-transform.md new file mode 100644 index 0000000000000..8a1877ddb1fd9 --- /dev/null +++ b/docs/content/en/highlights/2020-02-24-rename-fields-transform.md @@ -0,0 +1,18 @@ +--- +date: "2020-04-13" +title: "New Rename Fields Transform" +description: "An easier way to rename fields" +authors: ["binarylogic"] +pr_numbers: [1800] +release: "0.8.0" +hide_on_release_notes: false +badges: + type: "new feature" + domains: ["transforms"] + transforms: ["rename_fields"] +--- + +Vector has a long overdue [`rename_fields` transform][docs.transforms.remap]. +This does exactly what it says, rename fields :). + +[docs.transforms.remap]: /docs/reference/configuration/transforms/remap diff --git a/docs/highlights/2020-02-24-swimlanes-transform.md b/docs/content/en/highlights/2020-02-24-swimlanes-transform.md similarity index 67% rename from docs/highlights/2020-02-24-swimlanes-transform.md rename to docs/content/en/highlights/2020-02-24-swimlanes-transform.md index 1dac359e38e04..815694d51fea5 100644 --- a/docs/highlights/2020-02-24-swimlanes-transform.md +++ b/docs/content/en/highlights/2020-02-24-swimlanes-transform.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "New Swimlanes Transform" description: "Split log streams with ease" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1785] release: "0.8.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: transforms", "transform: swimlanes"] +badges: + type: "new feature" + domains: ["transforms"] + transforms: ["swimlanes"] --- The new [`swimlanes` transform][docs.transforms.swimlanes] makes it much easier @@ -28,5 +30,5 @@ easily create [if/else pipelines][docs.transforms.swimlanes#examples]. Remember to occasionally let your branches mingle so that they don't completely lose touch. -[docs.transforms.swimlanes#examples]: /docs/reference/transforms/swimlanes/#examples -[docs.transforms.swimlanes]: /docs/reference/transforms/swimlanes/ +[docs.transforms.swimlanes#examples]: /docs/reference/configuration/transforms/route/#examples +[docs.transforms.swimlanes]: /docs/reference/configuration/transforms/route/ diff --git a/docs/highlights/2020-02-27-nixos-support.md b/docs/content/en/highlights/2020-02-27-nixos-support.md similarity index 79% rename from docs/highlights/2020-02-27-nixos-support.md rename to docs/content/en/highlights/2020-02-27-nixos-support.md index 5b2b5b6694198..e34da2ba7ba85 100644 --- a/docs/highlights/2020-02-27-nixos-support.md +++ b/docs/content/en/highlights/2020-02-27-nixos-support.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "NixOS Support" description: "Bringing Vector to NixOS" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1946] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: platforms", "platform: nixos"] +badges: + type: "new feature" + domains: ["platforms"] + platforms: ["nixos"] --- Vector is [lovingly maintained by the NixOS ecosystem][urls.vector_nix_package], diff --git a/docs/highlights/2020-02-28-custom-vector-builds.md b/docs/content/en/highlights/2020-02-28-custom-vector-builds.md similarity index 81% rename from docs/highlights/2020-02-28-custom-vector-builds.md rename to docs/content/en/highlights/2020-02-28-custom-vector-builds.md index 87e46d7f82d5b..17d1e2aa3f2fe 100644 --- a/docs/highlights/2020-02-28-custom-vector-builds.md +++ b/docs/content/en/highlights/2020-02-28-custom-vector-builds.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-16" -$schema: ".schema.json" -title: "À La Carte Custom Vector Builds" +date: "2020-04-16" +title: "À la carte Custom Vector Builds" description: "Build Vector with select components" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1924] release: "0.9.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sources", "source: vector"] +badges: + type: "new feature" + domains: ["sources"] + sources: ["vector"] --- We've implemented a feature flag system that lets you build custom versions diff --git a/docs/highlights/2020-03-03-privacy-policy.md b/docs/content/en/highlights/2020-03-03-privacy-policy.md similarity index 75% rename from docs/highlights/2020-03-03-privacy-policy.md rename to docs/content/en/highlights/2020-03-03-privacy-policy.md index acc8d2ed5bf79..db8c1dd2ae265 100644 --- a/docs/highlights/2020-03-03-privacy-policy.md +++ b/docs/content/en/highlights/2020-03-03-privacy-policy.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" -title: "We've Added A Privacy Policy" +date: "2020-04-13" +title: "We've Added a Privacy Policy" description: "Our commitment to privacy" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1977, 1976] release: "0.8.1" hide_on_release_notes: true -tags: ["type: announcement"] +badges: + type: "announcement" --- In addition to our [security policy][urls.vector_security_policy], we've added diff --git a/docs/highlights/2020-03-04-encoding-only-fields-except-fields.md b/docs/content/en/highlights/2020-03-04-encoding-only-fields-except-fields.md similarity index 84% rename from docs/highlights/2020-03-04-encoding-only-fields-except-fields.md rename to docs/content/en/highlights/2020-03-04-encoding-only-fields-except-fields.md index 3837b09539f0a..08032a186b521 100644 --- a/docs/highlights/2020-03-04-encoding-only-fields-except-fields.md +++ b/docs/content/en/highlights/2020-03-04-encoding-only-fields-except-fields.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "New Encoding Options" description: "Vector now lets you whitelist, blacklist, and format fields when events are encoded" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1915] release: "0.9.0" hide_on_release_notes: false -tags: ["type: enhancement", "domain: sinks"] +badges: + type: "enhancement" + domains: ["sinks"] --- Vector has deprecated the root-level `encoding` option in favor of new diff --git a/docs/highlights/2020-03-04-encoding-whitelist-blacklist.md b/docs/content/en/highlights/2020-03-04-encoding-whitelist-blacklist.md similarity index 68% rename from docs/highlights/2020-03-04-encoding-whitelist-blacklist.md rename to docs/content/en/highlights/2020-03-04-encoding-whitelist-blacklist.md index 8a69c28990d1a..c87d139e0dac2 100644 --- a/docs/highlights/2020-03-04-encoding-whitelist-blacklist.md +++ b/docs/content/en/highlights/2020-03-04-encoding-whitelist-blacklist.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" -title: "Whitelist & Blacklist Fields When Encoding" +date: "2020-04-13" +title: "Whitelist and Blacklist Fields When Encoding" description: "More control over which fields are included when encoding" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1915] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sinks"] +badges: + type: "new feature" + domains: ["sinks"] --- We've added the ability to white-list and blacklist fields during the encoding @@ -19,5 +20,5 @@ include it in the actual data since it would be duplicative. To use this feature see the new `encoding` options for each sink. For example, the [`clickhouse` sink's `encoding` option][docs.sinks.clickhouse#encoding]. -[docs.sinks.clickhouse#encoding]: /docs/reference/sinks/clickhouse/#encoding -[docs.sinks]: /docs/reference/sinks/ +[docs.sinks.clickhouse#encoding]: /docs/reference/configuration/sinks/clickhouse/#encoding +[docs.sinks]: /docs/reference/configuration/sinks/ diff --git a/docs/highlights/2020-03-09-kafka-sink-compression.md b/docs/content/en/highlights/2020-03-09-kafka-sink-compression.md similarity index 72% rename from docs/highlights/2020-03-09-kafka-sink-compression.md rename to docs/content/en/highlights/2020-03-09-kafka-sink-compression.md index 1adeb20630d12..2c327131b3b34 100644 --- a/docs/highlights/2020-03-09-kafka-sink-compression.md +++ b/docs/content/en/highlights/2020-03-09-kafka-sink-compression.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "Compression Now Available In The Kafka Sink" description: "Improve throughput by compressing data before writing it to Kafka" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1969] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sinks", "sink: kafka"] +badges: + type: "new feature" + domains: ["sinks"] + sinks: ["kafka"] --- Compression for Vector's [`kafka` sink][docs.sinks.kafka] is now available. @@ -17,7 +19,7 @@ we just mapped the appropriate options. In addition, we added a [new `librdkafka_options`][docs.sinks.kafka#librdkafka_options] that enables transparent pass-through of [`librdkafka`'s options][urls.librdkafka_config]. -[docs.sinks.kafka#librdkafka_options]: /docs/reference/sinks/kafka/#librdkafka_options -[docs.sinks.kafka]: /docs/reference/sinks/kafka/ +[docs.sinks.kafka#librdkafka_options]: /docs/reference/configuration/sinks/kafka/#librdkafka_options +[docs.sinks.kafka]: /docs/reference/configuration/sinks/kafka/ [urls.librdkafka]: https://github.com/edenhill/librdkafka [urls.librdkafka_config]: https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md diff --git a/docs/highlights/2020-03-10-dedupe-transform.md b/docs/content/en/highlights/2020-03-10-dedupe-transform.md similarity index 66% rename from docs/highlights/2020-03-10-dedupe-transform.md rename to docs/content/en/highlights/2020-03-10-dedupe-transform.md index cdd7548e40ca0..4a596b98f448b 100644 --- a/docs/highlights/2020-03-10-dedupe-transform.md +++ b/docs/content/en/highlights/2020-03-10-dedupe-transform.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-04-16" -$schema: ".schema.json" +date: "2020-04-16" title: "New Dedupe Transform" description: "Shed duplicate logs" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1848] release: "0.9.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sources", "source: vector"] +badges: + type: new feature + domains: ["sources"] + sources: ["vector"] --- For certain use cases, log deduplication can be a useful tool. Not only does @@ -30,10 +32,8 @@ Simply add the transform to your pipeline: fields.match = ["timestamp", "host", "message"] # optional, default ``` - +{{< success >}} +The `fields.match` option lets you control which fields are compared to determine if events are equal. +{{< /success >}} -- The `fields.match` option lets you control which fields are compared to determine if events are equal. - - - -[docs.transforms.dedupe]: /docs/reference/transforms/dedupe/ +[docs.transforms.dedupe]: /docs/reference/configuration/transforms/dedupe/ diff --git a/docs/highlights/2020-03-11-tag-cardinality-limit-transform.md b/docs/content/en/highlights/2020-03-11-tag-cardinality-limit-transform.md similarity index 72% rename from docs/highlights/2020-03-11-tag-cardinality-limit-transform.md rename to docs/content/en/highlights/2020-03-11-tag-cardinality-limit-transform.md index d047acc7af0b0..e2fc3268e20f0 100644 --- a/docs/highlights/2020-03-11-tag-cardinality-limit-transform.md +++ b/docs/content/en/highlights/2020-03-11-tag-cardinality-limit-transform.md @@ -1,18 +1,15 @@ --- -last_modified_on: "2020-04-16" -$schema: ".schema.json" +date: "2020-04-16" title: "New Tag Cardinality Limit Transform" -description: "Protect downstream metrics storages from runaway metrics tags" -author_github: "https://github.com/binarylogic" +description: "Protect downstream metric storage sytems from metric tag explosion" +authors: ["binarylogic"] pr_numbers: [1959] release: "0.9.0" hide_on_release_notes: false -tags: - [ - "type: new feature", - "domain: transforms", - "transform: tag_cardinality_limit", - ] +badges: + type: "new feature" + domains: ["transforms"] + transforms: ["tag_cardinality_limit"] --- High cardinality metric tags can severly disrupt downstream metrics storages. To @@ -32,16 +29,14 @@ Getting started is easy. Simply add this component to your pipeline: value_limit = 500 ``` - - +{{< success >}} - The `limit_exceeded_action` described the behavior when the `value_limit` is reached. - The `mode` enables you to switch between `exact` and `probabilistic` algorithms to trade performance for memory efficiency. - The `value` limit allows you to select exactly how many unique tag values you're willing to accept. - - +{{< /success >}} More to come! This feature is part of our [best-in-class operator UX][urls.milestone_39] initiative. -[docs.transforms.tag_cardinality_limit]: /docs/reference/transforms/tag_cardinality_limit/ +[docs.transforms.tag_cardinality_limit]: /docs/reference/configuration/transforms/tag_cardinality_limit/ [urls.milestone_39]: https://github.com/timberio/vector/milestone/39 diff --git a/docs/highlights/2020-03-11-vector-sink-tls.md b/docs/content/en/highlights/2020-03-11-vector-sink-tls.md similarity index 52% rename from docs/highlights/2020-03-11-vector-sink-tls.md rename to docs/content/en/highlights/2020-03-11-vector-sink-tls.md index 560dd6c1d6716..4d7105aa5c22a 100644 --- a/docs/highlights/2020-03-11-vector-sink-tls.md +++ b/docs/content/en/highlights/2020-03-11-vector-sink-tls.md @@ -1,18 +1,20 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" -title: "The Vector Source & Sink Support TLS" +date: "2020-04-13" +title: "The Vector Source and Sink Support TLS" description: "Securely forward data between Vector instances" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [2025] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sources", "source: vector"] +badges: + type: "new feature" + domains: ["sources"] + sources: ["vector"] --- A highly requested feature of Vector is to support the TLS protocol for the [`vector` source][docs.sources.vector] and [`vector` sink][docs.sinks.vector]. This is now available. Check out the `tls.*` options. -[docs.sinks.vector]: /docs/reference/sinks/vector/ -[docs.sources.vector]: /docs/reference/sources/vector/ +[docs.sinks.vector]: /docs/reference/configuration/sinks/vector/ +[docs.sources.vector]: /docs/reference/configuration/sources/vector/ diff --git a/docs/highlights/2020-03-12-papertrail-sink.md b/docs/content/en/highlights/2020-03-12-papertrail-sink.md similarity index 57% rename from docs/highlights/2020-03-12-papertrail-sink.md rename to docs/content/en/highlights/2020-03-12-papertrail-sink.md index 1f1b2ad1e92d5..f74a4c83dcea2 100644 --- a/docs/highlights/2020-03-12-papertrail-sink.md +++ b/docs/content/en/highlights/2020-03-12-papertrail-sink.md @@ -1,16 +1,18 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "New Papertrail Sink" description: "Sink logs to the Papertrail logging service" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1835] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sinks", "sink: papertrail"] +badges: + type: "new feature" + domains: ["sinks"] + sinks: ["papertrail"] --- Tried, true, and simple. Our new [`papertrail` sink][docs.sinks.papertrail] lets you send logs to the [Papertrail][urls.papertrail] logging service. -[docs.sinks.papertrail]: /docs/reference/sinks/papertrail/ +[docs.sinks.papertrail]: /docs/reference/configuration/sinks/papertrail diff --git a/docs/highlights/2020-03-12-rename-host_field-to-host_key.md b/docs/content/en/highlights/2020-03-12-rename-host_field-to-host_key.md similarity index 75% rename from docs/highlights/2020-03-12-rename-host_field-to-host_key.md rename to docs/content/en/highlights/2020-03-12-rename-host_field-to-host_key.md index 0f0a890c15e2f..25386cdd2a23b 100644 --- a/docs/highlights/2020-03-12-rename-host_field-to-host_key.md +++ b/docs/content/en/highlights/2020-03-12-rename-host_field-to-host_key.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "The `splunk_hec` source's `host_field` option has been renamed to `host_key`" description: "This change ensures that the `host_key` option is consistent across all sources" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [2037] release: "0.9.0" hide_on_release_notes: true -tags: ["type: breaking change", "domain: sinks", "sink: splunk_hec"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["splunk_hec"] --- We've renamed the [`splunk_hec` source's] `host_field` option to `host_key`. @@ -21,5 +23,3 @@ This ensures that the `host_key` option is consistent across all sources. - host_field = "host" + host_key = "host" ``` - - diff --git a/docs/highlights/2020-03-14-honeycomb-sink.md b/docs/content/en/highlights/2020-03-14-honeycomb-sink.md similarity index 76% rename from docs/highlights/2020-03-14-honeycomb-sink.md rename to docs/content/en/highlights/2020-03-14-honeycomb-sink.md index addd3ff28df0d..265dc0e54ee30 100644 --- a/docs/highlights/2020-03-14-honeycomb-sink.md +++ b/docs/content/en/highlights/2020-03-14-honeycomb-sink.md @@ -1,12 +1,15 @@ --- -last_modified_on: "2020-07-13" +date: "2020-07-13" title: "New Honeycomb Sink" description: "Sink logs to the Honeycomb logging service" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1665] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sinks", "sink: honeycomb"] +badges: + type: "new feature" + domains: ["sinks"] + sinks: ["honeycomb"] --- For you [Honeycomb][urls.honeycomb] fans we have a new @@ -16,6 +19,6 @@ This transform is designed to produce "canonical" events. These are flattened, wide events that represent an entire transaction, the concept that Honeycomb is built upon. Vector + Honeycomb = 👯. -[docs.sinks.honeycomb]: /docs/reference/sinks/honeycomb/ +[docs.sinks.honeycomb]: /docs/reference/configuration/sinks/honeycomb/ [urls.honeycomb]: https://honeycomb.io [urls.pr_1991]: https://github.com/timberio/vector/pull/1991 diff --git a/docs/highlights/2020-03-19-apache-pulsar-sink.md b/docs/content/en/highlights/2020-03-19-apache-pulsar-sink.md similarity index 63% rename from docs/highlights/2020-03-19-apache-pulsar-sink.md rename to docs/content/en/highlights/2020-03-19-apache-pulsar-sink.md index bcc648df9d969..c42913a3f4483 100644 --- a/docs/highlights/2020-03-19-apache-pulsar-sink.md +++ b/docs/content/en/highlights/2020-03-19-apache-pulsar-sink.md @@ -1,16 +1,19 @@ --- -last_modified_on: "2020-07-13" +date: "2020-07-13" title: "New Apache Pulsar Sink" description: "Sink logs to the Apache Pulsar service" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1665] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sinks", "sink: pulsar"] +badges: + type: "new feature" + domains: ["sinks"] + sinks: ["pulsar"] --- We have a new [`pulsar` sink][docs.sinks.pulsar]! This was a community contribution and effort. Thanks to [Evan](https://github.com/leshow) for his help building this sink! -[docs.sinks.pulsar]: /docs/reference/sinks/pulsar/ +[docs.sinks.pulsar]: /docs/reference/configuration/sinks/pulsar/ diff --git a/docs/highlights/2020-03-23-datadog-logs-sink.md b/docs/content/en/highlights/2020-03-23-datadog-logs-sink.md similarity index 55% rename from docs/highlights/2020-03-23-datadog-logs-sink.md rename to docs/content/en/highlights/2020-03-23-datadog-logs-sink.md index 093a04b5c0c89..8b2c12c0cccbe 100644 --- a/docs/highlights/2020-03-23-datadog-logs-sink.md +++ b/docs/content/en/highlights/2020-03-23-datadog-logs-sink.md @@ -1,18 +1,20 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "New Datadog Logs Sink" description: "Sink logs to the Datadog logging service" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1832] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sinks", "sink: datadog_logs"] +badges: + type: "new feature" + domains: ["sinks"] + sinks: ["datadog_logs"] --- In addition to our [`datadog_metrics` sink][docs.sinks.datadog_metrics], we've introduced a new [`datadog_logs` sink][docs.sinks.datadog_logs]. This is part of our broader effort to expand Vector's integrations. -[docs.sinks.datadog_logs]: /docs/reference/sinks/datadog_logs/ -[docs.sinks.datadog_metrics]: /docs/reference/sinks/datadog_metrics/ +[docs.sinks.datadog_logs]: /docs/reference/configuration/sinks/datadog_logs/ +[docs.sinks.datadog_metrics]: /docs/reference/configuration/sinks/datadog_metrics/ diff --git a/docs/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md b/docs/content/en/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md similarity index 75% rename from docs/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md rename to docs/content/en/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md index 3cc6f26e93707..c91eb61ce5b8b 100644 --- a/docs/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md +++ b/docs/content/en/highlights/2020-03-23-rename-gcp_stackdriver_logging-sink-to-gcp_stackdriver_logs.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "The `gcp_stackdriver_logging` sink has been renamed to `gcp_stackdriver_logs`" description: "This brings the sink naming inline with consistent naming pattern" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [2121] release: "0.9.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: sinks", "sink: splunk_hec"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["splunk_hec"] --- We've renamed the `gcp_stackdriver_logging` sink to `gcp_stackdriver_logs` to diff --git a/docs/content/en/highlights/2020-03-31-filter-transform.md b/docs/content/en/highlights/2020-03-31-filter-transform.md new file mode 100644 index 0000000000000..b1524f5d60910 --- /dev/null +++ b/docs/content/en/highlights/2020-03-31-filter-transform.md @@ -0,0 +1,38 @@ +--- +date: "2020-04-16" +title: "New Filter Transform" +description: "Filter and route your logs based on defined conditions" +authors: ["binarylogic"] +pr_numbers: [2088] +release: "0.9.0" +hide_on_release_notes: false +badges: + type: "new feature" + domains: ["transforms"] + transforms: ["filter"] +--- + +We recently introduced a concept of conditions, which you can see in our +[`route` transform][docs.transforms.route] as well as our unit +tests feature. This paved the way for a new `filter` transform, allowing you to +filter events based on a set of conditions. This replaces our old `field_filter` +transform since it is much more expressive. + +## Get Started + +```toml title="vector.toml" +[transforms.haproxy_errors] + # General + type = "filter" + inputs = ["my-source-id"] + + # Conditions + condition."level.eq" = "error" + condition."service.eq" = "haproxy" +``` + +Check out the [docs][docs.transforms.filter] for a fill list of available +conditions. + +[docs.transforms.filter]: /docs/reference/configuration/transforms/filter/ +[docs.transforms.route]: /docs/reference/configuration/transforms/route/ diff --git a/docs/highlights/2020-03-31-guides-section.md b/docs/content/en/highlights/2020-03-31-guides-section.md similarity index 51% rename from docs/highlights/2020-03-31-guides-section.md rename to docs/content/en/highlights/2020-03-31-guides-section.md index 805ad576e9b77..dbdfedf34cdbc 100644 --- a/docs/highlights/2020-03-31-guides-section.md +++ b/docs/content/en/highlights/2020-03-31-guides-section.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-03-31" -$schema: ".schema.json" +date: "2020-03-31" title: "A New Guides Section" description: "High quality guides and education for Vector" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [2132] release: "0.9.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: website"] +badges: + type: "new feature" + domains: ["website"] --- Vector is only as good as it's documentation and education. And while we @@ -16,10 +17,9 @@ aspect missing, so we launched a new [new guides section][pages.guides]. This section is meant to house high-quality guides that will be maintained and updated continuously. To kick this new section off we've added the following guides: -Getting Started Series -Custom Aggregations With Lua -Parsing CSV Logs With Lua -Unit Testing Your Configs +{{< jump "/docs/setup/quickstart" >}} +{{< jump "/guides/advanced/custom-aggregations-with-lua" >}} +{{< jump "/guides/advanced/parsing-csv-logs-with-lua" >}} [pages.docs]: /docs/ [pages.guides]: /guides/ diff --git a/docs/highlights/2020-04-01-more-condition-predicates.md b/docs/content/en/highlights/2020-04-01-more-condition-predicates.md similarity index 67% rename from docs/highlights/2020-04-01-more-condition-predicates.md rename to docs/content/en/highlights/2020-04-01-more-condition-predicates.md index 14391e66ba62a..e6b15007dc05c 100644 --- a/docs/highlights/2020-04-01-more-condition-predicates.md +++ b/docs/content/en/highlights/2020-04-01-more-condition-predicates.md @@ -1,20 +1,15 @@ --- -last_modified_on: "2020-04-13" -$schema: ".schema.json" +date: "2020-04-13" title: "More Condition Predicates" description: "More options when filtering and routing events" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1997, 2183, 2198] release: "0.9.0" hide_on_release_notes: true -tags: - [ - "type: enhancement", - "domain: config", - "domain: transforms", - "transform: filter", - "transform: swimlanes", - ] +badges: + type: "enhancement" + domains: ["config", "transforms"] + transforms: ["filter", "swimlanes"] --- Vector has a concept "conditions" that are used to qualify events. For example, @@ -44,6 +39,6 @@ the new `contains` predicate: The world is your oyster. -[docs.transforms.filter]: /docs/reference/transforms/filter/ -[docs.transforms.swimlanes]: /docs/reference/transforms/swimlanes/ -[guides.unit-testing]: /guides/advanced/unit-testing/ +[docs.transforms.filter]: /docs/reference/configuration/transforms/filter/ +[docs.transforms.swimlanes]: /docs/reference/configuration/transforms/route/ +[guides.unit-testing]: /guides/level-up/unit-testing/ diff --git a/docs/highlights/2020-04-05-default-compression-to-none.md b/docs/content/en/highlights/2020-04-05-default-compression-to-none.md similarity index 81% rename from docs/highlights/2020-04-05-default-compression-to-none.md rename to docs/content/en/highlights/2020-04-05-default-compression-to-none.md index 4e26766ff9c9a..fed5d2ebf2b00 100644 --- a/docs/highlights/2020-04-05-default-compression-to-none.md +++ b/docs/content/en/highlights/2020-04-05-default-compression-to-none.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "The `elasticsearch` sink `compression` option now defaults to `none`" description: "Compression is not supported by all Elasticsearch service providers" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] hide_on_release_notes: false pr_numbers: [2219] release: "0.9.0" -tags: ["type: breaking change", "domain: sinks", "sink: elasticsearch"] +badges: + type: "breaking change" + domains: ["sinks"] + sinks: ["elasticsearch"] --- To optimize throughput we originally defaulted the `elasticsearch` sink diff --git a/docs/content/en/highlights/2020-04-07-lua-transform-version-2.md b/docs/content/en/highlights/2020-04-07-lua-transform-version-2.md new file mode 100644 index 0000000000000..270991771840d --- /dev/null +++ b/docs/content/en/highlights/2020-04-07-lua-transform-version-2.md @@ -0,0 +1,47 @@ +--- +date: "2020-03-31" +title: "Lua Transform v2" +description: "The next iteration of our Lua transform." +authors: ["binarylogic"] +pr_numbers: [2126] +release: "0.9.0" +hide_on_release_notes: false +badges: + type: enhancement + domains: ["sources"] + sources: ["vector"] +--- + +v2 of our [`lua` transform][docs.transforms.lua] has been released! This is a +complete overhaul that provides a new and improved API, better data processing +ergonomics, and faster processing. Specific improvements include: + +1. Events are [represented as Lua tables][docs.transforms.lua#event-data-model] with proper type conversion. +2. Introduction of [hooks][docs.transforms.lua#hooks] to maintain global state. +3. Introduction of [timers][docs.transforms.lua#timers] to facilitate timed flushing. Useful for aggregations. +4. The ability to accept and work with metric events in addition to log events. + +This raises the bar in terms of capabilities, which is important! Lua is often +used as an escape hatch when Vector's native transforms are not expressive +enough. + +{{< info >}} +Did you know we're also [working on a WASM integration][urls.pr_2006] 👀 + +[urls.pr_2006]: https://github.com/timberio/vector/pull/2006 +{{< /info >}} + +## Get Started + +{{< jump "/docs/reference/configuration/transforms/lua" >}} +{{< jump "/guides/advanced/custom-aggregations-with-lua" >}} +{{< jump "/guides/advanced/parsing-csv-logs-with-lua" >}} +{{< jump "/guides/advanced/merge-multiline-logs-with-lua" >}} + +And for the curious, check out [Vector's Lua RFC][urls.rfc]. + +[docs.transforms.lua#hooks]: /docs/reference/configuration/transforms/lua/#hooks +[docs.transforms.lua#event-data-model]: /docs/reference/configuration/transforms/lua/#event-data-model +[docs.transforms.lua#timers]: /docs/reference/configuration/transforms/lua/#timers +[docs.transforms.lua]: /docs/reference/configuration/transforms/lua/ +[urls.rfc]: https://github.com/timberio/vector/blob/master/rfcs/2020-03-06-1999-api-extensions-for-lua-transform.md diff --git a/docs/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md b/docs/content/en/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md similarity index 89% rename from docs/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md rename to docs/content/en/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md index d4e2a9f3e10ab..207eced2b75b4 100644 --- a/docs/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md +++ b/docs/content/en/highlights/2020-04-07-use-external-tagging-for-metrics-serialization.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Use external tagging for metrics serialization" description: "We've improved the way we serialize metrics data" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] hide_on_release_notes: true pr_numbers: [2231] release: "0.9.0" -tags: ["type: breaking change"] +badges: + type: "breaking change" --- We've improved the serialized structure of our metrics events. This change @@ -50,6 +50,5 @@ It now serialized like: ``` ## Upgrade Guide - Upgrading should involve handling changes in any systems that are consuming metrics data from the `console` sink. diff --git a/docs/highlights/2020-04-07-vector-to-vector-metrics.md b/docs/content/en/highlights/2020-04-07-vector-to-vector-metrics.md similarity index 70% rename from docs/highlights/2020-04-07-vector-to-vector-metrics.md rename to docs/content/en/highlights/2020-04-07-vector-to-vector-metrics.md index 99c9f25d63900..17c9bcd4cfdfc 100644 --- a/docs/highlights/2020-04-07-vector-to-vector-metrics.md +++ b/docs/content/en/highlights/2020-04-07-vector-to-vector-metrics.md @@ -1,17 +1,17 @@ --- -last_modified_on: "2020-04-14" -$schema: ".schema.json" +date: "2020-04-14" title: "The Vector Source Now Accepts Metrics" description: "It's not possible to forward metrics between Vector instances" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [2245] release: "0.9.0" hide_on_release_notes: true -tags: ["type: new feature", "domain: sources", "source: vector"] +badges: + type: "new feature" + domains: ["sources"] + sources: ["vector"] --- -import SVG from 'react-inlinesvg'; - Until recently the [`vector` source][docs.sources.vector] only accepted [`log` events][docs.data-model.log]. Supporting metrics was blocked by pending metric data model development, as well as topology improvements. @@ -19,7 +19,7 @@ metric data model development, as well as topology improvements. observability pipelines that can process both logs and metrics, such as the [centralized topology][docs.topologies#centralized]. -[docs.data-model.log]: /docs/about/data-model/log/ -[docs.sources.vector]: /docs/reference/sources/vector/ +[docs.data-model.log]: /docs/about/under-the-hood/architecture/data-model/log +[docs.sources.vector]: /docs/reference/configuration/sources/vector/ [docs.topologies#centralized]: /docs/setup/deployment/topologies/#centralized [urls.pr_2245]: https://github.com/timberio/vector/pull/2245 diff --git a/docs/highlights/2020-04-09-make-acl-optional.md b/docs/content/en/highlights/2020-04-09-make-acl-optional.md similarity index 72% rename from docs/highlights/2020-04-09-make-acl-optional.md rename to docs/content/en/highlights/2020-04-09-make-acl-optional.md index 5f5813455d40c..b67d50774e3e3 100644 --- a/docs/highlights/2020-04-09-make-acl-optional.md +++ b/docs/content/en/highlights/2020-04-09-make-acl-optional.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "ACL is now optional for the Google Cloud Storage sink" -description: "ACL is not always required when creating objects in GCP Cloud Storage" -author_github: "https://github.com/binarylogic" +description: "ACL isn't always required when creating objects in GCP Cloud Storage" +authors: ["binarylogic"] hide_on_release_notes: false pr_numbers: [2283] release: "0.9.0" -tags: ["type: breaking change", "domain: sinks", "sink: gcp_cloud_storage"] +badges: + type: "breaking change" + domain: ["sinks"] + sinks: ["gcp_cloud_storage"] --- GCP Cloud Storage buckets with [uniform bucket-level access](https://cloud.google.com/storage/docs/uniform-bucket-level-access) @@ -27,5 +29,3 @@ the `acl` option: ``` That's it! - - diff --git a/docs/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md b/docs/content/en/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md similarity index 78% rename from docs/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md rename to docs/content/en/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md index cede1851e5452..864018fa74add 100644 --- a/docs/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md +++ b/docs/content/en/highlights/2020-04-09-set-search_dirs-to-config-dirs-by-default.md @@ -1,13 +1,16 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Set the Lua transform `search_dirs` option to Vector's config dir by default" +short: Default `search_dirs` for Lua description: "This allows you to place Lua scripts in the same dir as your Vector config" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] hide_on_release_notes: true pr_numbers: [2274] release: "0.9.0" -tags: ["type: breaking change", "domain: transforms", "transform: lua"] +badges: + type: "breaking change" + domains: ["transforms"] + transforms: ["lua"] --- As part of our recent Lua improvements we've defaulted the `search_dirs` option @@ -21,11 +24,9 @@ Make the following changes in your `vector.toml` file if your Lua files are not in the same directory as your Vector configuration file: ```diff title="vector.toml" - [transform.my-script] +[transform.my-script] type = "lua" + search_dirs = "/my/other/dir" ``` That's it! - - diff --git a/docs/highlights/2020-04-17-new-sinks.md b/docs/content/en/highlights/2020-04-17-new-sinks.md similarity index 62% rename from docs/highlights/2020-04-17-new-sinks.md rename to docs/content/en/highlights/2020-04-17-new-sinks.md index aaf1658015df1..a35138bb1f8c0 100644 --- a/docs/highlights/2020-04-17-new-sinks.md +++ b/docs/content/en/highlights/2020-04-17-new-sinks.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-04-17" -$schema: ".schema.json" +date: "2020-04-17" title: "4 New Sinks!" description: "Papertrail, Honeycomb, Pulsar, and DataDog Logs" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1835, 1847, 1665, 1832] release: "0.9.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sinks"] +badges: + type: "new feature" + domains: ["sinks"] --- We all love a good sink. Now you can enjoy our latest offerings: @@ -20,8 +21,8 @@ We all love a good sink. Now you can enjoy our latest offerings: Expanding support is a fundamental requirement we're aiming to achieve before hitting [1.0][urls.vector_roadmap]. -[docs.sinks.datadog_logs]: /docs/reference/sinks/datadog_logs/ -[docs.sinks.honeycomb]: /docs/reference/sinks/honeycomb/ -[docs.sinks.papertrail]: /docs/reference/sinks/papertrail/ -[docs.sinks.pulsar]: /docs/reference/sinks/pulsar/ +[docs.sinks.datadog_logs]: /docs/reference/configuration/sinks/datadog_logs/ +[docs.sinks.honeycomb]: /docs/reference/configuration/sinks/honeycomb/ +[docs.sinks.papertrail]: /docs/reference/configuration/sinks/papertrail/ +[docs.sinks.pulsar]: /docs/reference/configuration/sinks/pulsar/ [urls.vector_roadmap]: https://github.com/timberio/vector/milestones?direction=asc&sort=due_date&state=open diff --git a/docs/highlights/2020-04-20-improved-shutdown.md b/docs/content/en/highlights/2020-04-20-improved-shutdown.md similarity index 86% rename from docs/highlights/2020-04-20-improved-shutdown.md rename to docs/content/en/highlights/2020-04-20-improved-shutdown.md index d292d21ca0e8b..18c653136297c 100644 --- a/docs/highlights/2020-04-20-improved-shutdown.md +++ b/docs/content/en/highlights/2020-04-20-improved-shutdown.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-04-20" -$schema: ".schema.json" +date: "2020-04-20" title: "Improved Shutdown" description: "A faster and more reliable shutdown process" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1994] release: "0.9.0" hide_on_release_notes: false -tags: ["type: enhancement", "domain: topology"] +badges: + type: "enhancement" + domains: ["topology"] --- A graceful shutdown process is often a problematic achievement in software. diff --git a/docs/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md b/docs/content/en/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md similarity index 88% rename from docs/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md rename to docs/content/en/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md index 95b289554920b..d5b29977ccb19 100644 --- a/docs/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md +++ b/docs/content/en/highlights/2020-05-04-shutdown-vector-if-all-sources-finish.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Vector gracefully exits when specific sources finish" description: "One step closer to Vector replacing awk and sed!" -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2533] release: "0.10.0" -tags: ["type: enhancement", "source: stdin"] +badges: + type: "enhancement" + sources: ["stdin"] --- We heard from some folks they were using Vector as a data processor in command line scripts! diff --git a/docs/highlights/2020-05-05-add-support-for-include-exclude-units.md b/docs/content/en/highlights/2020-05-05-add-support-for-include-exclude-units.md similarity index 87% rename from docs/highlights/2020-05-05-add-support-for-include-exclude-units.md rename to docs/content/en/highlights/2020-05-05-add-support-for-include-exclude-units.md index 3ad87ea3e5617..d4c5a42d3248c 100644 --- a/docs/highlights/2020-05-05-add-support-for-include-exclude-units.md +++ b/docs/content/en/highlights/2020-05-05-add-support-for-include-exclude-units.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-14" -$schema: ".schema.json" +date: "2020-07-14" title: "Journald Unit Filtering Exclusions" description: "The journald source can now exclude units." -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2540] release: "0.10.0" -tags: ["type: new feature", "source: journald"] +badges: + type: "new feature" + sources: ["journald"] --- Often when you tap into the Journald source you're only really interested in a subset of the units, previously, Vector supported this. However, sometimes you just want to exclude one or two. diff --git a/docs/highlights/2020-05-13-add-regexset-support-to-regex.md b/docs/content/en/highlights/2020-05-13-add-regexset-support-to-regex.md similarity index 74% rename from docs/highlights/2020-05-13-add-regexset-support-to-regex.md rename to docs/content/en/highlights/2020-05-13-add-regexset-support-to-regex.md index 231fb2ae46a81..0502eefd20108 100644 --- a/docs/highlights/2020-05-13-add-regexset-support-to-regex.md +++ b/docs/content/en/highlights/2020-05-13-add-regexset-support-to-regex.md @@ -1,16 +1,18 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "RegexSet support to `regex` transform" description: "Efficiently run multiple regexes in the same transform!" -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2493] release: "0.10.0" -tags: ["type: enhancement", "domain: transforms", "transform: regex_parser"] +badges: + type: "enhancement" + domains: ["transforms"] + transforms: ["regex_parser"] --- -Contributor [Mattias Endler (@mre)][urls.endler_dev] taught the [`regex_parser` transform][urls.vector_regex_parser] how to handle multiple regex'es at a time efficiently! +Contributor [Mattias Endler (@mre)][urls.endler_dev] taught the [`regex_parser` transform][urls.vector_regex_parser] how to handle multiple regexes at a time efficiently! ## Get Started @@ -31,4 +33,4 @@ In order to avoid a **deprecation warning** you should update any `regex_parser` You should also review your pipelines for instances where you have a `regex_parser -> [... ->] regex_parser` step, you may be able to collapse these now and shave a few a nanoseconds off your events. 😉 [urls.endler_dev]: https://endler.dev/ -[urls.vector_regex_parser]: https://vector.dev/docs/reference/transforms/regex_parser/ +[urls.vector_regex_parser]: /docs/reference/vrl/functions/#parse_regex diff --git a/docs/highlights/2020-05-20-add-bearer-auth-strategy.md b/docs/content/en/highlights/2020-05-20-add-bearer-auth-strategy.md similarity index 82% rename from docs/highlights/2020-05-20-add-bearer-auth-strategy.md rename to docs/content/en/highlights/2020-05-20-add-bearer-auth-strategy.md index 6d17fe754a9bc..b3c6f21346629 100644 --- a/docs/highlights/2020-05-20-add-bearer-auth-strategy.md +++ b/docs/content/en/highlights/2020-05-20-add-bearer-auth-strategy.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Now supporting the bearer auth strategy" description: "Vector can now bear authentication tokens for relevant components." -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2607] release: "0.10.0" -tags: ["type: enhancement", "domain: sinks", "sink: http"] +badges: + type: "enhancement" + domains: ["sinks"] + sinks: ["http"] --- The light reading material of [IETF RFC 6750][urls.ietf_rfc_6750] taught us all about how bearer auth works, right? @@ -36,4 +38,4 @@ Just drop your token in, and you're done. [urls.ietf_rfc_6750]: https://tools.ietf.org/html/rfc6750 [urls.twelve_factor_app]: https://12factor.net/ -[urls.vector_http_auth_token]: https://vector.dev/docs/reference/sinks/http/#token +[urls.vector_http_auth_token]: /docs/reference/configuration/sinks/http/#auth.token diff --git a/docs/highlights/2020-05-27-add-support-for-loading-multiple-cas.md b/docs/content/en/highlights/2020-05-27-add-support-for-loading-multiple-cas.md similarity index 85% rename from docs/highlights/2020-05-27-add-support-for-loading-multiple-cas.md rename to docs/content/en/highlights/2020-05-27-add-support-for-loading-multiple-cas.md index 933e9208bd788..47ae18541946f 100644 --- a/docs/highlights/2020-05-27-add-support-for-loading-multiple-cas.md +++ b/docs/content/en/highlights/2020-05-27-add-support-for-loading-multiple-cas.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Support for loading multiple CAs" description: "Complicated PEM? No PEM-blem with Vector!" -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2616] release: "0.10.0" -tags: ["type: enhancement", "source: socket"] +badges: + type: "enhancement" + sources: ["socket"] --- Working with `openssl` isn't very fun, and we don't want to inflict that on you. Vector can deal non-trivial certificate chains now. This means if you have a `.pem` file with 2 chains of 4 certs, well, Vector should be able to work it out. diff --git a/docs/highlights/2020-06-10-consolidate-and-beautify-validate.md b/docs/content/en/highlights/2020-06-10-consolidate-and-beautify-validate.md similarity index 85% rename from docs/highlights/2020-06-10-consolidate-and-beautify-validate.md rename to docs/content/en/highlights/2020-06-10-consolidate-and-beautify-validate.md index 71c9459709ae8..bf1cf9e0447f2 100644 --- a/docs/highlights/2020-06-10-consolidate-and-beautify-validate.md +++ b/docs/content/en/highlights/2020-06-10-consolidate-and-beautify-validate.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-13" -$schema: ".schema.json" +date: "2020-07-13" title: "Beautification of the validate command" description: "A little polish on a useful feature." -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2622] release: "0.10.0" -tags: ["type: enhancement", "domain: ux"] +badges: + type: "enhancement" + domains: ["ux"] --- We gave `vector validate` some touching up to make it look better, and feel nicer to use. This was heavily inspired by the fantastic `linkerd validate` command. diff --git a/docs/highlights/2020-06-18-remove-custom-dns-resolution.md b/docs/content/en/highlights/2020-06-18-remove-custom-dns-resolution.md similarity index 90% rename from docs/highlights/2020-06-18-remove-custom-dns-resolution.md rename to docs/content/en/highlights/2020-06-18-remove-custom-dns-resolution.md index c87d68d2a4c85..e93b67b111efc 100644 --- a/docs/highlights/2020-06-18-remove-custom-dns-resolution.md +++ b/docs/content/en/highlights/2020-06-18-remove-custom-dns-resolution.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2020-07-23" -$schema: ".schema.json" +date: "2020-07-23" title: "Custom DNS resolution removal" description: "Vector once again follows the guidance of the host on DNS lookups." -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2812] release: "0.10.0" -tags: ["type: breaking change"] +badges: + type: "breaking change" --- In Vector 0.10.0, we no longer support custom DNS servers. This feature was adding considerable code complexity and is better handled outside of Vector through tools like [`systemd-resolved`][urls.systemd_resolved]. diff --git a/docs/highlights/2020-06-27-add-sasl-to-kafka.md b/docs/content/en/highlights/2020-06-27-add-sasl-to-kafka.md similarity index 78% rename from docs/highlights/2020-06-27-add-sasl-to-kafka.md rename to docs/content/en/highlights/2020-06-27-add-sasl-to-kafka.md index a92e47a4c7a94..8d231056ee1ba 100644 --- a/docs/highlights/2020-06-27-add-sasl-to-kafka.md +++ b/docs/content/en/highlights/2020-06-27-add-sasl-to-kafka.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-07-15" -$schema: ".schema.json" +date: "2020-07-15" title: "Kafka components support SASL" description: "Vector has a new way to authenticate with Kafka!" -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2897] release: "0.10.0" -tags: ["type: new feature", "domain: sinks", "sink: kafka"] +badges: + type: "new feature" + domains: ["sinks"] + sinks: ["kafka"] --- The Kafka source and sink now support [SASL authentication][urls.kafka_sasl]. @@ -28,11 +30,9 @@ You can review the option in the [component docs][urls.vector_sink_kafka_sasl]. + sasl.username = "username" # optional, no default ``` - - +{{< warning >}} This feature isn't yet supported on Windows. - - +{{< /warning >}} [urls.kafka_sasl]: https://docs.confluent.io/current/kafka/authentication_sasl/index.html -[urls.vector_sink_kafka_sasl]: https://vector.dev/docs/reference/sources/kafka/#sasl +[urls.vector_sink_kafka_sasl]: /docs/reference/configuration/sources/kafka/#sasl diff --git a/docs/highlights/2020-07-06-add-compression-option-for-aws-sinks.md b/docs/content/en/highlights/2020-07-06-add-compression-option-for-aws-sinks.md similarity index 77% rename from docs/highlights/2020-07-06-add-compression-option-for-aws-sinks.md rename to docs/content/en/highlights/2020-07-06-add-compression-option-for-aws-sinks.md index 87089f42c2aef..32f4e6d7354ca 100644 --- a/docs/highlights/2020-07-06-add-compression-option-for-aws-sinks.md +++ b/docs/content/en/highlights/2020-07-06-add-compression-option-for-aws-sinks.md @@ -1,20 +1,14 @@ --- -last_modified_on: "2020-07-14" -$schema: ".schema.json" +date: "2020-07-14" title: "New compression options for some sinks" description: "Stuff more data down a smaller hose in less time for cheaper." -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2953, 2637, 2679, 2682] release: "0.10.0" -tags: - [ - "type: new feature", - "sink: aws_s3", - "sink: humio_logs", - "sink: aws_kinesis_firehose", - "sink: aws_kinesis_streams", - ] +badges: + type: "new feature" + sinks: ["aws_kinesis_firehose", "aws_kinesis_streams", "aws_s3", "humio_logs"] --- Several sinks, including most AWS sinks as well as [Humio][urls.humio] and [New Relic][urls.new_relic] have had compression options added. diff --git a/docs/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md b/docs/content/en/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md similarity index 95% rename from docs/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md rename to docs/content/en/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md index 66d73a6fd2f28..e94158adc005c 100644 --- a/docs/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md +++ b/docs/content/en/highlights/2020-07-09-add-musl-and-glibc-support-to-install-sh.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-17" -$schema: ".schema.json" +date: "2020-07-17" title: "Leveraging glibc when possible" description: "If your Linux uses glibc, Vector will too." -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2969, 2518] release: "0.10.0" -tags: ["type: performance", "domain: operations"] +badges: + type: "performance" + domains: ["operations"] --- As a result of some recent profiling and benchmarking, we determined that builds of Vector targeting `x86_64-unknown-linux-gnu` outperformed builds targeting `x86_64-unknown-linux-musl` under most usage scenarios on supported operating systems. diff --git a/docs/highlights/2020-07-10-add-reduce-transform.md b/docs/content/en/highlights/2020-07-10-add-reduce-transform.md similarity index 91% rename from docs/highlights/2020-07-10-add-reduce-transform.md rename to docs/content/en/highlights/2020-07-10-add-reduce-transform.md index 52f61fd1c2687..96b757c11f88c 100644 --- a/docs/highlights/2020-07-10-add-reduce-transform.md +++ b/docs/content/en/highlights/2020-07-10-add-reduce-transform.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-07-17" -$schema: ".schema.json" +date: "2020-07-17" title: "New Reduce transform" description: "Canonical Log Lines in Vector" -author_github: "https://github.com/hoverbear" +authors: ["hoverbear"] hide_on_release_notes: false pr_numbers: [2870] release: "0.10.0" -tags: ["type: new feature", "domain: transforms"] +badges: + type: "new feature" + domains: ["transforms"] --- Fan of [Stripe's Canonical Log Lines][urls.stripe_blog_canonical_log_lines]? We are too. You can now find a new [Reduce][docs.transforms.reduce]! This allows you to turn a stream of many small events into a stream of less small events! @@ -27,7 +28,7 @@ Let's build similar in Vector! We'll take a series of events: -```log file=input.log +```log title=input.log {"timestamp": "...", "message": "Received GET /path", "request_id": "abcd1234", "request_path": "/path", "request_params": "..."} {"timestamp": "...", "message": "Executed query in 5.2ms", "request_id": "abcd1234", "query": "SELECT * FROM table", "query_duration_ms": 5.2} {"timestamp": "...", "message": "Rendered partial _partial.erb in 2.3ms", "request_id": "abcd1234", "template": "_partial.erb", "render_duration_ms": 2.3} @@ -37,7 +38,7 @@ We'll take a series of events: Then output this (but not formatted so nicely!): -```json file=output.log +```json title=output.log { "timestamp_start": "...", "timestamp_end": "...", @@ -53,7 +54,7 @@ Then output this (but not formatted so nicely!): We'll run this config: -```toml file=vector.toml +```toml title=vector.toml data_dir = "tmp" [sources.source0] @@ -93,5 +94,5 @@ data_dir = "tmp" We hope you find this useful! -[docs.transforms.reduce]: /docs/reference/transforms/reduce/ +[docs.transforms.reduce]: /docs/reference/configuration/transforms/reduce/ [urls.stripe_blog_canonical_log_lines]: https://stripe.com/blog/canonical-log-lines diff --git a/docs/highlights/2020-08-31-mpl-2-0-license.md b/docs/content/en/highlights/2020-08-31-mpl-2-0-license.md similarity index 92% rename from docs/highlights/2020-08-31-mpl-2-0-license.md rename to docs/content/en/highlights/2020-08-31-mpl-2-0-license.md index 3d9b3b1b4f42a..1e7fe0347dd2b 100644 --- a/docs/highlights/2020-08-31-mpl-2-0-license.md +++ b/docs/content/en/highlights/2020-08-31-mpl-2-0-license.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2020-08-31" -$schema: ".schema.json" +date: "2020-08-31" title: "Switching to the MPL 2.0 License" description: "The Vector project has switched to the Mozilla Public License 2.0" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [1314] release: "0.11.0" hide_on_release_notes: true -tags: ["type: announcement"] +badges: + type: "announcement" --- Vector has switched to the [Mozilla Public License 2.0][urls.mpl_20], a diff --git a/docs/highlights/2020-09-18-adaptive-concurrency.md b/docs/content/en/highlights/2020-09-18-adaptive-concurrency.md similarity index 84% rename from docs/highlights/2020-09-18-adaptive-concurrency.md rename to docs/content/en/highlights/2020-09-18-adaptive-concurrency.md index 0b6fd86e267e2..75aaf87dbd701 100644 --- a/docs/highlights/2020-09-18-adaptive-concurrency.md +++ b/docs/content/en/highlights/2020-09-18-adaptive-concurrency.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-09-18" -$schema: ".schema.json" +date: "2020-09-18" title: "Adaptive Request Concurrency (ARC)" description: "Increasing reliability and performance across your entire observability infrastructure." -author_github: "https://github.com/lucperkins" +authors: ["lucperkins"] pr_numbers: [3094] release: "0.11.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: networking", "domain: reliability", "domain: performance"] +badges: + type: "new feature" + domains: ["networking"] + domains: ["performance", "reliability"] --- Vector 0.11 includes a new Adaptive Request Concurrency (ARC) feature that diff --git a/docs/highlights/2020-10-27-kubernetes-integration.md b/docs/content/en/highlights/2020-10-27-kubernetes-integration.md similarity index 89% rename from docs/highlights/2020-10-27-kubernetes-integration.md rename to docs/content/en/highlights/2020-10-27-kubernetes-integration.md index fe5811b953e0e..8dfcb37caae9a 100644 --- a/docs/highlights/2020-10-27-kubernetes-integration.md +++ b/docs/content/en/highlights/2020-10-27-kubernetes-integration.md @@ -1,14 +1,16 @@ --- -last_modified_on: "2020-10-27" -$schema: ".schema.json" +date: "2020-10-27" title: "First-class Kubernetes integration" description: "Vector officially supports Kubernetes with a first-class integration." -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] featured: true pr_numbers: [1314] release: "0.11.0" hide_on_release_notes: false -tags: ["type: featured", "domain: platforms", "platform: kubernetes"] +badges: + type: "featured" + domains: ["platforms"] + platforms: ["kubernetes"] --- After eight months of development, [100 pull requests][kubernetes_pull_requests], @@ -44,5 +46,5 @@ To get started, follow the install instructions: [config_formats_highlight]: /highlights/2020-11-25-json-yaml-config-formats/ [announcement_post]: /blog/kubernetes-integration/ [installation_docs]: /docs/setup/installation/platforms/kubernetes/ -[kubernetes_logs_source]: /docs/reference/sources/kubernetes_logs/ +[kubernetes_logs_source]: /docs/reference/configuration/sources/kubernetes_logs/ [kubernetes_pull_requests]: https://github.com/timberio/vector/pulls?q=is%3Apr+sort%3Aupdated-desc+kubernetes+is%3Aclosed diff --git a/docs/highlights/2020-10-27-metrics-integrations.md b/docs/content/en/highlights/2020-10-27-metrics-integrations.md similarity index 78% rename from docs/highlights/2020-10-27-metrics-integrations.md rename to docs/content/en/highlights/2020-10-27-metrics-integrations.md index 008f9053716a3..50bd6e8132ca1 100644 --- a/docs/highlights/2020-10-27-metrics-integrations.md +++ b/docs/content/en/highlights/2020-10-27-metrics-integrations.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-10-27" -$schema: ".schema.json" +date: "2020-10-27" title: "New metrics integrations" description: "Collect metrics from your host, Apache, Nginx, and Mongodb." -author_github: "https://github.com/jamtur01" +authors: ["jamtur01"] pr_numbers: [3704, 4157, 4500, 4698, 5209] release: "0.11.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: metrics", "domain: sources"] +badges: + type: "new feature" + domains: ["metrics", "sources"] --- Vector 0.11 includes new metrics sources: @@ -57,12 +58,12 @@ We'd love to chat! We're eager to unblock the transition. If Vector is missing a metrics integration or feature, [chat with us][chat]. We are working closely with a number of organizations to assist with this transition. -[apache_metrics_source]: /docs/reference/sources/apache_metrics/ -[aws_ecs_metrics_source]: /docs/reference/sources/aws_ecs_metrics/ +[apache_metrics_source]: /docs/reference/configuration/sources/apache_metrics/ +[aws_ecs_metrics_source]: /docs/reference/configuration/sources/aws_ecs_metrics/ [chat]: https://chat.vector.dev -[docs]: /docs/ -[host_metrics_source]: /docs/reference/sources/host_metrics/ -[internal_metrics_source]: /docs/reference/sources/internal_metrics/ +[docs]: /docs +[host_metrics_source]: /docs/reference/configuration/sources/host_metrics/ +[internal_metrics_source]: /docs/reference/configuration/sources/internal_metrics/ [kubernetes_announcement]: /blog/kubernetes-integration/ -[mongodb_metrics_source]: /docs/reference/sources/mongodb_metrics/ -[nginx_metrics_source]: /docs/reference/sources/nginx_metrics/ +[mongodb_metrics_source]: /docs/reference/configuration/sources/mongodb_metrics/ +[nginx_metrics_source]: /docs/reference/configuration/sources/nginx_metrics/ diff --git a/docs/highlights/2020-10-28-new-aws-integrations.md b/docs/content/en/highlights/2020-10-28-new-aws-integrations.md similarity index 71% rename from docs/highlights/2020-10-28-new-aws-integrations.md rename to docs/content/en/highlights/2020-10-28-new-aws-integrations.md index d43722f9dfa65..f982464f94d52 100644 --- a/docs/highlights/2020-10-28-new-aws-integrations.md +++ b/docs/content/en/highlights/2020-10-28-new-aws-integrations.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2020-10-27" -$schema: ".schema.json" +date: "2020-10-27" title: "New AWS integrations" description: "Export observability data out of AWS." -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [4101, 4779] release: "0.11.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sources", "platform: aws"] +badges: + type: "new feature" + domains: ["sources"] + platforms: ["aws"] --- Getting observability data out of AWS can sometimes feel like you're in a @@ -30,12 +32,12 @@ CloudWatch logs to any supported Vector [sink][sinks]. We're eager to hear what you think about these sources! [Join our chat][chat] and let us know. -[aws_cloudwatch_logs_subscription_parser_transform]: /docs/reference/transforms/aws_cloudwatch_logs_subscription_parser/ -[aws_ecs_metrics_source]: /docs/reference/sources/aws_ecs_metrics/ -[aws_kinesis_firehose_source]: /docs/reference/sources/aws_kinesis_firehose/ -[aws_s3_source]: /docs/reference/sources/aws_s3/ -[aws_sqs_sink]: /docs/reference/sinks/aws_sqs/ +[aws_cloudwatch_logs_subscription_parser_transform]: /docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser/ +[aws_ecs_metrics_source]: /docs/reference/configuration/sources/aws_ecs_metrics/ +[aws_kinesis_firehose_source]: /docs/reference/configuration/sources/aws_kinesis_firehose/ +[aws_s3_source]: /docs/reference/configuration/sources/aws_s3/ +[aws_sqs_sink]: /docs/reference/configuration/sinks/aws_sqs/ [chat]: https://chat.vector.dev [cloudwatch_guide]: /guides/advanced/cloudwatch-logs-firehose/ [rube_goldberg]: https://en.wikipedia.org/wiki/Rube_Goldberg_machine -[sinks]: /docs/reference/sinks/ +[sinks]: /docs/reference/configuration/sinks/ diff --git a/docs/highlights/2020-11-19-prometheus-remote-integrations.md b/docs/content/en/highlights/2020-11-19-prometheus-remote-integrations.md similarity index 89% rename from docs/highlights/2020-11-19-prometheus-remote-integrations.md rename to docs/content/en/highlights/2020-11-19-prometheus-remote-integrations.md index fe5fd8a3a7777..a3721e7b09bbb 100644 --- a/docs/highlights/2020-11-19-prometheus-remote-integrations.md +++ b/docs/content/en/highlights/2020-11-19-prometheus-remote-integrations.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-11-19" -$schema: ".schema.json" +date: "2020-11-19" title: "Support for the Prometheus remote write protocol" description: "Interoperability with the Prometheus ecosystem." -author_github: "https://github.com/jamtur01" +authors: ["jamtur01"] pr_numbers: [4856, 5144] release: "0.11.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: metrics", "domain: sources"] +badges: + type: "new feature" + domains: ["metrics", "sources"] --- We're big fans of Prometheus at Timber, and as an extension of our Kubernetes @@ -82,8 +83,8 @@ your metrics to [Datadog][datadog], [New Relic][new_relic], [Influx][influx], [influx]: https://www.influxdata.com/ [kubernetes_highlight]: /highlights/2020-10-27-kubernetes-integration [new_relic]: https://newrelic.com -[prometheus_remote_write_sink]: /docs/reference/sinks/prometheus_remote_write -[prometheus_remote_write_source]: /docs/reference/sources/prometheus_remote_write -[sinks]: /docs/reference/sinks/ +[prometheus_remote_write_sink]: /docs/reference/configuration/sinks/prometheus_remote_write +[prometheus_remote_write_source]: /docs/reference/configuration/sources/prometheus_remote_write +[sinks]: /docs/reference/configuration/sinks/ [timescale]: https://www.timescale.com/ [victoria_metrics]: https://victoriametrics.com/ diff --git a/docs/highlights/2020-11-25-json-yaml-config-formats.md b/docs/content/en/highlights/2020-11-25-json-yaml-config-formats.md similarity index 85% rename from docs/highlights/2020-11-25-json-yaml-config-formats.md rename to docs/content/en/highlights/2020-11-25-json-yaml-config-formats.md index 26934785b6d06..db44d80923daf 100644 --- a/docs/highlights/2020-11-25-json-yaml-config-formats.md +++ b/docs/content/en/highlights/2020-11-25-json-yaml-config-formats.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-11-25" -$schema: ".schema.json" -title: "JSON & YAML config formats are now supported" +date: "2020-11-25" +title: "JSON and YAML config formats are now supported" description: "We've added support for JSON and YAML config formats." -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [4856, 5144] release: "0.11.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: config"] +badges: + type: "new feature" + domains: ["config"] --- To ensure Vector fits into existing workflows, like Kubernetes, we've added @@ -52,7 +53,7 @@ vector --config-json /etc/vector/vector.json Head over to the [configuration docs][config] for more info. -[config]: /docs/setup/configuration/ +[config]: /docs/reference/configuration [cue]: https://cuelang.org/ [jsonnet]: https://jsonnet.org/ [jsonnet_library]: https://github.com/xunleii/vector_jsonnet diff --git a/docs/highlights/2020-12-01-0-11-upgrade-guide.md b/docs/content/en/highlights/2020-12-01-0-11-upgrade-guide.md similarity index 88% rename from docs/highlights/2020-12-01-0-11-upgrade-guide.md rename to docs/content/en/highlights/2020-12-01-0-11-upgrade-guide.md index 3af88216a2a86..408c4dc5379c1 100644 --- a/docs/highlights/2020-12-01-0-11-upgrade-guide.md +++ b/docs/content/en/highlights/2020-12-01-0-11-upgrade-guide.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2020-12-01" -$schema: ".schema.json" +date: "2020-12-01" title: "0.11 Upgrade Guide" description: "An upgrade guide that addresses breaking changes in 0.11.0" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [3557, 4580, 4557, 4647, 4918, 3297, 3427, 4103] release: "0.11.0" hide_on_release_notes: false -tags: ["type: breaking change"] +badges: + type: "breaking change" --- 0.11 includes some minor breaking changes: @@ -24,7 +24,7 @@ We cover each below to help you upgrade quickly: ## Upgrade Guide -### Breaking: The metrics emitted by the `internal_metrics` source have changed names +### Breaking: The metrics emitted by the `internal_metrics` source have changed names {#second} We have not officially announced the `internal_metrics` source (coming in 0.12) due to the high probability of metric name changes.Since then we've settled on a @@ -41,7 +41,7 @@ You'll likely need to update any downstream consumers of this data. We plan to ship official Vector dashboards in 0.12 that will relieve this maintenance burden for you in the future. -### Breaking: The `statsd` sink now supports all socket types +### Breaking: The `statsd` sink now supports all socket types {#third} If you're using the [`statsd` sink][statsd_sink] you'll need to add the new `mode` option that specifies which protocol you'd like to use. Previously, the @@ -53,7 +53,7 @@ only protocol available was UDP. + mode = "udp" ``` -### Breaking: The `source_type` field is now explicit in the `splunk_hec` sink +### Breaking: The `source_type` field is now explicit in the `splunk_hec` sink {#fifth} Previously, the `splunk_hec` sink was using the event's `source_type` field and mapping that to Splunk's expected `sourcetype` field. Splunk uses this @@ -70,7 +70,7 @@ option: Only set this field if you want to explicitly inform Splunk of your `message` field's format. Most users will not want to set this field. -### Breaking: Remove forwarding to syslog from distributed systemd unit +### Breaking: Remove forwarding to syslog from distributed systemd unit {#sixth} Vector's previous Systemd unit file included configuration that forwarded Vector's logs over Syslog. This was presumptuous and we've removed these @@ -80,7 +80,7 @@ If you'd like Vector to continue logging to Syslog, you'll need to add back the [removed options][removed_systemd_syslog_options], but most users should not have to do anything. -### Breaking: The `http` source no longer dedots JSON fields +### Breaking: The `http` source no longer dedots JSON fields {#seventh} Previously, the `http` source would dedot JSON keys in incoming data. This means that a JSON payload like this: @@ -107,7 +107,7 @@ been corrected and your events will keep `.` in their key names. There is nothing you need to do to upgrade except understand that your data structure may change if it contained `.` characters in the keys. -### Deprecation: The `prometheus` sink has been renamed to `prometheus_exporter` +### Deprecation: The `prometheus` sink has been renamed to `prometheus_exporter` {#first} The `prometheus` sink has been renamed to `prometheus_exporter` since 0.11 introduced a new `prometheus_remote_write` sink. This renaming distringuishes @@ -121,7 +121,7 @@ between the two. Upgrading is easy: + default_namesapce = "..." ``` -### Deprecation: The `reduce` transform `identifier_fields` was renamed to `group_by` +### Deprecation: The `reduce` transform `identifier_fields` was renamed to `group_by` {#fourth} We renamed the `reduce` transform's `identifier_fields` option to `group_by` for clarity. We are repositioning this transform to handle broad reduce @@ -134,9 +134,9 @@ operations, such as merging multi-line logs together: + group_by = ["my_field"] ``` -[internal_metrics_output]: /docs/reference/sources/internal_metrics/#metric-events +[internal_metrics_output]: /docs/reference/configuration/sources/internal_metrics/#output-metrics [metric_names_diff]: https://github.com/timberio/vector/pull/4647/files [metric_naming_convention]: https://github.com/timberio/vector/blob/master/CONTRIBUTING.md#metric-naming-convention [prometheus_naming_convention]: https://prometheus.io/docs/practices/naming/ [removed_systemd_syslog_options]: https://github.com/timberio/vector/pull/3427/files -[statsd_sink]: /docs/reference/sinks/statsd/ +[statsd_sink]: /docs/reference/configuration/sinks/statsd/ diff --git a/docs/highlights/2020-12-23-graphql-api.md b/docs/content/en/highlights/2020-12-23-graphql-api.md similarity index 91% rename from docs/highlights/2020-12-23-graphql-api.md rename to docs/content/en/highlights/2020-12-23-graphql-api.md index dc5f07abc7b4e..a807eb0394454 100644 --- a/docs/highlights/2020-12-23-graphql-api.md +++ b/docs/content/en/highlights/2020-12-23-graphql-api.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-12-23" -$schema: ".schema.json" +date: "2020-12-23" title: "The GraphQL API for Vector" description: "View Vector metrics and explore Vector topologies using GraphQL" -author_github: "https://github.com/lucperkins" +authors: ["lucperkins"] pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: api"] +badges: + type: "new feature" + domains: ["api"] --- Vector now has a [GraphQL] API that you can use for a variety of purposes: diff --git a/docs/highlights/2020-12-23-internal-logs-source.md b/docs/content/en/highlights/2020-12-23-internal-logs-source.md similarity index 81% rename from docs/highlights/2020-12-23-internal-logs-source.md rename to docs/content/en/highlights/2020-12-23-internal-logs-source.md index d64f15e01cbae..b90f1899975e8 100644 --- a/docs/highlights/2020-12-23-internal-logs-source.md +++ b/docs/content/en/highlights/2020-12-23-internal-logs-source.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2020-12-23" -$schema: ".schema.json" +date: "2020-12-23" title: "The `internal_logs` source" description: "A new source for observing Vector itself" -author_github: "https://github.com/lucperkins" +authors: ["lucperkins"] pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: new feature", "source: internal_logs"] +badges: + type: "new feature" + sources: ["internal_logs"] --- Vector has a new [`internal_logs`][internal_logs] source that you can use to @@ -57,6 +58,6 @@ inputs = ["vector_metrics"] address = "0.0.0.0:9090" ``` -[internal_logs]: https://vector.dev/docs/reference/sources/internal_logs -[internal_metrics]: https://vector.dev/docs/reference/sources/internal_metrics +[internal_logs]: /docs/reference/configuration/sources/internal_logs +[internal_metrics]: /docs/reference/configuration/sources/internal_metrics [prometheus]: https://prometheus.io diff --git a/docs/highlights/2020-12-23-vector-top.md b/docs/content/en/highlights/2020-12-23-vector-top.md similarity index 84% rename from docs/highlights/2020-12-23-vector-top.md rename to docs/content/en/highlights/2020-12-23-vector-top.md index 5e79df4e8a76b..9e981e2902946 100644 --- a/docs/highlights/2020-12-23-vector-top.md +++ b/docs/content/en/highlights/2020-12-23-vector-top.md @@ -1,14 +1,16 @@ --- -last_modified_on: "2020-12-23" -$schema: ".schema.json" +date: "2020-12-23" title: "Introducing `vector top`" description: "A CLI dashboard interface for monitoring Vector instances." -author_github: "https://github.com/lucperkins" +authors: ["lucperkins"] featured: true pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: cli", "domain: observability"] +badges: + type: "new feature" + domains: ["cli"] + domains: ["observability"] --- [`vector top`][top] is a command for the Vector [CLI] that displays both metrics emitted by your Vector instance as well @@ -21,7 +23,7 @@ vector top --url https://my-vector-instance.prod.acmecorp.biz That pulls up an interface that looks like this: -![vector top example screen](/img/blog/2020-12-07-graphql-api/vector-top.png) +![vector top example screen](/img/blog/vector-top.png) By default, the `vector top` looks for a Vector instance running locally at http://localhost:8686, but you can also monitor remote instances, as in the example above. The information displayed updates every second by default, but you diff --git a/docs/highlights/2021-01-10-kafka-sink-metrics.md b/docs/content/en/highlights/2021-01-10-kafka-sink-metrics.md similarity index 74% rename from docs/highlights/2021-01-10-kafka-sink-metrics.md rename to docs/content/en/highlights/2021-01-10-kafka-sink-metrics.md index 257a707f25aea..27304df18745c 100644 --- a/docs/highlights/2021-01-10-kafka-sink-metrics.md +++ b/docs/content/en/highlights/2021-01-10-kafka-sink-metrics.md @@ -1,14 +1,16 @@ --- -last_modified_on: "2021-01-10" -$schema: ".schema.json" +date: "2021-01-10" title: "The `kafka` sink now supports metrics" description: "Send metric events to Kafka" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] featured: false pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: enhancement", "domain: metrics", "sink: kafka"] +badges: + type: "enhancement" + domains: ["metrics"] + sinks: ["kafka"] --- The [`kafka` sink][kafka_sink] now supports metrics, making it possible to send @@ -34,5 +36,5 @@ Instead, we are working to support an open metrics format that the `kafka` source and sink will support. See [issue 5809] for more info. [issue 5809]: https://github.com/timberio/vector/issues/5809 -[kafka_sink]: https://vector.dev/docs/reference/sinks/kafka/ -[metrics data model]: https://vector.dev/docs/about/under-the-hood/architecture/data-model/metric/#schema +[kafka_sink]: /docs/reference/configuration/sinks/kafka/ +[metrics data model]: /docs/about/under-the-hood/architecture/data-model/metric/#schema diff --git a/docs/highlights/2021-01-20-wildcard-identifiers.md b/docs/content/en/highlights/2021-01-20-wildcard-identifiers.md similarity index 84% rename from docs/highlights/2021-01-20-wildcard-identifiers.md rename to docs/content/en/highlights/2021-01-20-wildcard-identifiers.md index 2ed4f16a502d3..75845cda66d98 100644 --- a/docs/highlights/2021-01-20-wildcard-identifiers.md +++ b/docs/content/en/highlights/2021-01-20-wildcard-identifiers.md @@ -1,14 +1,15 @@ --- -last_modified_on: "2021-01-20" -$schema: ".schema.json" +date: "2021-01-20" title: "Wildcards are now supported in component IDs" description: "Wildcards allow for dynamic Vector topologies" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] featured: false pr_numbers: [6170] release: "0.12.0" hide_on_release_notes: false -tags: ["type: enhancement", "domain: topology"] +badges: + type: "enhancement" + domains: ["topology"] --- [PR 6170][pr_6170] introduced wildcards when referencing component IDs in the `inputs` option. This allows you to build diff --git a/docs/highlights/2021-01-31-file-source-checkpointing.md b/docs/content/en/highlights/2021-01-31-file-source-checkpointing.md similarity index 88% rename from docs/highlights/2021-01-31-file-source-checkpointing.md rename to docs/content/en/highlights/2021-01-31-file-source-checkpointing.md index cd3db1e50b862..f4b35dec65146 100644 --- a/docs/highlights/2021-01-31-file-source-checkpointing.md +++ b/docs/content/en/highlights/2021-01-31-file-source-checkpointing.md @@ -1,14 +1,16 @@ --- -last_modified_on: "2021-01-31" -$schema: ".schema.json" +date: "2021-01-31" title: "Improved `file` source checkpointing" description: "The `file` source checkpointing strategy has been improved to solve surprising edge cases." -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] featured: false pr_numbers: [6178] release: "0.12.0" hide_on_release_notes: false -tags: ["type: enhancement", "domain: sources", "source: file"] +badges: + type: "enhancement" + domains: ["sources"] + sources: ["file"] --- The Vector [`file` source][file_source] included an option called `start_at_beginning` that would determine where diff --git a/docs/highlights/2021-02-16-0-12-upgrade-guide.md b/docs/content/en/highlights/2021-02-16-0-12-upgrade-guide.md similarity index 82% rename from docs/highlights/2021-02-16-0-12-upgrade-guide.md rename to docs/content/en/highlights/2021-02-16-0-12-upgrade-guide.md index 0ea96024aa0d8..35ea0cd8c0106 100644 --- a/docs/highlights/2021-02-16-0-12-upgrade-guide.md +++ b/docs/content/en/highlights/2021-02-16-0-12-upgrade-guide.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2021-02-16" -$schema: ".schema.json" +date: "2021-02-16" title: "0.12 Upgrade Guide" description: "An upgrade guide that addresses breaking changes in 0.12.0" -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] pr_numbers: [5281, 5978] release: "0.12.0" hide_on_release_notes: false -tags: ["type: breaking change"] +badges: + type: breaking change --- 0.12 includes minimal breaking changes but significant deprecations. This guide will upgrade you quickly and @@ -65,7 +65,7 @@ While `check_fields` is deprecated and still supported, you will need to explici ```diff [transforms.route] - type = "swimlanes" + type = "route" +lanes.errors.type = "check_field" lanes.errors."level.eq" = "error" ``` @@ -74,7 +74,7 @@ Alteratively, we recommend migrating to the new VRL syntax: ```diff [transforms.route] - type = "swimlanes" + type = "route" -lanes.errors."level.eq" = "error" +lanes.errors = '.level = "error"' ``` @@ -147,33 +147,33 @@ Migrating is easy: Adjust as necessary. The above values are the defaults and are not required to be specified. -[add_fields_transform]: /docs/reference/configuration/transforms/add_fields/ -[add_tags_transform]: /docs/reference/configuration/transforms/add_tags/ -[ansi_stripper_transform]: /docs/reference/configuration/transforms/ansi_stripper/ -[aws_cloudwatch_logs_subscription_parser_transform]: /docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser_transform/ +[add_fields_transform]: /docs/reference/configuration/transforms/remap +[add_tags_transform]: /docs/reference/configuration/transforms/remap +[ansi_stripper_transform]: /docs/reference/vrl/functions/#strip_ansi_escape_codes +[aws_cloudwatch_logs_subscription_parser_transform]: /docs/reference/vrl/functions/#parse_aws_cloudwatch_log_subscription_message [chat]: https://chat.vector.dev -[coercer_transform]: /docs/reference/configuration/transforms/coercer/ -[concat_transform]: /docs/reference/configuration/transforms/concat/ -[config_synytax_pitfalls]: /blog/vector-remap-language/#configuration-langauges-are-bad-at-expressing-data-transformations +[coercer_transform]: /docs/reference/vrl/functions/#coerce-functions +[concat_transform]: /docs/reference/configuration/transforms/remap +[config_synytax_pitfalls]: /blog/vector-remap-language/#config-languages [file_source_highlight]: /highlights/2021-01-31-file-source-checkpointing -[grok_parser_transform]: /docs/reference/configuration/transforms/grok_parser/ -[json_parser_transform]: /docs/reference/configuration/transforms/json_parser/ -[key_value_parser_transform]: /docs/reference/configuration/transforms/key_value_parser/ -[logfmt_parser_transform]: /docs/reference/configuration/transforms/logfmt_parser/ -[merge_transform]: /docs/reference/configuration/transforms/merge/ +[grok_parser_transform]: /docs/reference/vrl/functions/#parse_grok +[json_parser_transform]: /docs/reference/vrl/functions/#parse_json +[key_value_parser_transform]: /docs/reference/vrl/functions/#parse_key_value +[logfmt_parser_transform]: /docs/reference/vrl/functions/#parse_logfmt +[merge_transform]: /docs/reference/vrl/functions/#merge [pr_5281]: https://github.com/timberio/vector/pull/5281 [pr_5978]: https://github.com/timberio/vector/pull/5978 [filter_transform]: /docs/reference/configuration/transforms/filter/ [ignore_checkpoints]: /docs/reference/configuration/sources/file/#ignore_checkpoints [read_from]: /docs/reference/configuration/sources/file/#read_from [reduce_transform]: /docs/reference/configuration/transforms/reduce/ -[regex_parser_transform]: /docs/reference/configuration/transforms/regex_parser/ -[remove_fields_transform]: /docs/reference/configuration/transforms/remove_fields/ -[remove_tags_transform]: /docs/reference/configuration/transforms/remove_tags/ -[rename_fields_transform]: /docs/reference/configuration/transforms/rename_fields/ +[regex_parser_transform]: /docs/reference/vrl/functions/#parse_regex +[remove_fields_transform]: /docs/reference/vrl/functions/#del +[remove_tags_transform]: /docs/reference/configuration/transforms/remap +[rename_fields_transform]: /docs/reference/configuration/transforms/remap [route_transform]: /docs/reference/configuration/transforms/route/ -[split_transform]: /docs/reference/configuration/transforms/split/ -[tokenizer_transform]: /docs/reference/configuration/transforms/tokenizer/ +[split_transform]: /docs/reference/vrl/functions/#split +[tokenizer_transform]: /docs/reference/vrl/functions/#parse_tokens [vrl_announcement]: /blog/vector-remap-language/ [vrl_boolean_expression]: /docs/reference/vrl/expressions/#comparison [vrl_reference]: /docs/reference/vrl/ diff --git a/docs/highlights/2021-02-16-filter-remap-support.md b/docs/content/en/highlights/2021-02-16-filter-remap-support.md similarity index 80% rename from docs/highlights/2021-02-16-filter-remap-support.md rename to docs/content/en/highlights/2021-02-16-filter-remap-support.md index 0bffd3c8ecf19..50d47fbabb7d5 100644 --- a/docs/highlights/2021-02-16-filter-remap-support.md +++ b/docs/content/en/highlights/2021-02-16-filter-remap-support.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2021-02-16" -$schema: ".schema.json" title: "Remap support for the `filter` transform" description: "Use VRL to specify conditions for filtering events in a stream" -author_github: "https://github.com/lucperkins" +date: "2021-02-16" +authors: ["lucperkins"] pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: enhancement", "transform: filter"] +badges: + type: "enhancement" + transforms: ["filter"] --- The [`filter`][filter] transform for Vector enables you to winnow down a stream @@ -39,5 +40,5 @@ condition.type = "remap" condition.source = '.status_code != 200 && !includes(["info", "debug"], .severity)' ``` -[filter]: https://vector.dev/docs/reference/transforms/filter -[remap]: https://vector.dev/docs/reference/transforms/remap +[filter]: /docs/reference/configuration/transforms/filter +[remap]: /docs/reference/configuration/transforms/remap diff --git a/docs/highlights/2021-02-16-reduce-transform-remap-support.md b/docs/content/en/highlights/2021-02-16-reduce-transform-remap-support.md similarity index 84% rename from docs/highlights/2021-02-16-reduce-transform-remap-support.md rename to docs/content/en/highlights/2021-02-16-reduce-transform-remap-support.md index f6864c1a2eecb..a0f880b10d5b4 100644 --- a/docs/highlights/2021-02-16-reduce-transform-remap-support.md +++ b/docs/content/en/highlights/2021-02-16-reduce-transform-remap-support.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2021-02-16" -$schema: ".schema.json" +date: "2021-02-16" title: "Remap support for the `reduce` transform (multi-line logs)" +short: "Reduce in Remap" description: "Use VRL to specify conditions for reducing multi-log lines into a single log event" -author_github: "https://github.com/lucperkins" +authors: ["lucperkins"] pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: enhancement", "transform: reduce"] +badges: + type: "enhancement" + transforms: ["reduce"] --- The [`reduce`][reduce] transform for Vector enables you to reduce multiple log @@ -43,5 +45,5 @@ system (`check_fields`) and the new system (`remap`): +starts_when.source = 'match(.message, /^\\w.*/) && .severity == "info"' ``` -[reduce]: https://vector.dev/docs/reference/transforms/reduce -[remap]: https://vector.dev/docs/reference/transforms/remap +[reduce]: /docs/reference/configuration/transforms/reduce +[remap]: /docs/reference/configuration/transforms/remap diff --git a/docs/highlights/2021-02-16-swimlanes-remap-support.md b/docs/content/en/highlights/2021-02-16-swimlanes-remap-support.md similarity index 81% rename from docs/highlights/2021-02-16-swimlanes-remap-support.md rename to docs/content/en/highlights/2021-02-16-swimlanes-remap-support.md index 7489b59f07061..2214f7c7a443a 100644 --- a/docs/highlights/2021-02-16-swimlanes-remap-support.md +++ b/docs/content/en/highlights/2021-02-16-swimlanes-remap-support.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2021-02-16" -$schema: ".schema.json" +date: "2021-02-16" title: "Remap support for the `swimlanes` transform (routing)" description: "Use VRL to specify conditions for routing events into multiple channels" -author_github: "https://github.com/lucperkins" +authors: ["lucperkins"] pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: enhancement", "transform: swimlanes"] +badges: + type: "enhancement" + transforms: ["swimlanes"] --- The [`swimlanes`][swimlanes] transform for Vector enables you to route events into @@ -25,7 +26,7 @@ Previously, the `swimlanes` transform required you to specify conditions using The example configuration below shows the same `swimlanes` transform using the old system (`check_fields`) and the new system (`remap`): -```dff +```diff [transforms.split_events] type = "swimlanes" inputs = ["http-server-logs"] @@ -40,5 +41,5 @@ old system (`check_fields`) and the new system (`remap`): +lanes.success.source = '.status_code == 200 && .severity == "info"' ``` -[swimlanes]: https://vector.dev/docs/reference/transforms/swimlanes -[remap]: https://vector.dev/docs/reference/transforms/remap +[swimlanes]: /docs/reference/configuration/transforms/route +[remap]: /docs/reference/configuration/transforms/remap diff --git a/docs/highlights/2021-02-16-vector-remap-language.md b/docs/content/en/highlights/2021-02-16-vector-remap-language.md similarity index 83% rename from docs/highlights/2021-02-16-vector-remap-language.md rename to docs/content/en/highlights/2021-02-16-vector-remap-language.md index 02cb09a98e729..9e0d1a5739b24 100644 --- a/docs/highlights/2021-02-16-vector-remap-language.md +++ b/docs/content/en/highlights/2021-02-16-vector-remap-language.md @@ -1,19 +1,22 @@ --- -last_modified_on: "2021-02-16" -$schema: ".schema.json" +date: "2021-02-16" title: "Introducing Vector Remap Language" description: "A lean, fast, and safe language for transforming observability data." -author_github: "https://github.com/binarylogic" +authors: ["binarylogic"] featured: true pr_numbers: [] release: "0.12.0" hide_on_release_notes: false -tags: ["type: featured", "domain: remap"] +badges: + type: "featured" + domains: ["remap"] --- -The Vector team is excited to announce the **Vector Remap Language** (VRL) is an expression-oriented language designed to work with observability data (logs and metrics) in a *safe* and *performant* manner. It features a [simple syntax][vrl_expressions], a rich set of [built-in functions][vrl_functions] tailored to observability use cases, and [numerous features][vrl_features] that set it far apart from other options. This 0.12 release of Vector marks the official release of the language. +The Vector team is excited to announce the **Vector Remap Language** (VRL) is an expression-oriented language designed to work with observability data (logs and metrics) in a *safe* and *performant* manner. It features a [simple syntax][vrl_expressions], a rich set of [built-in functions][vrl_functions] tailored to observability use cases, and [numerous features][vrl_features] that set it far apart from other options. This 0.12 release of Vector marks the official release of the language. -Read the announcement post +Read the announcement post: + +{{< jump "/blog/vector-remap-language" >}} ## Further reading diff --git a/docs/highlights/2021-04-21-0-13-upgrade-guide.md b/docs/content/en/highlights/2021-04-21-0-13-upgrade-guide.md similarity index 92% rename from docs/highlights/2021-04-21-0-13-upgrade-guide.md rename to docs/content/en/highlights/2021-04-21-0-13-upgrade-guide.md index cf4893c570363..c031348d9cded 100644 --- a/docs/highlights/2021-04-21-0-13-upgrade-guide.md +++ b/docs/content/en/highlights/2021-04-21-0-13-upgrade-guide.md @@ -1,13 +1,13 @@ --- -last_modified_on: "2020-04-21" -$schema: ".schema.json" +date: "2020-04-21" title: "0.13 Upgrade Guide" description: "An upgrade guide that addresses breaking changes in 0.13.0" -author_github: "https://github.com/jszwedko" +authors: ["jszwedko"] pr_numbers: [] release: "0.13.0" hide_on_release_notes: false -tags: ["type: breaking change"] +badges: + type: breaking change --- 0.13 includes one minor breaking change: diff --git a/docs/highlights/2021-04-21-vector-tap.md b/docs/content/en/highlights/2021-04-21-vector-tap.md similarity index 92% rename from docs/highlights/2021-04-21-vector-tap.md rename to docs/content/en/highlights/2021-04-21-vector-tap.md index 1cd49c07b75f5..5781bfb530107 100644 --- a/docs/highlights/2021-04-21-vector-tap.md +++ b/docs/content/en/highlights/2021-04-21-vector-tap.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2021-04-21" -$schema: ".schema.json" +date: "2021-04-21" title: "Introducing `vector tap`" description: "Observing events flowing through your Vector topologies" -author_github: "https://github.com/jszwedko" +authors: ["jszwedko"] pr_numbers: [6871] release: "0.13.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: graphql", "domain: cli", "domain: observability"] +badges: + type: new feature + domains: ["graphql", "cli", "observability"] --- Vector 0.13 introduces a new [`vector tap`][tap] subcommand that allows for diff --git a/docs/highlights/2021-04-21-vrl-abort.md b/docs/content/en/highlights/2021-04-21-vrl-abort.md similarity index 90% rename from docs/highlights/2021-04-21-vrl-abort.md rename to docs/content/en/highlights/2021-04-21-vrl-abort.md index 6e39952b91e6a..5e784ab56d505 100644 --- a/docs/highlights/2021-04-21-vrl-abort.md +++ b/docs/content/en/highlights/2021-04-21-vrl-abort.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2021-04-21" -$schema: ".schema.json" +date: "2021-04-21" title: "Adding the `abort` keyword to VRL" description: "Aborting processing of events in `remap`" -author_github: "https://github.com/jszwedko" +authors: ["jszwedko"] pr_numbers: [6723] release: "0.13.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: remap" ] +badges: + type: "new feature" + domains: ["remap"] --- Vector 0.13 introduces a new [`abort` expression][abort] to the [Vector Remap @@ -63,5 +64,5 @@ That is, that all of the events that don't have a `type` of `ok`, would be dropped. [abort]: /docs/reference/vrl/expressions/#index -[remap]: /docs/reference/configuration/tranforms/remap +[remap]: /docs/reference/configuration/transforms/remap [vrl]: /docs/reference/vrl/ diff --git a/docs/highlights/2021-06-01-removing-helm-rawconfig.md b/docs/content/en/highlights/2021-06-01-removing-helm-rawconfig.md similarity index 88% rename from docs/highlights/2021-06-01-removing-helm-rawconfig.md rename to docs/content/en/highlights/2021-06-01-removing-helm-rawconfig.md index b4416f6630613..964dcad7f608d 100644 --- a/docs/highlights/2021-06-01-removing-helm-rawconfig.md +++ b/docs/content/en/highlights/2021-06-01-removing-helm-rawconfig.md @@ -1,13 +1,15 @@ --- -last_modified_on: "2021-06-01" -$schema: ".schema.json" +date: "2021-06-01" title: "Deprecating Helm `rawConfig` option" description: "The `rawConfig` option in the Vector Helm charts will be fully deprecated in an upcoming release" -author_github: "https://github.com/spencergilbert" +authors: ["spencergilbert"] pr_numbers: [7671] release: "0.14.0" hide_on_release_notes: false -tags: ["type: deprecation", "platform: kubernetes", "domain: config"] +badges: + type: "deprecation" + platforms: ["kubernetes"] + domains: ["config"] --- With the release of Vector 0.14.0, we are announcing the planned deprecation of the `rawConfig` option diff --git a/docs/highlights/2021-06-02-drop-jemalloc.md b/docs/content/en/highlights/2021-06-02-drop-jemalloc.md similarity index 58% rename from docs/highlights/2021-06-02-drop-jemalloc.md rename to docs/content/en/highlights/2021-06-02-drop-jemalloc.md index aa07d963651c8..beb4fdf2aad34 100644 --- a/docs/highlights/2021-06-02-drop-jemalloc.md +++ b/docs/content/en/highlights/2021-06-02-drop-jemalloc.md @@ -1,27 +1,28 @@ --- -last_modified_on: "2021-06-02" -$schema: ".schema.json" +date: "2021-06-02" title: "Switching to the system allocator" description: "Vector has switched from using jemalloc to the system allocator" -author_github: "https://github.com/jszwedko" +authors: ["jszwedko"] pr_numbers: [6781] release: "0.14.0" hide_on_release_notes: false -tags: ["type: announcement", "domain: performance"] +badges: + type: "announcement" + domains: ["performance"] --- -Since version 0.2.0, Vector has used [jemalloc](\(urls.jemalloc)) as its memory allocator on *nix-based OSes. As part of +Since version 0.2.0, Vector has used [jemalloc] as its memory allocator on *nix-based OSes. As part of some ongoing performance work, we've made the decision to switch to the system allocator provided by the platform -Vector is deployed on. This will be either the [GNU Allocator](\(urls.gnu_allocator)) for `glibc`-based builds (like -Debian) or the [`musl` allocator](\(urls.musl_allocator)) for `musl`-based builds (like Alpine Linux). +Vector is deployed on. This will be either the [GNU Allocator][gnu_allocator] for `glibc`-based builds (like +Debian) or the [`musl` allocator][musl_allocator] for `musl`-based builds (like Alpine Linux). In environments where Vector has access to multiple CPUs, we recommend using the `glibc`-based builds as, at the time of writing, [we have observed that the GNU allocator performs -better](https://github.com/timberio/vector/issues/1985#issuecomment-670667972) when running on multiple threads. +better][performance] when running on multiple threads. -If you are installing one of the packages or release assets listed on the [release page](\(urls.vector_release_v0_14_0), +If you are installing one of the packages or release assets listed on the [release page][0_14], then you will be getting a `glibc` build. `musl` builds are available through the [full release asset -listing](\(urls.vector_release_v0_14_0_full)). +listing][0_14_full]. If you are running Vector in Docker, we recommend using the `v0.14.0-distroless-libc` image for a light-weight Vector image; however the `v0.14.0-debian` image will also be using the GNU Allocator. The `v0.14.0-alpine` and @@ -30,3 +31,10 @@ image; however the `v0.14.0-debian` image will also be using the GNU Allocator. This change was made largely because we had insufficient evidence and motivation to use anything other than the system allocator which is a sensible default otherwise. As we have a better understanding of Vector's allocation profile, it is likely we will revisit this decision. + +[0_14]: /releases/0.14.0 +[0_14_full]: https://packages.timber.io/vector/v0.14.0 +[gnu_allocator]: https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html +[jemalloc]: https://github.com/jemalloc/jemalloc +[musl_allocator]: https://musl.libc.org/releases.html +[performance]: https://github.com/timberio/vector/issues/1985#issuecomment-670667972 diff --git a/docs/highlights/2021-06-02-fix-vector-metric-naming.md b/docs/content/en/highlights/2021-06-02-fix-vector-metric-naming.md similarity index 83% rename from docs/highlights/2021-06-02-fix-vector-metric-naming.md rename to docs/content/en/highlights/2021-06-02-fix-vector-metric-naming.md index ba471d3cab888..2f520e3f9744a 100644 --- a/docs/highlights/2021-06-02-fix-vector-metric-naming.md +++ b/docs/content/en/highlights/2021-06-02-fix-vector-metric-naming.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2021-06-02" -$schema: ".schema.json" +date: "2021-06-02" title: "Telemetry units for duration metrics fixed" description: "A few telemetry metric names incorrectly had `nanoseconds_total` in their name when they are actually `seconds`" -author_github: "https://github.com/jszwedko" +authors: ["jszwedko"] pr_numbers: [7373] release: "0.14.0" hide_on_release_notes: false -tags: ["type: breaking change", "domain: metrics"] +badges: + type: breaking change + domains: ["metrics"] --- The following internal histogram metrics, accessible via the `internal_metrics` source were incorrectly suffixed with diff --git a/docs/highlights/2021-06-03-exec-source.md b/docs/content/en/highlights/2021-06-03-exec-source.md similarity index 75% rename from docs/highlights/2021-06-03-exec-source.md rename to docs/content/en/highlights/2021-06-03-exec-source.md index fcd4079869e1e..0595c90220d1f 100644 --- a/docs/highlights/2021-06-03-exec-source.md +++ b/docs/content/en/highlights/2021-06-03-exec-source.md @@ -1,13 +1,14 @@ --- -last_modified_on: "2021-06-02" -$schema: ".schema.json" +date: "2021-06-02" title: "Generate events from an external program using the new `exec` source" description: "Introducing the new `exec` source for generating events from the output of other programs" -author_github: "https://github.com/jszwedko" +authors: ["jszwedko"] pr_numbers: [6876] release: "0.14.0" hide_on_release_notes: false -tags: ["type: new feature", "domain: sources"] +badges: + type: new feature + domains: ["sources"] --- This release includes a new `exec` source that can be used to run programs outside of Vector to generate log events by @@ -16,6 +17,8 @@ does not yet natively support such as querying data from a Postgres database via It is capable of either running a command on an interval or starting up a long-running command. -See [the `exec` source documentation](\(urls.vector_exec_source)) for more details and examples. +See [the `exec` source documentation][exec] for more details and examples. Thanks to [@moogstuart](https://github.com/moogstuart) for this contribution. + +[exec]: /docs/reference/configuration/sources/exec diff --git a/docs/content/en/highlights/_index.md b/docs/content/en/highlights/_index.md new file mode 100644 index 0000000000000..144adeec9fa74 --- /dev/null +++ b/docs/content/en/highlights/_index.md @@ -0,0 +1,6 @@ +--- +title: Vector highlights +short: Highlights +description: > + New Vector features and updates +--- diff --git a/docs/content/en/releases/0.10.0.md b/docs/content/en/releases/0.10.0.md new file mode 100644 index 0000000000000..72a17c586f2b1 --- /dev/null +++ b/docs/content/en/releases/0.10.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.10.0 release notes +weight: 13 +--- diff --git a/docs/content/en/releases/0.11.0.md b/docs/content/en/releases/0.11.0.md new file mode 100644 index 0000000000000..9bdaaba3c495a --- /dev/null +++ b/docs/content/en/releases/0.11.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.11.0 release notes +weight: 14 +--- diff --git a/docs/content/en/releases/0.11.1.md b/docs/content/en/releases/0.11.1.md new file mode 100644 index 0000000000000..16d1b01ec930a --- /dev/null +++ b/docs/content/en/releases/0.11.1.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.11.1 release notes +weight: 15 +--- diff --git a/docs/content/en/releases/0.12.0.md b/docs/content/en/releases/0.12.0.md new file mode 100644 index 0000000000000..7d6a8e370672b --- /dev/null +++ b/docs/content/en/releases/0.12.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.12.0 release notes +weight: 16 +--- diff --git a/docs/content/en/releases/0.12.1.md b/docs/content/en/releases/0.12.1.md new file mode 100644 index 0000000000000..6eb85d03c7670 --- /dev/null +++ b/docs/content/en/releases/0.12.1.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.12.1 release notes +weight: 17 +--- diff --git a/docs/content/en/releases/0.12.2.md b/docs/content/en/releases/0.12.2.md new file mode 100644 index 0000000000000..638d123c88fc6 --- /dev/null +++ b/docs/content/en/releases/0.12.2.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.12.2 release notes +weight: 18 +--- diff --git a/docs/content/en/releases/0.13.0.md b/docs/content/en/releases/0.13.0.md new file mode 100644 index 0000000000000..317c081e264ea --- /dev/null +++ b/docs/content/en/releases/0.13.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.13.0 release notes +weight: 19 +--- diff --git a/docs/content/en/releases/0.13.1.md b/docs/content/en/releases/0.13.1.md new file mode 100644 index 0000000000000..555344a736076 --- /dev/null +++ b/docs/content/en/releases/0.13.1.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.13.1 release notes +weight: 20 +--- diff --git a/docs/content/en/releases/0.14.0.md b/docs/content/en/releases/0.14.0.md new file mode 100644 index 0000000000000..b0885594f33b1 --- /dev/null +++ b/docs/content/en/releases/0.14.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.14.0 release notes +weight: 21 +--- diff --git a/docs/content/en/releases/0.4.0.md b/docs/content/en/releases/0.4.0.md new file mode 100644 index 0000000000000..aa769eb9cafb1 --- /dev/null +++ b/docs/content/en/releases/0.4.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.4.0 release notes +weight: 1 +--- diff --git a/docs/content/en/releases/0.5.0.md b/docs/content/en/releases/0.5.0.md new file mode 100644 index 0000000000000..b660cd82216e6 --- /dev/null +++ b/docs/content/en/releases/0.5.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.5.0 release notes +weight: 2 +--- diff --git a/docs/content/en/releases/0.6.0.md b/docs/content/en/releases/0.6.0.md new file mode 100644 index 0000000000000..a4a0879935f80 --- /dev/null +++ b/docs/content/en/releases/0.6.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.6.0 release notes +weight: 3 +--- diff --git a/docs/content/en/releases/0.7.0.md b/docs/content/en/releases/0.7.0.md new file mode 100644 index 0000000000000..25404bd38c0ed --- /dev/null +++ b/docs/content/en/releases/0.7.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.7.0 release notes +weight: 4 +--- diff --git a/docs/content/en/releases/0.7.1.md b/docs/content/en/releases/0.7.1.md new file mode 100644 index 0000000000000..0574ea295d7e5 --- /dev/null +++ b/docs/content/en/releases/0.7.1.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.7.1 release notes +weight: 5 +--- diff --git a/docs/content/en/releases/0.7.2.md b/docs/content/en/releases/0.7.2.md new file mode 100644 index 0000000000000..053a5fa9a9d90 --- /dev/null +++ b/docs/content/en/releases/0.7.2.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.7.2 release notes +weight: 6 +--- diff --git a/docs/content/en/releases/0.8.0.md b/docs/content/en/releases/0.8.0.md new file mode 100644 index 0000000000000..39359cf9426f6 --- /dev/null +++ b/docs/content/en/releases/0.8.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.8.0 release notes +weight: 7 +--- diff --git a/docs/content/en/releases/0.8.1.md b/docs/content/en/releases/0.8.1.md new file mode 100644 index 0000000000000..497372c63f9e3 --- /dev/null +++ b/docs/content/en/releases/0.8.1.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.8.1 release notes +weight: 8 +--- diff --git a/docs/content/en/releases/0.8.2.md b/docs/content/en/releases/0.8.2.md new file mode 100644 index 0000000000000..43feaf60c31fd --- /dev/null +++ b/docs/content/en/releases/0.8.2.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.8.2 release notes +weight: 9 +--- diff --git a/docs/content/en/releases/0.9.0.md b/docs/content/en/releases/0.9.0.md new file mode 100644 index 0000000000000..e5c3b09ee10f4 --- /dev/null +++ b/docs/content/en/releases/0.9.0.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.9.0 release notes +weight: 10 +--- diff --git a/docs/content/en/releases/0.9.1.md b/docs/content/en/releases/0.9.1.md new file mode 100644 index 0000000000000..b22df144df464 --- /dev/null +++ b/docs/content/en/releases/0.9.1.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.9.1 release notes +weight: 11 +--- diff --git a/docs/content/en/releases/0.9.2.md b/docs/content/en/releases/0.9.2.md new file mode 100644 index 0000000000000..6f6f3ae271277 --- /dev/null +++ b/docs/content/en/releases/0.9.2.md @@ -0,0 +1,4 @@ +--- +title: Vector v0.9.2 release notes +weight: 12 +--- diff --git a/docs/content/en/releases/_index.md b/docs/content/en/releases/_index.md new file mode 100644 index 0000000000000..14b11b91927a1 --- /dev/null +++ b/docs/content/en/releases/_index.md @@ -0,0 +1,4 @@ +--- +title: Vector releases +short: Releases +--- diff --git a/docs/cue/README.md b/docs/cue/README.md new file mode 100644 index 0000000000000..648daf0f382f5 --- /dev/null +++ b/docs/cue/README.md @@ -0,0 +1,6 @@ +# The Vector documentation sources + +See [`CONTRIBUTING.md`][contrib] for more information about how the documentation sources in this +directory work. + +[contrib]: ../../CONTRIBUTING.md#documentation diff --git a/docs/reference.cue b/docs/cue/reference.cue similarity index 98% rename from docs/reference.cue rename to docs/cue/reference.cue index c0ee4f1f21dd3..e40a08faeade6 100644 --- a/docs/reference.cue +++ b/docs/cue/reference.cue @@ -136,6 +136,7 @@ _values: { name: Name title: string body: string | null + svg?: string sub_sections?: [#Subsection, ...#Subsection] } @@ -502,10 +503,11 @@ _values: { #Unit: "bytes" | "events" | "milliseconds" | "requests" | "seconds" | "lines" -components: _ -configuration: _ -data_model: _ -installation: _ -process: _ -releases: _ -remap: _ +administration: _ +components: _ +configuration: _ +data_model: _ +glossary: _ +process: _ +releases: _ +remap: _ diff --git a/docs/reference/installation.cue b/docs/cue/reference/administration.cue similarity index 50% rename from docs/reference/installation.cue rename to docs/cue/reference/administration.cue index 08fcf8a5491af..2a9e0aa6aa679 100644 --- a/docs/reference/installation.cue +++ b/docs/cue/reference/administration.cue @@ -1,9 +1,12 @@ package metadata -installation: { +administration: { downloads: _ + interfaces: _ + management: _ operating_systems: _ package_managers: _ - platforms: _ roles: _ + topologies: _ + ui: _ } diff --git a/docs/cue/reference/administration/downloads.cue b/docs/cue/reference/administration/downloads.cue new file mode 100644 index 0000000000000..5f003462494bb --- /dev/null +++ b/docs/cue/reference/administration/downloads.cue @@ -0,0 +1,153 @@ +package metadata + +import "strings" + +administration: { + #Download: { + #FileType: "deb" | "rpm" | "zip" | "msi" | *"tar.gz" + + #Type: "archive" | *"package" + + #Option: { + _file_type: #FileType + _version_postfix: string | *"" + arch: #Arch + tag: string | *strings.ToLower(arch) + extra?: string + filename: string + + if extra == _|_ { + filename: "\(tag).\(_file_type)" + } + if extra != _|_ { + filename: "\(tag)-\(extra).\(_file_type)" + } + + // Calculate the download URL without needing site templating + download_url: "\(urls.vector_packages_root)/vector/{v1}/vector-{v2}-\(_version_postfix)\(filename)" + + // Unused fields + target: string // The Rust compilation target + available_on_latest: bool | *true + available_on_nightly: bool | *true + } + + os: #OperatingSystemFamily + package_manager?: string + title: string | *os + file_type: #FileType + type: #Type + version_postfix: string | *"" + library?: string + options: [...{#Option & {_file_type: file_type, _version_postfix: version_postfix}}] + } + + downloads: [#Download, ...#Download] & + [ + { + os: "Linux" + type: "archive" + library: "gnu" + options: [ + { + target: "aarch64-unknown-linux-gnu-tar-gz" + arch: "ARM64" + tag: "aarch64" + extra: "unknown-linux-gnu" + }, + { + target: "armv7-unknown-linux-gnueabihf" + arch: "ARMv7" + extra: "unknown-linux-gnueabihf" + }, + { + target: "x86_64-unknown-linux-gnu-tar-gz" + arch: "x86_64" + extra: "unknown-linux-gnu" + }, + ] + }, + { + os: "Linux" + title: "Linux (deb)" + package_manager: administration.package_managers.dpkg.name + file_type: "deb" + library: "gnu" + options: [ + { + target: "arm64-deb" + arch: "ARM64" + }, + { + target: "armhf-deb" + arch: "ARMv7" + tag: "armhf" + }, + { + target: "amd64-deb" + arch: "x86_64" + tag: "amd64" + }, + ] + }, + { + os: "Linux" + title: "Linux (rpm)" + package_manager: administration.package_managers.rpm.name + file_type: "rpm" + version_postfix: "1." + library: "gnu" + options: [ + { + target: "aarch64-rpm" + arch: "ARM64" + tag: "aarch64" + }, + { + target: "armv7-rpm" + arch: "ARMv7" + }, + { + target: "x86_64-rpm" + arch: "x86_64" + }, + ] + }, + { + os: "macOS" + type: "archive" + options: [ + { + target: "x86_64-apple-darwin-tar-gz" + arch: "x86_64" + extra: "apple-darwin" + }, + ] + }, + { + os: "Windows" + file_type: "zip" + type: "archive" + options: [ + { + target: "x86_64-pc-windows-msvc-zip" + arch: "x86_64" + extra: "pc-windows-msvc" + }, + ] + }, + { + os: "Windows" + title: "Windows (MSI)" + package_manager: administration.package_managers.msi.name + file_type: "msi" + options: [ + { + target: "x64-msi" + arch: "x86_64" + tag: "x64" + }, + ] + }, + ] +} diff --git a/docs/cue/reference/administration/install_commands.cue b/docs/cue/reference/administration/install_commands.cue new file mode 100644 index 0000000000000..3f906d8883f10 --- /dev/null +++ b/docs/cue/reference/administration/install_commands.cue @@ -0,0 +1,20 @@ +// One-liner installation commands. Currently displayed only on the main page. +package metadata + +#Command: { + title: string + command: string +} + +administration: { + install_commands: [#Command, ...#Command] & [ + { + title: "For humans" + command: "curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh" + }, + { + title: "For machines" + command: "curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh -s -- -y" + }, + ] +} diff --git a/docs/reference/installation/interfaces.cue b/docs/cue/reference/administration/interfaces.cue similarity index 96% rename from docs/reference/installation/interfaces.cue rename to docs/cue/reference/administration/interfaces.cue index a1ad265eef762..9f71f6be1f4b5 100644 --- a/docs/reference/installation/interfaces.cue +++ b/docs/cue/reference/administration/interfaces.cue @@ -1,8 +1,8 @@ package metadata -installation: { +administration: { #Interface: { - _shell: string + _shell: "powershell" | *"bash" archs: [#Arch, ...#Arch] description: string @@ -115,5 +115,5 @@ installation: { version: bool | *false } - _interfaces: #Interfaces + interfaces: #Interfaces } diff --git a/docs/reference/installation/_interfaces/apt.cue b/docs/cue/reference/administration/interfaces/apt.cue similarity index 74% rename from docs/reference/installation/_interfaces/apt.cue rename to docs/cue/reference/administration/interfaces/apt.cue index bf53ef21b63a5..df5c9779f7d88 100644 --- a/docs/reference/installation/_interfaces/apt.cue +++ b/docs/cue/reference/administration/interfaces/apt.cue @@ -1,20 +1,19 @@ package metadata -installation: _interfaces: apt: { +administration: interfaces: apt: { title: "Apt" description: """ - [Advanced Package Tool](\(urls.apt)), or APT, is a free package manager - that handles the installation and removal of software on Debian, - Ubuntu, and other Linux distributions. + [Advanced Package Tool](\(urls.apt)), or APT, is a free package manager that handles the + installation and removal of software on [Debian](\(urls.debian)), [Ubuntu](\(urls.ubuntu)), + and other Linux distributions. - Our APT repositories are provided by - [Cloudsmith](\(urls.cloudsmith)) and you - can find [instructions for manually adding - the repositories](\(urls.cloudsmith_apt)). + Our APT repositories are provided by [Cloudsmith](\(urls.cloudsmith)). We recommend + consulting the official instructions for [manually adding + repositories](\(urls.cloudsmith_apt)). """ archs: ["x86_64", "ARM64", "ARMv7"] - package_manager_name: installation.package_managers.apt.name + package_manager_name: administration.package_managers.apt.name paths: { bin: "/usr/bin/vector" bin_in_path: true diff --git a/docs/reference/installation/_interfaces/docker-cli.cue b/docs/cue/reference/administration/interfaces/docker_cli.cue similarity index 76% rename from docs/reference/installation/_interfaces/docker-cli.cue rename to docs/cue/reference/administration/interfaces/docker_cli.cue index 92fe622654289..f3a41f2571675 100644 --- a/docs/reference/installation/_interfaces/docker-cli.cue +++ b/docs/cue/reference/administration/interfaces/docker_cli.cue @@ -1,10 +1,10 @@ package metadata -installation: _interfaces: "docker-cli": { +administration: interfaces: docker_cli: { title: "Docker CLI" description: """ The [Docker CLI](\(urls.docker_cli)) is the command line interface to - the Docker platform. It is used to download, start, and manage Docker + the Docker platform. It's used to download, start, and manage Docker images. """ @@ -22,20 +22,21 @@ installation: _interfaces: "docker-cli": { _api_port: 8686 _docker_sock_path: "/var/run/docker.sock" commands: { - install: null - logs: "docker logs -f $(docker ps -aqf \"name=vector\")" - reload: "docker kill --signal=HUP timberio/vector" - restart: "docker restart -f $(docker ps -aqf \"name=vector\")" - start: #""" - docker run \ - -d \ - -v \#(paths.config):/etc/vector/vector.toml:ro \ - -p \#(_api_port):\#(_api_port) \{flags} - timberio/vector:{version}-{variant} - """# - stop: "docker stop timberio/vector" - uninstall: "docker rm timberio/vector timberio/vector" - upgrade: null + _config_path: paths.config + install: null + logs: "docker logs -f $(docker ps -aqf \"name=vector\")" + reload: "docker kill --signal=HUP timberio/vector" + restart: "docker restart -f $(docker ps -aqf \"name=vector\")" + start: #""" + docker run \ + -d \ + -v \#(paths.config):/etc/vector/vector.toml:ro \ + -p \#(_api_port):\#(_api_port) \{flags} + timberio/vector:{version}-{variant} + """# + stop: "docker stop timberio/vector" + uninstall: "docker rm timberio/vector timberio/vector" + upgrade: null } tutorials: { installation: [ diff --git a/docs/reference/installation/_interfaces/dpkg.cue b/docs/cue/reference/administration/interfaces/dpkg.cue similarity index 92% rename from docs/reference/installation/_interfaces/dpkg.cue rename to docs/cue/reference/administration/interfaces/dpkg.cue index 1e55ff60da5da..fff8c67400668 100644 --- a/docs/reference/installation/_interfaces/dpkg.cue +++ b/docs/cue/reference/administration/interfaces/dpkg.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: dpkg: { +administration: interfaces: dpkg: { title: "DPKG" description: """ [Dpkg](\(urls.dpkg)) is the software that powers the package management @@ -9,7 +9,7 @@ installation: _interfaces: dpkg: { """ archs: ["x86_64", "ARM64", "ARMv7"] - package_manager_name: installation.package_managers.dpkg.name + package_manager_name: administration.package_managers.dpkg.name paths: { bin: "/usr/bin/vector" diff --git a/docs/reference/installation/_interfaces/helm3.cue b/docs/cue/reference/administration/interfaces/helm3.cue similarity index 97% rename from docs/reference/installation/_interfaces/helm3.cue rename to docs/cue/reference/administration/interfaces/helm3.cue index 17223d8605e09..a73bb4766c775 100644 --- a/docs/reference/installation/_interfaces/helm3.cue +++ b/docs/cue/reference/administration/interfaces/helm3.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: "helm3": { +administration: interfaces: "helm3": { title: "Helm 3" description: """ [Helm](\(urls.helm)) is a package manager for Kubernetes that @@ -16,7 +16,7 @@ installation: _interfaces: "helm3": { config: null } - package_manager_name: installation.package_managers.helm.name + package_manager_name: administration.package_managers.helm.name platform_name: "kubernetes" role_implementations: [Name=string]: { diff --git a/docs/reference/installation/_interfaces/homebrew.cue b/docs/cue/reference/administration/interfaces/homebrew.cue similarity index 92% rename from docs/reference/installation/_interfaces/homebrew.cue rename to docs/cue/reference/administration/interfaces/homebrew.cue index a7a6a39ffa186..a7db41015e4a2 100644 --- a/docs/reference/installation/_interfaces/homebrew.cue +++ b/docs/cue/reference/administration/interfaces/homebrew.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: homebrew: { +administration: interfaces: homebrew: { title: "Homebrew" description: """ [Homebrew](\(urls.homebrew)) is a free and open-source package @@ -9,7 +9,7 @@ installation: _interfaces: homebrew: { """ archs: ["x86_64", "ARM64", "ARMv7"] - package_manager_name: installation.package_managers.homebrew.name + package_manager_name: administration.package_managers.homebrew.name paths: { bin: "/usr/local/bin/vector" diff --git a/docs/reference/installation/_interfaces/kubectl.cue b/docs/cue/reference/administration/interfaces/kubectl.cue similarity index 99% rename from docs/reference/installation/_interfaces/kubectl.cue rename to docs/cue/reference/administration/interfaces/kubectl.cue index 8493051f660d2..4eafd6ba2001f 100644 --- a/docs/reference/installation/_interfaces/kubectl.cue +++ b/docs/cue/reference/administration/interfaces/kubectl.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: kubectl: { +administration: interfaces: kubectl: { title: "kubectl" description: """ The [Kubernetes command-line tool](\(urls.kubectl)), kubectl, allows diff --git a/docs/reference/installation/_interfaces/msi.cue b/docs/cue/reference/administration/interfaces/msi.cue similarity index 89% rename from docs/reference/installation/_interfaces/msi.cue rename to docs/cue/reference/administration/interfaces/msi.cue index 13985e4150a18..d657c2054e23d 100644 --- a/docs/reference/installation/_interfaces/msi.cue +++ b/docs/cue/reference/administration/interfaces/msi.cue @@ -1,7 +1,8 @@ package metadata -installation: _interfaces: msi: { +administration: interfaces: msi: { title: "MSI (Windows Installer)" + _shell: "powershell" description: """ MSI refers to the file format and command line utility for the [Windows Installer](\(urls.windows_installer)). Windows Installer @@ -10,7 +11,7 @@ installation: _interfaces: msi: { """ archs: ["x86_64"] - package_manager_name: installation.package_managers.msi.name + package_manager_name: administration.package_managers.msi.name paths: { _dir: #"C:\Program Files\Vector"# bin: #"\#(_dir)\bin\vector"# @@ -21,10 +22,10 @@ installation: _interfaces: msi: { role_implementations: [Name=string]: { commands: { configure: #""" - cat <<-VECTORCFG > \#(paths.config) - {config} - VECTORCFG - """# + cat <<-VECTORCFG > \#(paths.config) + {config} + VECTORCFG + """# install: #""" powershell Invoke-WebRequest https://packages.timber.io/vector/{version}/vector-{arch}.msi -OutFile vector-{version}-{arch}.msi && \ msiexec /i vector-{version}-{arch}.msi /quiet diff --git a/docs/reference/installation/_interfaces/nix.cue b/docs/cue/reference/administration/interfaces/nix.cue similarity index 93% rename from docs/reference/installation/_interfaces/nix.cue rename to docs/cue/reference/administration/interfaces/nix.cue index 92d0c8360a63a..19ea8a381fd33 100644 --- a/docs/reference/installation/_interfaces/nix.cue +++ b/docs/cue/reference/administration/interfaces/nix.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: nix: { +administration: interfaces: nix: { title: "Nix" description: """ [Nix](\(urls.nix)) is a cross-platform package manager @@ -11,7 +11,7 @@ installation: _interfaces: nix: { """ archs: ["x86_64", "ARM64", "ARMv7"] - package_manager_name: installation.package_managers.nix.name + package_manager_name: administration.package_managers.nix.name paths: { bin: "/usr/bin/vector" diff --git a/docs/cue/reference/administration/interfaces/role_implementations/file_agent.cue b/docs/cue/reference/administration/interfaces/role_implementations/file_agent.cue new file mode 100644 index 0000000000000..4ae840db1a0f0 --- /dev/null +++ b/docs/cue/reference/administration/interfaces/role_implementations/file_agent.cue @@ -0,0 +1,23 @@ +package metadata + +administration: interfaces: [string]: role_implementations: _file_agent: { + variables: config: { + sources: { + logs: { + type: components.sources.file.type + include: [string, ...string] | *["/var/log/**/*.log"] + } + host_metrics: type: components.sources.host_metrics.type + internal_metrics: type: components.sources.internal_metrics.type + } + } + description: #""" + The agent role is designed to collect all data on a single host. Vector runs as a background + process and interfaces with a host-level APIs for data collection. By default, Vector + collects logs via Vector's [`file` source](\#(urls.vector_journald_source)) and metrics via + the [`host_metrics` source](\#(urls.vector_host_metrics_source)), but we recommend that you + adjust your pipeline as necessary using Vector's [sources](\#(urls.vector_sources)), + [transforms](\#(urls.vector_transforms)), and [sinks](\#(urls.vector_sinks)). + """# + title: "Agent" +} diff --git a/docs/cue/reference/administration/interfaces/role_implementations/file_sidecar.cue b/docs/cue/reference/administration/interfaces/role_implementations/file_sidecar.cue new file mode 100644 index 0000000000000..d4002ecac3be2 --- /dev/null +++ b/docs/cue/reference/administration/interfaces/role_implementations/file_sidecar.cue @@ -0,0 +1,24 @@ +package metadata + +administration: interfaces: [string]: role_implementations: _file_sidecar: { + variables: config: { + sources: { + logs: { + type: components.sources.file.type + include: [string, ...string] | *["/var/log/my-app*.log"] + } + host_metrics: type: components.sources.host_metrics.type + internal_metrics: type: components.sources.internal_metrics.type + } + } + description: #""" + The sidecar role is designed to collect data from a single process on the same host. By + default, we recommend using the [`file` source](\#(urls.vector_file_source)) to tail the + logs for that individual process, but you could use the [`stdin` + source](\#(urls.vector_stdin_source)), [`socket` source](\#(urls.vector_socket_source)), or + [`http` source](\#(urls.vector_http_source)). We recommend adjusting your pipeline as + necessary using Vector's [sources](\#(urls.vector_sources)), + [transforms](\#(urls.vector_transforms)), and [sinks](\#(urls.vector_sinks)). + """# + title: "Sidecar" +} diff --git a/docs/cue/reference/administration/interfaces/role_implementations/journald_agent.cue b/docs/cue/reference/administration/interfaces/role_implementations/journald_agent.cue new file mode 100644 index 0000000000000..82ccf7f458d47 --- /dev/null +++ b/docs/cue/reference/administration/interfaces/role_implementations/journald_agent.cue @@ -0,0 +1,21 @@ +package metadata + +administration: interfaces: [string]: role_implementations: _journald_agent: { + variables: config: { + sources: { + logs: type: components.sources.journald.type + host_metrics: type: components.sources.host_metrics.type + internal_metrics: type: components.sources.internal_metrics.type + } + } + description: #""" + The agent role is designed to collect all data on a single host. Vector runs as a background + process and interfaces with a host-level APIs for data collection. By default, Vector will + collect logs from [Journald](\#(urls.journald)) via Vector's + [`journald` source](\#(urls.vector_journald_source)) and metrics via the [`host_metrics` + source](\#(urls.vector_host_metrics_source)), but we recommend that you adjust your pipeline + as necessary using Vector's [sources](\#(urls.vector_sources)), + [transforms](\#(urls.vector_transforms)), and [sinks](\#(urls.vector_sinks)). + """# + title: "Agent" +} diff --git a/docs/cue/reference/administration/interfaces/role_implementations/vector_aggregator.cue b/docs/cue/reference/administration/interfaces/role_implementations/vector_aggregator.cue new file mode 100644 index 0000000000000..5532d4ead754c --- /dev/null +++ b/docs/cue/reference/administration/interfaces/role_implementations/vector_aggregator.cue @@ -0,0 +1,19 @@ +package metadata + +administration: interfaces: [string]: role_implementations: _vector_aggregator: { + variables: config: { + sources: { + vector: type: components.sources.vector.type + internal_metrics: type: components.sources.internal_metrics.type + } + } + description: #""" + The aggregator role is designed to receive and process data from multiple upstream agents. + Those agents are typically other Vector instances but could also be non-Vector data sources. + By default, we recommend the [`vector` source](\#(urls.vector_source)) since it supports all + data types, but we recommend that you adjust your pipeline as necessary using Vector's + [sources](\#(urls.vector_sources)), [transforms](\#(urls.vector_transforms)), and + [sinks](\#(urls.vector_sinks)). + """# + title: "Aggregator" +} diff --git a/docs/reference/installation/_interfaces/rpm.cue b/docs/cue/reference/administration/interfaces/rpm.cue similarity index 92% rename from docs/reference/installation/_interfaces/rpm.cue rename to docs/cue/reference/administration/interfaces/rpm.cue index 1cba70a5287f0..068e01765e70a 100644 --- a/docs/reference/installation/_interfaces/rpm.cue +++ b/docs/cue/reference/administration/interfaces/rpm.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: rpm: { +administration: interfaces: rpm: { title: "RPM" description: """ [RPM Package Manager](\(urls.rpm)) is a free and open-source package @@ -10,7 +10,7 @@ installation: _interfaces: rpm: { """ archs: ["x86_64", "ARM64", "ARMv7"] - package_manager_name: installation.package_managers.rpm.name + package_manager_name: administration.package_managers.rpm.name paths: { bin: "/usr/bin/vector" bin_in_path: true diff --git a/docs/reference/installation/_interfaces/vector-installer.cue b/docs/cue/reference/administration/interfaces/vector_installer.cue similarity index 95% rename from docs/reference/installation/_interfaces/vector-installer.cue rename to docs/cue/reference/administration/interfaces/vector_installer.cue index 8fc033083d8ad..224768a0488cd 100644 --- a/docs/reference/installation/_interfaces/vector-installer.cue +++ b/docs/cue/reference/administration/interfaces/vector_installer.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: "vector-installer": { +administration: interfaces: vector_installer: { title: "Vector Installer" description: """ The [Vector installer](\(urls.vector_installer)) is a simple shell @@ -47,7 +47,6 @@ installation: _interfaces: "vector-installer": { } role_implementations: { - agent: {} sidecar: role_implementations._file_sidecar aggregator: role_implementations._vector_aggregator } diff --git a/docs/reference/installation/_interfaces/yum.cue b/docs/cue/reference/administration/interfaces/yum.cue similarity index 93% rename from docs/reference/installation/_interfaces/yum.cue rename to docs/cue/reference/administration/interfaces/yum.cue index 3bd5a77eb12dd..2f9b470621c8d 100644 --- a/docs/reference/installation/_interfaces/yum.cue +++ b/docs/cue/reference/administration/interfaces/yum.cue @@ -1,6 +1,6 @@ package metadata -installation: _interfaces: yum: { +administration: interfaces: yum: { title: "YUM" description: """ The [Yellowdog Updater](\(urls.yum)), Modified (YUM) is a free and @@ -14,7 +14,7 @@ installation: _interfaces: yum: { """ archs: ["x86_64", "ARM64", "ARMv7"] - package_manager_name: installation.package_managers.yum.name + package_manager_name: administration.package_managers.yum.name paths: { bin: "/usr/bin/vector" bin_in_path: true diff --git a/docs/cue/reference/administration/management.cue b/docs/cue/reference/administration/management.cue new file mode 100644 index 0000000000000..b267f94cd32ef --- /dev/null +++ b/docs/cue/reference/administration/management.cue @@ -0,0 +1,282 @@ +package metadata + +// These CUE sources are the beginnings of an effort to re-architect some of the administration sources from a UI-first +// perspective. + +administration: management: { + #Interface: { + #Command: { + command?: string + info?: string + } + + name: string + title: string | *name + + variables: { + variants?: [string, ...string] + + config_formats: ["toml", "yaml", "json"] + } + + manage?: { + start?: #Command + stop?: #Command + reload?: #Command + restart?: #Command + upgrade?: #Command + } + + observe?: { + logs?: #Command + metrics?: #Command + } + } + + #Interfaces: [Name=string]: #Interface & {name: Name} + + _interfaces: #Interfaces & { + _systemd: { + manage: { + start: { + command: "sudo systemctl start vector" + } + stop: { + command: "sudo systemctl stop vector" + } + reload: { + command: "systemctl kill -s HUP --kill-who=main vector.service" + } + restart: { + command: "sudo systemctl restart vector" + } + } + } + + apt: _systemd & { + title: "APT" + + manage: { + upgrade: { + command: "sudo apt-get upgrade vector" + } + } + + observe: { + logs: { + info: """ + The Vector package from the APT repository installs Vector as a [systemd](\(urls.systemd)) + service. You can access Vector's logs using the [`journalctl`](\(urls.journalctl)) utility: + + ```bash + sudo journalctl -fu vector + ``` + """ + } + } + } + + docker_cli: { + title: "Docker CLI" + + variables: { + variants: ["alpine", "debian", "distroless"] + } + + manage: { + start: { + command: #""" + docker run \ + -d \ + -v ~/vector.{config_format}:/etc/vector/vector.{config_format}:ro \ + -p 8686:8686 \ + timberio/vector:{version}-{variant} + """# + } + stop: { + command: "docker stop timberio/vector" + } + reload: { + command: "docker kill --signal=HUP timberio/vector" + } + restart: { + command: "docker restart -f $(docker ps -aqf \"name=vector\")" + } + } + + observe: { + logs: { + info: """ + If you've started Vector with the `docker` CLI you can access Vector's logs using the + `docker logs` command. First, find the Vector container ID: + + ```bash + docker ps | grep vector + ``` + + Then copy Vector's container ID and use it to tail the logs: + + ```bash + docker logs -f + ``` + + If you started Vector with the [Docker Compose](\(urls.docker_compose)) CLI you can use this + command to access Vector's logs: + + ```bash + docker-compose logs -f vector + ``` + + Replace `vector` with the name of Vector's service if you've named it something else. + """ + } + } + } + + dpkg: _systemd & { + observe: { + logs: { + info: """ + The Vector DEB package installs Vector as a Systemd service. Logs can be accessed using the + `journalctl` utility: + + ```bash + sudo journalctl -fu vector + ``` + """ + } + } + } + + homebrew: { + title: "Homebrew" + + manage: { + start: { + command: "brew services start vector" + } + stop: { + command: "brew services stop vector" + } + reload: { + command: "killall -s SIGHUP vector" + } + restart: { + command: "brew services restart vector" + } + upgrade: { + command: "brew update && brew upgrade vector" + } + } + + observe: { + logs: { + info: """ + When Vector is started through [Homebrew](\(urls.homebrew)) the logs are automatically routed to + `/usr/local/var/log/vector.log`. You can tail them using the `tail` utility: + + ```bash + tail -f /usr/local/var/log/vector.log + ``` + """ + } + } + } + + msi: { + title: "MSI" + + manage: { + start: { + command: #""" + C:\Program Files\Vector\bin\vector \ + --config C:\Program Files\Vector\config\vector.{config_format} + """# + } + } + + observe: { + logs: { + info: """ + The Vector MSI package doesn't install Vector into a proces manager. Therefore, you need to + start Vector by executing the Vector binary directly. Vector's logs are written to `STDOUT`. You + are in charge of routing `STDOUT`, and this determines how you access Vector's logs. + """ + } + } + } + + nix: { + title: "Nix" + + manage: { + start: { + command: "vector --config /etc/vector/vector.{config_format}" + } + + reload: { + command: "killall -s SIGHUP vector" + } + + upgrade: { + command: #""" + nix-env \ + --file https://github.com/NixOS/nixpkgs/archive/master.tar.gz \ + --upgrade vector + """# + } + } + + observe: { + logs: { + info: """ + The Vector Nix package doesn't install Vector into a proces manager. Therefore, Vector must be + started by executing the Vector binary directly. Vector's logs are written to `STDOUT`. You are + in charge of routing `STDOUT`, and this determines how you access Vector's logs. + """ + } + } + } + + rpm: _systemd & { + title: "RPM" + + observe: { + logs: { + info: """ + The Vector RPM package installs Vector as a Systemd service. You can access Vector's logs using + the [`journalctl`](\(urls.journalctl)) utility: + + ```bash + sudo journalctl -fu vector + ``` + """ + } + } + } + + vector_installer: { + title: "Vector Installer" + + manage: { + start: { + command: "vector --config /etc/vector.{config_format}" + } + + reload: { + command: "killall -s SIGHUP vector" + } + } + } + + yum: _systemd & { + title: "YUM" + + manage: { + upgrade: { + command: "sudo yum upgrade vector" + } + } + } + } +} diff --git a/docs/reference/installation/operating_systems.cue b/docs/cue/reference/administration/operating_systems.cue similarity index 74% rename from docs/reference/installation/operating_systems.cue rename to docs/cue/reference/administration/operating_systems.cue index 46423579bf967..c79c0f8cfda7f 100644 --- a/docs/reference/installation/operating_systems.cue +++ b/docs/cue/reference/administration/operating_systems.cue @@ -1,10 +1,10 @@ package metadata -installation: { +administration: { #OperatingSystem: { description: string family: #OperatingSystemFamily - interfaces: [installation.#Interface & {_shell: shell}, ...installation.#Interface & {_shell: shell}] + interfaces: [administration.#Interface & {_shell: shell}, ...administration.#Interface & {_shell: shell}] minimum_supported_version: string | null name: string shell: string diff --git a/docs/reference/installation/operating_systems/amazon_linux.cue b/docs/cue/reference/administration/operating_systems/amazon_linux.cue similarity index 73% rename from docs/reference/installation/operating_systems/amazon_linux.cue rename to docs/cue/reference/administration/operating_systems/amazon_linux.cue index aac3ba1bc4f5f..dd657fcefe55d 100644 --- a/docs/reference/installation/operating_systems/amazon_linux.cue +++ b/docs/cue/reference/administration/operating_systems/amazon_linux.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: "amazon-linux": { +administration: operating_systems: "amazon-linux": { title: "Amazon Linux" description: """ The [Amazon Linux AMI](\(urls.amazon_linux)) is a supported and @@ -11,12 +11,12 @@ installation: operating_systems: "amazon-linux": { """ interfaces: [ - installation._interfaces.yum, - installation._interfaces.rpm, - installation._interfaces."vector-installer" & { + administration.interfaces.yum, + administration.interfaces.rpm, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", + administration.interfaces.docker_cli, ] family: "Linux" diff --git a/docs/reference/installation/operating_systems/centos.cue b/docs/cue/reference/administration/operating_systems/centos.cue similarity index 59% rename from docs/reference/installation/operating_systems/centos.cue rename to docs/cue/reference/administration/operating_systems/centos.cue index 316ad8065026a..717962b8547f5 100644 --- a/docs/reference/installation/operating_systems/centos.cue +++ b/docs/cue/reference/administration/operating_systems/centos.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: centos: { +administration: operating_systems: centos: { title: "CentOS" description: """ [CentOS](\(urls.centos)) is a Linux distribution that is @@ -9,14 +9,14 @@ installation: operating_systems: centos: { """ interfaces: [ - installation._interfaces.yum, - installation._interfaces.rpm, - installation._interfaces."vector-installer" & { + administration.interfaces.yum, + administration.interfaces.rpm, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", - installation._interfaces."helm3", - installation._interfaces.kubectl, + administration.interfaces.docker_cli, + administration.interfaces.helm3, + administration.interfaces.kubectl, ] family: "Linux" diff --git a/docs/reference/installation/operating_systems/debian.cue b/docs/cue/reference/administration/operating_systems/debian.cue similarity index 62% rename from docs/reference/installation/operating_systems/debian.cue rename to docs/cue/reference/administration/operating_systems/debian.cue index 0705bb0816b9d..03d4f48738baf 100644 --- a/docs/reference/installation/operating_systems/debian.cue +++ b/docs/cue/reference/administration/operating_systems/debian.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: debian: { +administration: operating_systems: debian: { title: "Debian" description: """ [Debian](\(urls.debian))), also known as Debian GNU/Linux, is a Linux @@ -9,14 +9,14 @@ installation: operating_systems: debian: { """ interfaces: [ - installation._interfaces.apt, - installation._interfaces.dpkg, - installation._interfaces."vector-installer" & { + administration.interfaces.apt, + administration.interfaces.dpkg, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", - installation._interfaces."helm3", - installation._interfaces.kubectl, + administration.interfaces.docker_cli, + administration.interfaces.helm3, + administration.interfaces.kubectl, ] family: "Linux" diff --git a/docs/reference/installation/operating_systems/macos.cue b/docs/cue/reference/administration/operating_systems/macos.cue similarity index 71% rename from docs/reference/installation/operating_systems/macos.cue rename to docs/cue/reference/administration/operating_systems/macos.cue index f5fcb669e766b..200cae8024d8c 100644 --- a/docs/reference/installation/operating_systems/macos.cue +++ b/docs/cue/reference/administration/operating_systems/macos.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: macos: { +administration: operating_systems: macos: { title: "macOS" description: """ [macOS](\(urls.macos)) is the primary operating system for Apple's @@ -9,11 +9,11 @@ installation: operating_systems: macos: { """ interfaces: [ - installation._interfaces.homebrew, - installation._interfaces."vector-installer" & { + administration.interfaces.homebrew, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._file_agent }, - installation._interfaces."docker-cli", + administration.interfaces.docker_cli, ] family: "macOS" diff --git a/docs/reference/installation/operating_systems/nixos.cue b/docs/cue/reference/administration/operating_systems/nixos.cue similarity index 72% rename from docs/reference/installation/operating_systems/nixos.cue rename to docs/cue/reference/administration/operating_systems/nixos.cue index 43ffe1177b159..b044e739967d9 100644 --- a/docs/reference/installation/operating_systems/nixos.cue +++ b/docs/cue/reference/administration/operating_systems/nixos.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: nixos: { +administration: operating_systems: nixos: { title: "NixOS" description: """ [NixOS](\(urls.nixos)) is a Linux distribution built on top of the @@ -9,11 +9,11 @@ installation: operating_systems: nixos: { """ interfaces: [ - installation._interfaces.nix, - installation._interfaces."vector-installer" & { + administration.interfaces.nix, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", + administration.interfaces.docker_cli, ] family: "Linux" minimum_supported_version: "15.09" diff --git a/docs/reference/installation/operating_systems/raspbian.cue b/docs/cue/reference/administration/operating_systems/raspbian.cue similarity index 76% rename from docs/reference/installation/operating_systems/raspbian.cue rename to docs/cue/reference/administration/operating_systems/raspbian.cue index 18d2bb1d5fe53..54b9754a3c8f5 100644 --- a/docs/reference/installation/operating_systems/raspbian.cue +++ b/docs/cue/reference/administration/operating_systems/raspbian.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: raspbian: { +administration: operating_systems: raspbian: { title: "Raspbian" description: """ [Raspbian](\(urls.raspbian)) is the operating system used on @@ -9,10 +9,10 @@ installation: operating_systems: raspbian: { """ interfaces: [ - installation._interfaces."vector-installer" & { + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", + administration.interfaces.docker_cli, ] family: "Linux" minimum_supported_version: null diff --git a/docs/reference/installation/operating_systems/rhel.cue b/docs/cue/reference/administration/operating_systems/rhel.cue similarity index 58% rename from docs/reference/installation/operating_systems/rhel.cue rename to docs/cue/reference/administration/operating_systems/rhel.cue index 2a6e5cb49e7ac..0387c683ab659 100644 --- a/docs/reference/installation/operating_systems/rhel.cue +++ b/docs/cue/reference/administration/operating_systems/rhel.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: rhel: { +administration: operating_systems: rhel: { title: "RHEL" description: """ [Red Hat Enterprise Linux](\(urls.rhel)) is a Linux distribution @@ -8,14 +8,14 @@ installation: operating_systems: rhel: { """ interfaces: [ - installation._interfaces.yum, - installation._interfaces.rpm, - installation._interfaces."vector-installer" & { + administration.interfaces.yum, + administration.interfaces.rpm, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", - installation._interfaces."helm3", - installation._interfaces.kubectl, + administration.interfaces.docker_cli, + administration.interfaces.helm3, + administration.interfaces.kubectl, ] family: "Linux" diff --git a/docs/reference/installation/operating_systems/ubuntu.cue b/docs/cue/reference/administration/operating_systems/ubuntu.cue similarity index 55% rename from docs/reference/installation/operating_systems/ubuntu.cue rename to docs/cue/reference/administration/operating_systems/ubuntu.cue index 305b22b722cb6..3025e7adbbd40 100644 --- a/docs/reference/installation/operating_systems/ubuntu.cue +++ b/docs/cue/reference/administration/operating_systems/ubuntu.cue @@ -1,20 +1,20 @@ package metadata -installation: operating_systems: ubuntu: { +administration: operating_systems: ubuntu: { title: "Ubuntu" description: """ [Ubuntu](\(urls.ubuntu)) is a Linux distribution based on Debian. """ interfaces: [ - installation._interfaces.apt, - installation._interfaces.dpkg, - installation._interfaces."vector-installer" & { + administration.interfaces.apt, + administration.interfaces.dpkg, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._journald_agent }, - installation._interfaces."docker-cli", - installation._interfaces."helm3", - installation._interfaces.kubectl, + administration.interfaces.docker_cli, + administration.interfaces.helm3, + administration.interfaces.kubectl, ] family: "Linux" diff --git a/docs/reference/installation/operating_systems/windows.cue b/docs/cue/reference/administration/operating_systems/windows.cue similarity index 68% rename from docs/reference/installation/operating_systems/windows.cue rename to docs/cue/reference/administration/operating_systems/windows.cue index 522512d13a9b4..1f19f246c3111 100644 --- a/docs/reference/installation/operating_systems/windows.cue +++ b/docs/cue/reference/administration/operating_systems/windows.cue @@ -1,6 +1,6 @@ package metadata -installation: operating_systems: windows: { +administration: operating_systems: windows: { title: "Windows" description: """ [Microsoft Windows](\(urls.windows)) is an operating system @@ -8,11 +8,11 @@ installation: operating_systems: windows: { """ interfaces: [ - installation._interfaces.msi, - installation._interfaces."vector-installer" & { + administration.interfaces.msi, + administration.interfaces.vector_installer & { role_implementations: agent: role_implementations._file_agent }, - installation._interfaces."docker-cli", + administration.interfaces.docker_cli, ] family: "Windows" diff --git a/docs/reference/installation/package_managers.cue b/docs/cue/reference/administration/package_managers.cue similarity index 92% rename from docs/reference/installation/package_managers.cue rename to docs/cue/reference/administration/package_managers.cue index a972c6455ce30..ef1d93c189c92 100644 --- a/docs/reference/installation/package_managers.cue +++ b/docs/cue/reference/administration/package_managers.cue @@ -1,6 +1,6 @@ package metadata -installation: { +administration: { #PackageManager: { description: string name: string diff --git a/docs/cue/reference/administration/package_managers/apt.cue b/docs/cue/reference/administration/package_managers/apt.cue new file mode 100644 index 0000000000000..e02cdd869f31b --- /dev/null +++ b/docs/cue/reference/administration/package_managers/apt.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: apt: { + title: "APT" + description: administration.interfaces.apt.description +} diff --git a/docs/cue/reference/administration/package_managers/dpkg.cue b/docs/cue/reference/administration/package_managers/dpkg.cue new file mode 100644 index 0000000000000..3958b021c98c5 --- /dev/null +++ b/docs/cue/reference/administration/package_managers/dpkg.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: dpkg: { + title: "DPKG" + description: administration.interfaces.dpkg.description +} diff --git a/docs/cue/reference/administration/package_managers/helm.cue b/docs/cue/reference/administration/package_managers/helm.cue new file mode 100644 index 0000000000000..1167b55a66425 --- /dev/null +++ b/docs/cue/reference/administration/package_managers/helm.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: helm: { + title: "Helm" + description: administration.interfaces.helm3.description +} diff --git a/docs/cue/reference/administration/package_managers/homebrew.cue b/docs/cue/reference/administration/package_managers/homebrew.cue new file mode 100644 index 0000000000000..14e16249b801a --- /dev/null +++ b/docs/cue/reference/administration/package_managers/homebrew.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: homebrew: { + title: "Homebrew" + description: administration.interfaces.homebrew.description +} diff --git a/docs/cue/reference/administration/package_managers/msi.cue b/docs/cue/reference/administration/package_managers/msi.cue new file mode 100644 index 0000000000000..b9dbc84b48092 --- /dev/null +++ b/docs/cue/reference/administration/package_managers/msi.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: msi: { + title: "MSI" + description: administration.interfaces.msi.description +} diff --git a/docs/cue/reference/administration/package_managers/nix.cue b/docs/cue/reference/administration/package_managers/nix.cue new file mode 100644 index 0000000000000..414af60e75cfe --- /dev/null +++ b/docs/cue/reference/administration/package_managers/nix.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: nix: { + title: "Nix" + description: administration.interfaces.nix.description +} diff --git a/docs/cue/reference/administration/package_managers/rpm.cue b/docs/cue/reference/administration/package_managers/rpm.cue new file mode 100644 index 0000000000000..3839120c5698a --- /dev/null +++ b/docs/cue/reference/administration/package_managers/rpm.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: rpm: { + title: "RPM" + description: administration.interfaces.rpm.description +} diff --git a/docs/cue/reference/administration/package_managers/yum.cue b/docs/cue/reference/administration/package_managers/yum.cue new file mode 100644 index 0000000000000..2ba974592fd69 --- /dev/null +++ b/docs/cue/reference/administration/package_managers/yum.cue @@ -0,0 +1,6 @@ +package metadata + +administration: package_managers: yum: { + title: "YUM" + description: administration.interfaces.yum.description +} diff --git a/docs/reference/installation/roles.cue b/docs/cue/reference/administration/roles.cue similarity index 93% rename from docs/reference/installation/roles.cue rename to docs/cue/reference/administration/roles.cue index 5de2801e1e022..ebe5e597aa6cd 100644 --- a/docs/reference/installation/roles.cue +++ b/docs/cue/reference/administration/roles.cue @@ -1,6 +1,6 @@ package metadata -installation: { +administration: { #Role: { name: string title: string diff --git a/docs/reference/installation/roles/agent.cue b/docs/cue/reference/administration/roles/agent.cue similarity index 88% rename from docs/reference/installation/roles/agent.cue rename to docs/cue/reference/administration/roles/agent.cue index fdc5028110cce..7d459b72f01d5 100644 --- a/docs/reference/installation/roles/agent.cue +++ b/docs/cue/reference/administration/roles/agent.cue @@ -1,6 +1,6 @@ package metadata -installation: roles: agent: { +administration: roles: agent: { title: "Agent" sub_roles: { daemon: { @@ -16,7 +16,7 @@ installation: roles: agent: { title: "Sidecar" description: """ The sidecar role couples Vector with each service, focused on data collection - for that individual service only. While the deamon role is recommended, the + for that individual service only. While the daemon role is recommended, the sidecar role is beneficial when you want to shift reponsibility of data collection to the service owner. And, in some cases, it can be simpler to manage. diff --git a/docs/reference/installation/roles/aggregator.cue b/docs/cue/reference/administration/roles/aggregator.cue similarity index 94% rename from docs/reference/installation/roles/aggregator.cue rename to docs/cue/reference/administration/roles/aggregator.cue index 382dee17bb031..bfec971da9ccf 100644 --- a/docs/reference/installation/roles/aggregator.cue +++ b/docs/cue/reference/administration/roles/aggregator.cue @@ -1,6 +1,6 @@ package metadata -installation: roles: aggregator: { +administration: roles: aggregator: { title: "Aggregator" description: """ The aggregator role is designed for central processing, collecting data from diff --git a/docs/cue/reference/administration/topologies.cue b/docs/cue/reference/administration/topologies.cue new file mode 100644 index 0000000000000..5fc12440b3a49 --- /dev/null +++ b/docs/cue/reference/administration/topologies.cue @@ -0,0 +1,25 @@ +package metadata + +administration: { + #Topology: { + #Attribute: { + title: string + description: string + } + + name: string + title: string + description: string + // Enables the topologies to be displayed in a specified order rather than alphabetically + order: int + + pros: [#Attribute, ...#Attribute] + cons: [#Attribute, ...#Attribute] + } + + #Topologies: [Name=string]: #Topology & { + name: Name + } + + topologies: #Topologies +} diff --git a/docs/cue/reference/administration/topologies/centralized.cue b/docs/cue/reference/administration/topologies/centralized.cue new file mode 100644 index 0000000000000..349f214f29111 --- /dev/null +++ b/docs/cue/reference/administration/topologies/centralized.cue @@ -0,0 +1,60 @@ +package metadata + +administration: topologies: centralized: { + title: "Centralized" + order: 2 + description: """ + A good balance of simplicity, stability, and control. For many use cases, a centralized deployment topology is + a good compromise between the [distributed](#distributed) and [stream-based](#stream-based) topologies, as it + offers many of the advantages of a stream-based topology, such as a clean separation of responsibilities, + without the management overheard incurred by a stream-based setup, which often involves using Vector in + conjunction with a system like [Apache Kafka](\(urls.kafka)) or [Apache Pulsar](\(urls.pulsar)). + """ + + pros: [ + { + title: "More efficient" + description: """ + Centralized topologies are typically more efficient for client nodes and downstream services. Vector + [agents](\(urls.vector_agent_role)) do less work and thus use fewer resources. In addition, in this + topology the centralized Vector service buffers data, provides better compression, and sends optimized + requests downstream. + """ + }, + { + title: "More reliable" + description: """ + Vector protects downstream services from volume spikes by buffering and flushing data at smoothed-out + intervals. + """ + }, + { + title: "Has multi-host context" + description: """ + Because your data is centralized, you can perform operations across hosts, such as reducing logs to + global metrics. This can be advantageous for large deployments in which metrics aggregated across many + hosts are more informative than isolated per-host metrics. + """ + }, + ] + + cons: [ + { + title: "More complex" + description: """ + A centralized topology has more moving parts, as you need to run Vector in both the + [agent](\(urls.vector_agent_role)) and [aggregator](\(urls.vector_aggregator_role)) roles. + """ + }, + { + title: "Less durable" + description: """ + [Agent](\(urls.vector_agent_role)) nodes are designed to get data off of the machine as quickly as + possible. While this is fine for some use cases, it does bear the possibility of data loss since the + central Vector service could go down and thus lose any buffered data. If this type of outage is + unacceptable for your requirements, we recommend running a [stream-based](#stream-based) topology + instead. + """ + }, + ] +} diff --git a/docs/cue/reference/administration/topologies/distributed.cue b/docs/cue/reference/administration/topologies/distributed.cue new file mode 100644 index 0000000000000..de6fa0d7e673a --- /dev/null +++ b/docs/cue/reference/administration/topologies/distributed.cue @@ -0,0 +1,60 @@ +package metadata + +administration: topologies: distributed: { + title: "Distributed" + order: 1 + description: """ + The simplest topology. In a distributed setup, Vector communicates directly with your downstream services from + your client nodes. + """ + + pros: [ + { + title: "Simple" + description: "Fewer moving parts" + }, + { + title: "Elastic" + description: "Easily scales with your app. Resources grow as you scale." + }, + ] + + cons: [ + { + title: "Less efficient" + description: """ + Depending on the complexity of your pipelines, this will use more local resources, which could disrupt + the performance of other applications on the same host. + """ + }, + { + title: "Less durable" + description: """ + Because data is buffered on the host it is more likely you'll lose buffered data in the event of an + unrecoverable crash. Often times this is the most important and useful data. + """ + }, + { + title: "More downstream stress" + description: """ + Downstream services will receive more requests with smaller payloads that could potentially disrupt + stability of these services. + """ + }, + { + title: "Reduced downstream stability" + description: """ + You risk overloading downstream services if you need to scale up quickly or exceed the capacity a + downstream service can handle. + """ + }, + { + title: "Lacks multi-host context" + description: """ + Lacks awareness of other hosts and eliminates the ability to perform operations across hosts, such as + reducing logs to global metrics. This is typically a concern for very large deployments where individual + host metrics are less useful. + """ + }, + ] +} diff --git a/docs/cue/reference/administration/topologies/stream_based.cue b/docs/cue/reference/administration/topologies/stream_based.cue new file mode 100644 index 0000000000000..fa69486044a2d --- /dev/null +++ b/docs/cue/reference/administration/topologies/stream_based.cue @@ -0,0 +1,63 @@ +package metadata + +administration: topologies: stream_based: { + title: "Stream based" + order: 3 + description: """ + The most durable and elastic topology. This topology is typically adopted for very large streams with teams that + are familiar with running a stream-based service such as Kafka. + """ + + pros: [ + { + title: "Most durable and reliable" + description: """ + Stream services, like Kafka, are designed for high durability and reliability, replicating data across + multiple nodes. + """ + }, + { + title: "Most efficient" + description: """ + Vector agents are doing less, making them more efficient, and Vector services do not have to worry about + durability, which can be tuned towards performance. + """ + }, + { + title: "Ability to re-stream" + description: """ + Re-stream your data depending on your stream's retention period. + """ + }, + { + title: "Cleaner separation of responsibilities" + description: """ + Vector is used solely as a routing layer and is not responsible for durability. Durability is delegated + to a purpose-built service that you can switch and evolve over time. + """ + }, + ] + + cons: [ + { + title: "Increased management overhead" + description: """ + Managing a stream service, such as Kafka, is a complex endeavor and generally requires an experienced + team to setup and manage properly. + """ + }, + { + title: "More complex" + description: """ + This topology is complex and requires a deeper understand of managing production-grade streams. + """ + }, + { + title: "More expensive" + description: """ + In addition the management cost, the added stream cluster will require more resources which will + increase operational cost. + """ + }, + ] +} diff --git a/docs/cue/reference/administration/ui.cue b/docs/cue/reference/administration/ui.cue new file mode 100644 index 0000000000000..cdccd502ce25b --- /dev/null +++ b/docs/cue/reference/administration/ui.cue @@ -0,0 +1,59 @@ +package metadata + +administration: { + #Family: { + name: #OperatingSystemFamily + highlighter: "powershell" | *"shell" + interfaces: [administration.management.#Interface, ...administration.management.#Interface] + interface_names: [string, ...string] & [ for i in interfaces {i.title}] + } + + #UI: { + tag: string + + ... + } + + #UIs: [Tag=string]: #UI & {tag: Tag} + + _families: [#Family, ...#Family] & + [ + { + name: "Linux" + interfaces: [ + administration.management._interfaces.apt, + administration.management._interfaces.dpkg, + administration.management._interfaces.docker_cli, + administration.management._interfaces.nix, + administration.management._interfaces.rpm, + administration.management._interfaces.vector_installer, + administration.management._interfaces.yum, + ] + }, + { + name: "macOS" + interfaces: [ + administration.management._interfaces.homebrew, + administration.management._interfaces.docker_cli, + administration.management._interfaces.vector_installer, + ] + }, + { + name: "Windows" + highlighter: "powershell" + interfaces: [ + administration.management._interfaces.docker_cli, + administration.management._interfaces.msi, + administration.management._interfaces.vector_installer, + ] + }, + ] + + ui: #UIs & { + management: { + families: _families + + family_names: [ for f in _families {f.name}] + } + } +} diff --git a/docs/reference/api.cue b/docs/cue/reference/api.cue similarity index 98% rename from docs/reference/api.cue rename to docs/cue/reference/api.cue index c2960c8bd173e..7336a8eb0721e 100644 --- a/docs/reference/api.cue +++ b/docs/cue/reference/api.cue @@ -88,7 +88,7 @@ api: { "/playground": { GET: { description: """ - A bundled GraphQL playground that allows you + A bundled GraphQL playground that enables you to explore the available queries and manually run queries. diff --git a/docs/cue/reference/authors.cue b/docs/cue/reference/authors.cue new file mode 100644 index 0000000000000..8dca3f2de5e85 --- /dev/null +++ b/docs/cue/reference/authors.cue @@ -0,0 +1,47 @@ +package metadata + +#Author: { + handle: !="" + name: !="" +} + +authors: [#Author, ...#Author] + +authors: [ + { + handle: "binarylogic" + name: "Ben Johnson" + }, + { + handle: "hoverbear" + name: "Ana Hobden" + }, + { + handle: "jamtur01" + name: "James Turnbull" + }, + { + handle: "jszwedko" + name: "Jesse Szwedko" + }, + { + handle: "lukesteensen" + name: "Luke Steensen" + }, + { + handle: "lucperkins" + name: "Luc Perkins" + }, + { + handle: "leebenson" + name: "Lee Benson" + }, + { + handle: "spencergilbert" + name: "Spencer Gilbert" + }, + { + handle: "zsherman" + name: "Zach Sherman" + }, +] diff --git a/docs/reference/cli.cue b/docs/cue/reference/cli.cue similarity index 91% rename from docs/reference/cli.cue rename to docs/cue/reference/cli.cue index 3566d19d475ab..fb25a2669ad30 100644 --- a/docs/reference/cli.cue +++ b/docs/cue/reference/cli.cue @@ -24,18 +24,20 @@ cli: { #ArgType: "string" | "list" #Commands: [Command=string]: { - description: !="" - name: Command - flags?: #Flags - options?: #Options - args?: #Args + description: !="" + name: Command + flags?: #Flags + options?: #Options + args?: #Args + experimental: bool | *false } #Flags: [Flag=string]: { - flag: "--\(Flag)" - description: string - env_var?: string - name: Flag + flag: "--\(Flag)" + description: string + env_var?: string + name: Flag + experimental: bool | *false if _short != _|_ { short: "-\(_short)" @@ -45,15 +47,16 @@ cli: { } #Options: [Option=string]: { - option: "--\(Option)" - default?: string | int - description: string - enum?: #Enum - name: Option - type: #OptionType - env_var?: string - example?: string - required: bool | *false + option: "--\(Option)" + default?: string | int + description: string + enum?: #Enum + name: Option + type: #OptionType + env_var?: string + example?: string + required: bool | *false + experimental: bool | *false if default == _|_ { required: true @@ -100,15 +103,16 @@ cli: { } "watch-config": { _short: "w" - description: "Watch for changes in the configuration file, and reload accordingly" + description: "Watch for changes in the configuration file and reload accordingly" env_var: "VECTOR_WATCH_CONFIG" } "enable-datadog-tracing": { description: """ - [experimental] Send internal tracing spans to a local APM-enabled - Datadog agent with a granularity matching the current log level. + Send internal tracing spans to a local APM-enabled + Datadog agent with a granularity matching the current log level. """ - env_var: "VECTOR_ENABLE_DATADOG_TRACING" + env_var: "VECTOR_ENABLE_DATADOG_TRACING" + experimental: true } } @@ -131,7 +135,7 @@ cli: { `/etc/vector/vector.toml` will be targeted. TOML, YAML and JSON file formats are supported. The format to interpret the file with is determined from - the file extension (.toml, .yaml, .json). + the file extension (`.toml`, `.yaml`, `.json`). We will fallback to TOML if we are unable to detect a supported format. """ @@ -236,7 +240,7 @@ cli: { description: """ Run Vector config unit tests, then exit. This command is experimental and therefore subject to change. For guidance on how to write unit tests check - out: \(urls.vector_unit_testing) + out the [unit testing documentation](\(urls.vector_unit_testing)). """ options: { diff --git a/docs/reference/components.cue b/docs/cue/reference/components.cue similarity index 96% rename from docs/reference/components.cue rename to docs/cue/reference/components.cue index e4e428cd43b56..1912b03db772a 100644 --- a/docs/reference/components.cue +++ b/docs/cue/reference/components.cue @@ -68,14 +68,14 @@ components: { // `examples` demonstrates various ways to use the component using an // input, output, and example configuration. #ExampleConfig: { - title: string - context?: string + title: string + context?: string "configuration": { ... for k, v in configuration { "\( k )"?: _ | *null } - } + } | string if Kind == "source" { input: string @@ -436,13 +436,14 @@ components: { #Policy: { #RequiredFor: "write" | "healthcheck" + // TODO: come up with a less janky URL generation scheme _action: !="" required_for: *["write"] | [#RequiredFor, ...#RequiredFor] docs_url: !="" required_when?: !="" if platform == "aws" { - docs_url: "https://docs.aws.amazon.com/\(_docs_tag)/latest/APIReference/API_\(_action).html" + docs_url: "https://docs.aws.amazon.com/\(_docs_tag)/latest/\(_url_fragment)/API_\(_action).html" action: "\(_service):\(_action)" } if platform == "gcp" { @@ -456,7 +457,21 @@ components: { _service: !="" // The slug of the service, e.g. "s3" or "firehose" // _docs_tag is used to ed to construct URLs, e.g. "AmazonCloudWatchLogs" in // https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeLogStreams.html - _docs_tag: *_service | !="" + _docs_tag: *_service | !="" + _url_fragment: !="" | *"APIReference" + + // For use in the view layer + platform_title: !="" + platform_link: !="" + + if platform == "aws" { + platform_title: "Amazon Web Services" + platform_link: "https://aws.amazon.com" + } + if platform == "gcp" { + platform_title: "Google Cloud Platform" + platform_link: "https://cloud.google.com" + } } #Runtime: { @@ -753,7 +768,12 @@ components: { _timezone: { common: false - description: "The name of the time zone to apply to timestamp conversions that do not contain an explicit time zone. This overrides the global [`timezone` option][docs.reference.configuration.global-options#timezone]. The time zone name may be any name in the [TZ database][urls.tz_time_zones], or `local` to indicate system local time." + description: """ + The name of the time zone to apply to timestamp conversions that do not contain an explicit time + zone. This overrides the global [`timezone` option](\(urls.vector_configuration)/global-options#timezone). + The time zone name may be any name in the [TZ database](\(urls.tz_time_zones)), or `local` to + indicate system local time. + """ required: false warnings: [] type: string: { diff --git a/docs/reference/components/aws.cue b/docs/cue/reference/components/aws.cue similarity index 83% rename from docs/reference/components/aws.cue rename to docs/cue/reference/components/aws.cue index aa81ac5ce830a..893e856684fb8 100644 --- a/docs/reference/components/aws.cue +++ b/docs/cue/reference/components/aws.cue @@ -134,14 +134,6 @@ components: _aws: { } } - AWS_SHARED_CREDENTIALS_FILE: { - description: "Specifies the location of the file that the AWS CLI uses to store access keys." - type: string: { - default: "~/.aws/credentials" - syntax: "literal" - } - } - AWS_SESSION_TOKEN: { description: "The AWS session token. Used for AWS authentication when communicating with AWS services." type: string: { @@ -150,24 +142,31 @@ components: _aws: { syntax: "literal" } } + + AWS_SHARED_CREDENTIALS_FILE: { + description: "Specifies the location of the file that the AWS CLI uses to store access keys." + type: string: { + default: "~/.aws/credentials" + syntax: "literal" + } + } } how_it_works: { aws_authentication: { - title: "AWS Authentication" + title: "AWS authentication" body: """ Vector checks for AWS credentials in the following order: - 1. Options [`access_key_id`](#access_key_id) and [`secret_access_key`](#secret_access_key). - 2. Environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. - 3. The [`credential_process` command](\(urls.aws_credential_process)) in the AWS config file. (usually located at `~/.aws/config`) - 4. The [AWS credentials file](\(urls.aws_credentials_file)). (usually located at `~/.aws/credentials`) - 5. The [IAM instance profile](\(urls.iam_instance_profile)). (will only work if running on an EC2 instance with an instance profile/role) - - If credentials are not found the [healtcheck](#healthchecks) will fail and an - error will be [logged][docs.monitoring#logs]. + 1. The [`access_key_id`](#auth.access_key_id) and [`secret_access_key`](#auth.secret_access_key) options. + 2. The [`AWS_ACCESS_KEY_ID`](#auth.access_key_id) and [`AWS_SECRET_ACCESS_KEY`](#auth.secret_access_key) environment variables. + 3. The [`credential_process` command](\(urls.aws_credential_process)) in the AWS config file (usually located at `~/.aws/config`). + 4. The [AWS credentials file](\(urls.aws_credentials_file)) (usually located at `~/.aws/credentials`). + 5. The [IAM instance profile](\(urls.iam_instance_profile)) (only works if running on an EC2 instance with an instance profile/role). - Vector will search again for AWS credentials once they expire. + If no credentials are found, Vector's health check fails and an error is [logged](\(urls.vector_monitoring)). + If your AWS credentials expire, Vector will automatically search for up-to-date + credentials in the places (and order) described above. """ sub_sections: [ { @@ -176,14 +175,14 @@ components: _aws: { In general, we recommend using instance profiles/roles whenever possible. In cases where this is not possible you can generate an AWS access key for any user within your AWS account. AWS provides a [detailed guide](\(urls.aws_access_keys)) on - how to do this. Such created AWS access keys can be used via [`access_key_id`](#access_key_id) - and [`secret_access_key`](#secret_access_key) options. + how to do this. Such created AWS access keys can be used via [`access_key_id`](#auth.access_key_id) + and [`secret_access_key`](#auth.secret_access_key) options. """ }, { title: "Assuming roles" body: """ - Vector can assume an AWS IAM role via the [`assume_role`](#assume_role) option. This is an + Vector can assume an AWS IAM role via the [`assume_role`](#auth.assume_role) option. This is an optional setting that is helpful for a variety of use cases, such as cross account access. """ diff --git a/docs/reference/components/kafka.cue b/docs/cue/reference/components/kafka.cue similarity index 100% rename from docs/reference/components/kafka.cue rename to docs/cue/reference/components/kafka.cue diff --git a/docs/reference/components/sinks.cue b/docs/cue/reference/components/sinks.cue similarity index 89% rename from docs/reference/components/sinks.cue rename to docs/cue/reference/components/sinks.cue index 1c83b7ea97410..8ec7b0aa928c7 100644 --- a/docs/reference/components/sinks.cue +++ b/docs/cue/reference/components/sinks.cue @@ -68,7 +68,7 @@ components: sinks: [Name=string]: { options: { max_events: { common: true - description: "The maximum number of [events][docs.data-model] allowed in the buffer." + description: "The maximum number of [events](\(urls.vector_data_model)) allowed in the buffer." required: false relevant_when: "type = \"memory\"" type: uint: { @@ -413,32 +413,21 @@ components: sinks: [Name=string]: { if features.send.batch != _|_ { if features.send.batch.enabled { buffers_batches: { - _parameter: string - if features.send.batch.max_bytes != _|_ && features.send.batch.max_events == _|_ { - _parameter: "`max_bytes`" - } - if features.send.batch.max_bytes == _|_ && features.send.batch.max_events != _|_ { - _parameter: "`max_events`" - } - if features.send.batch.max_bytes != _|_ && features.send.batch.max_events != _|_ { - _parameter: "`max_bytes` or `max_events`" - } - title: "Buffers & batches" - body: """ - - - This component buffers & batches data as shown in the diagram above. You'll notice that Vector treats these concepts - differently, instead of treating them as global concepts, Vector treats them - as sink specific concepts. This isolates sinks, ensuring services disruptions - are contained and delivery guarantees are honored. + title: "Buffers and batches" + svg: "/img/buffers-and-batches-serial.svg" + body: #""" + This component buffers & batches data as shown in the diagram above. You'll notice that + Vector treats these concepts differently, instead of treating them as global concepts, + Vector treats them as sink specific concepts. This isolates sinks, ensuring services + disruptions are contained and delivery guarantees are honored. - *Batches* are flushed when 1 of 2 conditions are met: + *Batches* are flushed when 1 of 2 conditions are met: - 1. The batch age meets or exceeds the configured `timeout_secs`. - 2. The batch meets or exceeds the configured \(_parameter) + 1. The batch age meets or exceeds the configured `timeout_secs`. + 2. The batch size meets or exceeds the configured `max_size` or `max_events`. - *Buffers* are controlled via the [`buffer.*`](#buffer) options. - """ + *Buffers* are controlled via the [`buffer.*`](#buffer) options. + """# } } } @@ -447,9 +436,8 @@ components: sinks: [Name=string]: { if features.send == _|_ { buffers: { title: "Buffers" + svg: "/img/buffers.svg" body: """ - - This component buffers events as shown in the diagram above. This helps to smooth out data processing if the downstream service applies backpressure. Buffers are controlled via the @@ -472,22 +460,20 @@ components: sinks: [Name=string]: { { title: "Require health checks" body: """ - If you'd like to exit immediately upon a health - check failure, you can pass the - `--require-healthy` flag: + If you'd like to exit immediately upon a health check failure, you can pass the + `--require-healthy` flag: - ```bash - vector --config /etc/vector/vector.toml --require-healthy - ``` - """ + ```bash + vector --config /etc/vector/vector.toml --require-healthy + ``` + """ }, { title: "Disable health checks" body: """ - If you'd like to disable health checks for this - sink you can set the `healthcheck` option to - `false`. - """ + If you'd like to disable health checks for this sink you can set the `healthcheck` option to + `false`. + """ }, ] } @@ -505,7 +491,7 @@ components: sinks: [Name=string]: { ```toml title="vector.toml" [sinks.my-sink] - dynamic_option = "application={{ application_id }}" + dynamic_option = "application={{ application_id }}" ``` In the above example, the `application_id` for each event will be @@ -577,9 +563,8 @@ components: sinks: [Name=string]: { transport_layer_security: { title: "Transport Layer Security (TLS)" body: """ - Vector uses [Openssl](\(urls.openssl)) for TLS protocols for it's - maturity. You can enable and adjust TLS behavior via the `tls.*` - options. + Vector uses [OpenSSL](\(urls.openssl)) for TLS protocols due to OpenSSL's maturity. You can + enable and adjust TLS behavior using the [`tls.*`](#tls) options. """ } } diff --git a/docs/reference/components/sinks/aws_cloudwatch.cue b/docs/cue/reference/components/sinks/aws_cloudwatch.cue similarity index 100% rename from docs/reference/components/sinks/aws_cloudwatch.cue rename to docs/cue/reference/components/sinks/aws_cloudwatch.cue diff --git a/docs/reference/components/sinks/aws_cloudwatch_logs.cue b/docs/cue/reference/components/sinks/aws_cloudwatch_logs.cue similarity index 99% rename from docs/reference/components/sinks/aws_cloudwatch_logs.cue rename to docs/cue/reference/components/sinks/aws_cloudwatch_logs.cue index 99e517b05269a..49a054111ddbf 100644 --- a/docs/reference/components/sinks/aws_cloudwatch_logs.cue +++ b/docs/cue/reference/components/sinks/aws_cloudwatch_logs.cue @@ -122,7 +122,7 @@ components: sinks: aws_cloudwatch_logs: components._aws & { permissions: iam: [ { platform: "aws" - _service: "logs" + _service: "AmazonCloudWatchLogs" policies: [ { diff --git a/docs/reference/components/sinks/aws_cloudwatch_metrics.cue b/docs/cue/reference/components/sinks/aws_cloudwatch_metrics.cue similarity index 100% rename from docs/reference/components/sinks/aws_cloudwatch_metrics.cue rename to docs/cue/reference/components/sinks/aws_cloudwatch_metrics.cue diff --git a/docs/reference/components/sinks/aws_kinesis_firehose.cue b/docs/cue/reference/components/sinks/aws_kinesis_firehose.cue similarity index 100% rename from docs/reference/components/sinks/aws_kinesis_firehose.cue rename to docs/cue/reference/components/sinks/aws_kinesis_firehose.cue diff --git a/docs/reference/components/sinks/aws_kinesis_streams.cue b/docs/cue/reference/components/sinks/aws_kinesis_streams.cue similarity index 89% rename from docs/reference/components/sinks/aws_kinesis_streams.cue rename to docs/cue/reference/components/sinks/aws_kinesis_streams.cue index 164f2acf8ae2b..86df2f191bfc2 100644 --- a/docs/reference/components/sinks/aws_kinesis_streams.cue +++ b/docs/cue/reference/components/sinks/aws_kinesis_streams.cue @@ -121,17 +121,18 @@ components: sinks: aws_kinesis_streams: components._aws & { To override this, you can supply the `partition_key_field` option. This option presents an alternate field on your event to use as the partition key value instead. This is useful if you have a field already on your event, and it also pairs - nicely with the [`add_fields` transform][docs.transforms.add_fields]. + nicely with the [`remap` transform](\(urls.vector_remap_transform)), which enables you + to add partition-related metadata to events. """ sub_sections: [ { title: "Missing partition keys" - body: """ - Kenesis requires a value for the partition key and therefore if the key is - missing or the value is blank the event will be dropped and a - [`warning` level log event][docs.monitoring#logs] will be logged. As such, - the field specified in the `partition_key_field` option should always contain - a value. + body: """ + Kinesis requires a value for the partition key. If the key is missing or the + value is blank, the event is dropped and a + [`warning`-level log event](\(urls.vector_monitoring)) is logged. The field + specified in the `partition_key_field` option should thus always contain a + value. """ }, { diff --git a/docs/reference/components/sinks/aws_s3.cue b/docs/cue/reference/components/sinks/aws_s3.cue similarity index 99% rename from docs/reference/components/sinks/aws_s3.cue rename to docs/cue/reference/components/sinks/aws_s3.cue index 9a4143ddf8118..d6f4f6a6c5791 100644 --- a/docs/reference/components/sinks/aws_s3.cue +++ b/docs/cue/reference/components/sinks/aws_s3.cue @@ -413,9 +413,10 @@ components: sinks: aws_s3: components._aws & { permissions: iam: [ { - platform: "aws" - _service: "s3" - _docs_tag: "AmazonS3" + platform: "aws" + _service: "s3" + _docs_tag: "AmazonS3" + _url_fragment: "API" policies: [ { @@ -423,7 +424,7 @@ components: sinks: aws_s3: components._aws & { required_for: ["healthcheck"] }, { - _action: "ListBucket" + _action: "ListBuckets" required_for: ["healthcheck"] }, { diff --git a/docs/reference/components/sinks/aws_sqs.cue b/docs/cue/reference/components/sinks/aws_sqs.cue similarity index 100% rename from docs/reference/components/sinks/aws_sqs.cue rename to docs/cue/reference/components/sinks/aws_sqs.cue diff --git a/docs/reference/components/sinks/azure_blob.cue b/docs/cue/reference/components/sinks/azure_blob.cue similarity index 86% rename from docs/reference/components/sinks/azure_blob.cue rename to docs/cue/reference/components/sinks/azure_blob.cue index f4532d5b8acdf..18691ceb812b5 100644 --- a/docs/reference/components/sinks/azure_blob.cue +++ b/docs/cue/reference/components/sinks/azure_blob.cue @@ -138,51 +138,38 @@ components: sinks: azure_blob: { object_naming: { title: "Object naming" body: """ - By default, Vector will name your blobs in the following format: + By default, Vector names your blobs different based on whether or not the blobs are compressed. - - - + Here is the format without compression: ```text -.log ``` - For example: + Here's an example blob name *without* compression: ```text blob/2021-06-23/1560886634-fddd7a0e-fad9-4f7e-9bce-00ae5debc563.log ``` - - + And here is the format *with* compression: ```text -.log.gz ``` - For example: + An example blob name with compression: ```text blob/2021-06-23/1560886634-fddd7a0e-fad9-4f7e-9bce-00ae5debc563.log.gz ``` - - - Vector appends a [UUIDV4](\(urls.uuidv4)) token to ensure there are no name - conflicts in the unlikely event 2 Vector instances are writing data at the same + conflicts in the unlikely event that two Vector instances are writing data at the same time. - You can control the resulting name via the `blob_prefix`, `blob_time_format`, - and `blob_append_uuid` options. + You can control the resulting name via the [`blob_prefix`](#blob_prefix), + [`blob_time_format`](#blob_time_format), and [`blob_append_uuid`](#blob_append_uuid) options. """ } } diff --git a/docs/reference/components/sinks/azure_monitor_logs.cue b/docs/cue/reference/components/sinks/azure_monitor_logs.cue similarity index 100% rename from docs/reference/components/sinks/azure_monitor_logs.cue rename to docs/cue/reference/components/sinks/azure_monitor_logs.cue diff --git a/docs/reference/components/sinks/blackhole.cue b/docs/cue/reference/components/sinks/blackhole.cue similarity index 100% rename from docs/reference/components/sinks/blackhole.cue rename to docs/cue/reference/components/sinks/blackhole.cue diff --git a/docs/reference/components/sinks/clickhouse.cue b/docs/cue/reference/components/sinks/clickhouse.cue similarity index 100% rename from docs/reference/components/sinks/clickhouse.cue rename to docs/cue/reference/components/sinks/clickhouse.cue diff --git a/docs/reference/components/sinks/console.cue b/docs/cue/reference/components/sinks/console.cue similarity index 100% rename from docs/reference/components/sinks/console.cue rename to docs/cue/reference/components/sinks/console.cue diff --git a/docs/reference/components/sinks/datadog.cue b/docs/cue/reference/components/sinks/datadog.cue similarity index 94% rename from docs/reference/components/sinks/datadog.cue rename to docs/cue/reference/components/sinks/datadog.cue index 701fe3f761a94..fda0e580bcf6d 100644 --- a/docs/reference/components/sinks/datadog.cue +++ b/docs/cue/reference/components/sinks/datadog.cue @@ -64,7 +64,7 @@ components: sinks: _datadog: { } site: { common: false - description: "The (Datadog site)[https://docs.datadoghq.com/getting_started/site/] to send data to. " + description: "The [Datadog site](https://docs.datadoghq.com/getting_started/site) to send data to. " required: false relevant_when: "endpoint is not set" warnings: [] diff --git a/docs/reference/components/sinks/datadog_events.cue b/docs/cue/reference/components/sinks/datadog_events.cue similarity index 100% rename from docs/reference/components/sinks/datadog_events.cue rename to docs/cue/reference/components/sinks/datadog_events.cue diff --git a/docs/reference/components/sinks/datadog_logs.cue b/docs/cue/reference/components/sinks/datadog_logs.cue similarity index 100% rename from docs/reference/components/sinks/datadog_logs.cue rename to docs/cue/reference/components/sinks/datadog_logs.cue diff --git a/docs/reference/components/sinks/datadog_metrics.cue b/docs/cue/reference/components/sinks/datadog_metrics.cue similarity index 100% rename from docs/reference/components/sinks/datadog_metrics.cue rename to docs/cue/reference/components/sinks/datadog_metrics.cue diff --git a/docs/reference/components/sinks/elasticsearch.cue b/docs/cue/reference/components/sinks/elasticsearch.cue similarity index 82% rename from docs/reference/components/sinks/elasticsearch.cue rename to docs/cue/reference/components/sinks/elasticsearch.cue index 413f2416a44ce..700ebf013d2ee 100644 --- a/docs/reference/components/sinks/elasticsearch.cue +++ b/docs/cue/reference/components/sinks/elasticsearch.cue @@ -80,7 +80,8 @@ components: sinks: elasticsearch: { } requirements: [ #""" - Elasticsearch's Data streams feature requires Vector to be configured with the `create` `bulk_action`. *This is not enabled by default.* + Elasticsearch's Data streams feature requires Vector to be configured with the `create` `bulk_action`. + This is *not* enabled by default. """#, ] warnings: [] @@ -139,7 +140,7 @@ components: sinks: elasticsearch: { options: { region: { common: true - description: "The [AWS region][urls.aws_regions] of the target service. This defaults to the region named in the endpoint parameter, or the value of the `$AWS_REGION` or `$AWS_DEFAULT_REGION` environment variables if that cannot be determined, or \"us-east-1\"." + description: "The [AWS region](\(urls.aws_regions)) of the target service. This defaults to the region named in the endpoint parameter, or the value of the `$AWS_REGION` or `$AWS_DEFAULT_REGION` environment variables if that cannot be determined, or \"us-east-1\"." required: false warnings: [] type: string: { @@ -153,7 +154,10 @@ components: sinks: elasticsearch: { } bulk_action: { common: false - description: "Action to use when making requests to the [Elasticsearch Bulk API](elasticsearch_bulk). Currently, Vector only supports `index` and `create` in the `regular` mode and `create` in `data_stream` mode. `update` and `delete` actions are not supported." + description: """ + Action to use when making requests to the [Elasticsearch Bulk API](\(urls.elasticsearch_bulk)). + Currently, Vector only supports `index` and `create`. `update` and `delete` actions are not supported. + """ required: false warnings: [] type: string: { @@ -245,7 +249,7 @@ components: sinks: elasticsearch: { } id_key: { common: false - description: "The name of the event key that should map to Elasticsearch's [`_id` field][urls.elasticsearch_id_field]. By default, Vector does not set the `_id` field, which allows Elasticsearch to set this automatically. You should think carefully about setting your own Elasticsearch IDs, since this can [hinder perofrmance][urls.elasticsearch_id_performance]." + description: "The name of the event key that should map to Elasticsearch's [`_id` field](\(urls.elasticsearch_id_field)). By default, Vector does not set the `_id` field, which allows Elasticsearch to set this automatically. You should think carefully about setting your own Elasticsearch IDs, since this can [hinder perofrmance](\(urls.elasticsearch_id_performance))." required: false warnings: [] type: string: { @@ -330,32 +334,33 @@ components: sinks: elasticsearch: { how_it_works: { conflicts: { title: "Conflicts" - body: """ - Vector [batches](#buffers--batches) data flushes it to Elasticsearch's - [`_bulk` API endpoint][urls.elasticsearch_bulk]. By default, all events are - inserted via the `index` action which will replace documents if an existing + body: """ + Vector [batches](#buffers-and-batches) data and flushes it to Elasticsearch's + [`_bulk` API endpoint](\(urls.elasticsearch_bulk)). By default, all events are + inserted via the `index` action, which replaces documents if an existing one has the same `id`. If `bulk_action` is configured with `create`, Elasticsearch - will _not_ replace an existing document and instead return a conflict error. + does _not_ replace an existing document and instead returns a conflict error. """ } data_streams: { title: "Data streams" - body: """ - To use [Data streams][urls.elasticsearch_data_streams], set the `mode` to `data_stream`. - The `index` is not used but use the combination of `data_stream.type`, `data_stream.dataset` and `data_stream.namespace`. + body: """ + By default, Vector uses the `index` action with Elasticsearch's Bulk API. + To use [Data streams](\(urls.elasticsearch_data_streams)), set the `mode` to + `data_stream`. Use the combination of `data_stream.type`, `data_stream.dataset` and + `data_stream.namespace` instead of `index`. """ } partial_failures: { title: "Partial Failures" body: """ - By default, Elasticsearch will allow partial bulk ingestion - failures. This is typically due to type Elasticsearch index - mapping errors, where data keys are not consistently typed. - To change this behavior please refer to the Elasticsearch - [`ignore_malformed` setting](\(urls.elasticsearch_ignore_malformed)). - """ + By default, Elasticsearch allows partial bulk ingestion failures. This is typically + due to Elasticsearch index mapping errors, where data keys aren't consistently + typed. To change this behavior, refer to the Elasticsearch [`ignore_malformed` + setting](\(urls.elasticsearch_ignore_malformed)). + """ } aws_authentication: components._aws.how_it_works.aws_authentication diff --git a/docs/reference/components/sinks/file.cue b/docs/cue/reference/components/sinks/file.cue similarity index 100% rename from docs/reference/components/sinks/file.cue rename to docs/cue/reference/components/sinks/file.cue diff --git a/docs/reference/components/sinks/gcp.cue b/docs/cue/reference/components/sinks/gcp.cue similarity index 89% rename from docs/reference/components/sinks/gcp.cue rename to docs/cue/reference/components/sinks/gcp.cue index 85ced2869f21f..4cbd1d96acafb 100644 --- a/docs/reference/components/sinks/gcp.cue +++ b/docs/cue/reference/components/sinks/gcp.cue @@ -31,8 +31,8 @@ components: sinks: [Name=string]: { 1. If the [`GOOGLE_APPLICATION_CREDENTIALS`](#google_application_credentials) envrionment variable is set. 1. Finally, Vector will check for an [instance service account](\(urls.gcp_authentication_service_account)). - If credentials are not found the [healtcheck](#healthchecks) will fail and an - error will be [logged][docs.monitoring#logs]. + If credentials aren't found, Vector's health checks fail and an error is + [logged](\(urls.vector_monitoring)). """ } } diff --git a/docs/reference/components/sinks/gcp_cloud_storage.cue b/docs/cue/reference/components/sinks/gcp_cloud_storage.cue similarity index 87% rename from docs/reference/components/sinks/gcp_cloud_storage.cue rename to docs/cue/reference/components/sinks/gcp_cloud_storage.cue index e87421a073ee3..ed6331e3304bd 100644 --- a/docs/reference/components/sinks/gcp_cloud_storage.cue +++ b/docs/cue/reference/components/sinks/gcp_cloud_storage.cue @@ -91,7 +91,7 @@ components: sinks: gcp_cloud_storage: { acl: { category: "ACL" common: false - description: "Predefined ACL to apply to the created objects. For more information, see [Predefined ACLs][urls.gcs_predefined_acl]. If this is not set, GCS will apply a default ACL when the object is created." + description: "Predefined ACL to apply to the created objects. For more information, see [Predefined ACLs](\(urls.gcs_predefined_acl)). If this is not set, GCS will apply a default ACL when the object is created." required: false warnings: [] type: string: { @@ -150,7 +150,7 @@ components: sinks: gcp_cloud_storage: { filename_time_format: { category: "File Naming" common: false - description: "The format of the resulting object file name. [`strftime` specifiers][urls.strptime_specifiers] are supported." + description: "The format of the resulting object file name. [`strftime` specifiers](\(urls.strptime_specifiers)) are supported." required: false warnings: [] type: string: { @@ -172,7 +172,7 @@ components: sinks: gcp_cloud_storage: { } metadata: { common: false - description: "The set of metadata `key:value` pairs for the created objects. See the [GCS custom metadata][urls.gcs_custom_metadata] documentation for more details." + description: "The set of metadata `key:value` pairs for the created objects. See the [GCS custom metadata](\(urls.gcs_custom_metadata)) documentation for more details." required: false warnings: [] type: string: { @@ -184,7 +184,7 @@ components: sinks: gcp_cloud_storage: { storage_class: { category: "Storage" common: false - description: "The storage class for the created objects. See [the GCP storage classes][urls.gcs_storage_classes] for more details." + description: "The storage class for the created objects. See [the GCP storage classes](\(urls.gcs_storage_classes)) for more details." required: false warnings: [] type: string: { @@ -217,53 +217,41 @@ components: sinks: gcp_cloud_storage: { """ } object_naming: { - title: "Object Naming" - body: """ - By default, Vector will name your GCS objects in the following format: - - + title: "Object naming" + body: """ + By default, Vector names your GCS objects in accordance with one of two formats. - + If compression *is* enabled, this format is used: ```text - -.log + key_prefix>-.log.gz ``` - For example: + Here's an example name in the compression-enabled format: ```text - date=2019-06-18/1560886634-fddd7a0e-fad9-4f7e-9bce-00ae5debc563.log + date=2019-06-18/1560886634-fddd7a0e-fad9-4f7e-9bce-00ae5debc563.log.gz ``` - - + If compression is *not* enabled, this format is used: ```text - -.log.gz + -.log ``` - For example: + Here's an example name in the compression-disabled format: ```text - date=2019-06-18/1560886634-fddd7a0e-fad9-4f7e-9bce-00ae5debc563.log.gz + date=2019-06-18/1560886634-fddd7a0e-fad9-4f7e-9bce-00ae5debc563.log ``` - - - - Vector appends a [UUIDV4][urls.uuidv4] token to ensure there are no name - conflicts in the unlikely event 2 Vector instances are writing data at the same + Vector appends a [UUIDV4](\(urls.uuidv4)) token to ensure there are no name + conflicts in the unlikely event that two Vector instances are writing data at the same time. - You can control the resulting name via the `key_prefix`, `filename_time_format`, - and `filename_append_uuid` options. + You can control the resulting name via the [`key_prefix`](#key_prefix), + [`filename_time_format`](#filename_time_format), + and [`filename_append_uuid`](#filename_append_uuid) options. """ } diff --git a/docs/reference/components/sinks/gcp_pubsub.cue b/docs/cue/reference/components/sinks/gcp_pubsub.cue similarity index 95% rename from docs/reference/components/sinks/gcp_pubsub.cue rename to docs/cue/reference/components/sinks/gcp_pubsub.cue index 503eef107c259..c36bf9f6c0a04 100644 --- a/docs/reference/components/sinks/gcp_pubsub.cue +++ b/docs/cue/reference/components/sinks/gcp_pubsub.cue @@ -82,7 +82,7 @@ components: sinks: gcp_pubsub: { configuration: { api_key: { common: false - description: "A [Google Cloud API key][urls.gcp_authentication_api_key] used to authenticate access the pubsub project and topic. Either this or `credentials_path` must be set." + description: "A [Google Cloud API key](\(urls.gcp_authentication_api_key)) used to authenticate access the pubsub project and topic. Either this or `credentials_path` must be set." required: false warnings: [] type: string: { diff --git a/docs/reference/components/sinks/gcp_stackdriver_logs.cue b/docs/cue/reference/components/sinks/gcp_stackdriver_logs.cue similarity index 57% rename from docs/reference/components/sinks/gcp_stackdriver_logs.cue rename to docs/cue/reference/components/sinks/gcp_stackdriver_logs.cue index 90b7c722ab1ad..8fc9c2b7bbc6a 100644 --- a/docs/reference/components/sinks/gcp_stackdriver_logs.cue +++ b/docs/cue/reference/components/sinks/gcp_stackdriver_logs.cue @@ -80,9 +80,14 @@ components: sinks: gcp_stackdriver_logs: { configuration: { billing_account_id: { - common: false - description: "The billing account ID to which to publish logs.\n\nExactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set." - required: false + common: false + description: """ + The billing account ID to which to publish logs. + + Exactly one of must be set: `billing_account_id`, `folder_id`, `organization_id`, + or `project_id`. + """ + required: false warnings: [] type: string: { default: null @@ -91,9 +96,17 @@ components: sinks: gcp_stackdriver_logs: { } } credentials_path: { - common: true - description: "The filename for a Google Cloud service account credentials JSON file used to authenticate access to the Stackdriver Logging API. If this is unset, Vector checks the `GOOGLE_APPLICATION_CREDENTIALS` environment variable for a filename.\n\nIf no filename is named, Vector will attempt to fetch an instance service account for the compute instance the program is running on. If Vector is not running on a GCE instance, you must define a credentials file as above." - required: false + common: true + description: """ + The filename for a Google Cloud service account credentials JSON file used to authenticate access to the + Stackdriver Logging API. If this is unset, Vector checks the `GOOGLE_APPLICATION_CREDENTIALS` + environment variable for a filename. + + If no filename is named, Vector attempts to fetch an instance service account for the compute instance + the program is running on. If Vector is not running on a GCE instance, you must define a credentials + file as above. + """ + required: false warnings: [] type: string: { default: null @@ -103,7 +116,13 @@ components: sinks: gcp_stackdriver_logs: { } folder_id: { common: false - description: "The folder ID to which to publish logs.\nSee the [Google Cloud Platform folder documentation][urls.gcp_folders] for more details.\n\nExactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set." + description: """ + The folder ID to which to publish logs. + + See the [Google Cloud Platform folder documentation](\(urls.gcp_folders)) for more details. + + Exactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set. + """ required: false warnings: [] type: string: { @@ -122,9 +141,14 @@ components: sinks: gcp_stackdriver_logs: { } } organization_id: { - common: false - description: "The organization ID to which to publish logs. This would be the identifier assigned to your organization on Google Cloud Platform.\n\nExactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set." - required: false + common: false + description: """ + The organization ID to which to publish logs. This would be the identifier assigned to your organization + on Google Cloud Platform. + + Exactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set. + """ + required: false warnings: [] type: string: { default: null @@ -133,7 +157,12 @@ components: sinks: gcp_stackdriver_logs: { } } project_id: { - description: "The project ID to which to publish logs. See the [Google Cloud Platform project management documentation][urls.gcp_projects] for more details.\n\nExactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set." + description: """ + The project ID to which to publish logs. See the + [Google Cloud Platform project management documentation](\(urls.gcp_projects)) for more details. + + Exactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set. + """ required: true warnings: [] type: string: { @@ -156,7 +185,13 @@ components: sinks: gcp_stackdriver_logs: { ] options: { type: { - description: "The monitored resource type. For example, the type of a Compute Engine VM instance is gce_instance.\n\nSee the [Google Cloud Platform monitored resource documentation][urls.gcp_resources] for more details." + description: """ + The monitored resource type. For example, the type of a Compute Engine VM instance is + `gce_instance`. + + See the [Google Cloud Platform monitored resource documentation](\(urls.gcp_resources)) for + more details. + """ required: true warnings: [] type: string: { @@ -165,9 +200,14 @@ components: sinks: gcp_stackdriver_logs: { } } "*": { - common: false - description: "Values for all of the labels listed in the associated monitored resource descriptor.\n\nFor example, Compute Engine VM instances use the labels `projectId`, `instanceId`, and `zone`." - required: false + common: false + description: """ + Values for all of the labels listed in the associated monitored resource descriptor. + + For example, Compute Engine VM instances use the labels `projectId`, `instanceId`, and + `zone`. + """ + required: false warnings: [] type: string: { default: null @@ -180,7 +220,17 @@ components: sinks: gcp_stackdriver_logs: { } severity_key: { common: false - description: "The field of the log event from which to take the outgoing log's `severity` field. The named field is removed from the log event if present, and must be either an integer between 0 and 800 or a string containing one of the [severity level names][urls.gcp_stackdriver_severity] (case is ignored) or a common prefix such as `err`. This could be added by an [`add_fields` transform][docs.transforms.add_fields] or extracted from a field from the source.\n\nIf no severity key is specified, the severity of outgoing records will be set to 0 (`DEFAULT`).\n\nSee the [GCP Stackdriver Logging LogSeverity description][urls.gcp_stackdriver_severity] for more details on the value of the `severity` field." + description: """ + The field of the log event from which to take the outgoing log's `severity` field. The named field is + removed from the log event if present, and must be either an integer between 0 and 800 or a string + containing one of the [severity level names](\(urls.gcp_stackdriver_severity)) (case is ignored) or a + common prefix such as `err`. + + If no severity key is specified, the severity of outgoing records is set to 0 (`DEFAULT`). + + See the [GCP Stackdriver Logging LogSeverity description](\(urls.gcp_stackdriver_severity)) for more + details on the value of the `severity` field. + """ required: false warnings: [] type: string: { @@ -199,29 +249,29 @@ components: sinks: gcp_stackdriver_logs: { how_it_works: { severity_level_mapping: { title: "Severity Level Mapping" - body: #""" - If a `severity_key` is configured, outgoing log records will have their + body: """ + If a `severity_key` is configured, outgoing log records have their `severity` header field set from the named field in the Vector - event. However, the [required values][urls.gcp_stackdriver_severity] for + event. However, the [required values](\(urls.gcp_stackdriver_severity)) for this field may be inconvenient to produce, typically requiring a custom mapping using an additional transform. To assist with this, this sink remaps certain commonly used words to the required numbers as in the following table. Note that only the prefix is compared, such that a value of `emergency` matches `emerg`, and the comparison ignores case. - | Prefix | Value - |:-------|:----- - | emerg | 800 - | fatal | 800 - | alert | 700 - | crit | 600 - | err | 500 - | warn | 400 - | notice | 300 - | info | 200 - | debug | 100 - | trace | 100 - """# + | Prefix | Value + |:---------|:----- + | `emerg` | 800 + | `fatal` | 800 + | `alert` | 700 + | `crit` | 600 + | `err` | 500 + | `warn` | 400 + | `notice` | 300 + | `info` | 200 + | `debug` | 100 + | `trace` | 100 + """ } } diff --git a/docs/reference/components/sinks/gcp_stackdriver_metrics.cue b/docs/cue/reference/components/sinks/gcp_stackdriver_metrics.cue similarity index 93% rename from docs/reference/components/sinks/gcp_stackdriver_metrics.cue rename to docs/cue/reference/components/sinks/gcp_stackdriver_metrics.cue index 3edbe8338a733..434cc500a7572 100644 --- a/docs/reference/components/sinks/gcp_stackdriver_metrics.cue +++ b/docs/cue/reference/components/sinks/gcp_stackdriver_metrics.cue @@ -91,7 +91,7 @@ components: sinks: gcp_stackdriver_metrics: { } } project_id: { - description: "The project ID to which to publish logs. See the [Google Cloud Platform project management documentation][urls.gcp_projects] for more details.\n\nExactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set." + description: "The project ID to which to publish logs. See the [Google Cloud Platform project management documentation](\(urls.gcp_projects)) for more details.\n\nExactly one of `billing_account_id`, `folder_id`, `organization_id`, or `project_id` must be set." required: true warnings: [] type: string: { @@ -125,7 +125,7 @@ components: sinks: gcp_stackdriver_metrics: { ] options: { type: { - description: "The monitored resource type. For example, the type of a Compute Engine VM instance is gce_instance.\n\nSee the [Google Cloud Platform monitored resource documentation][urls.gcp_resources] for more details." + description: "The monitored resource type. For example, the type of a Compute Engine VM instance is gce_instance.\n\nSee the [Google Cloud Platform monitored resource documentation](\(urls.gcp_resources)) for more details." required: true warnings: [] type: string: { diff --git a/docs/reference/components/sinks/honeycomb.cue b/docs/cue/reference/components/sinks/honeycomb.cue similarity index 100% rename from docs/reference/components/sinks/honeycomb.cue rename to docs/cue/reference/components/sinks/honeycomb.cue diff --git a/docs/reference/components/sinks/http.cue b/docs/cue/reference/components/sinks/http.cue similarity index 100% rename from docs/reference/components/sinks/http.cue rename to docs/cue/reference/components/sinks/http.cue diff --git a/docs/reference/components/sinks/humio.cue b/docs/cue/reference/components/sinks/humio.cue similarity index 81% rename from docs/reference/components/sinks/humio.cue rename to docs/cue/reference/components/sinks/humio.cue index d9f992e924bc9..3f6860393f6a8 100644 --- a/docs/reference/components/sinks/humio.cue +++ b/docs/cue/reference/components/sinks/humio.cue @@ -97,9 +97,14 @@ components: sinks: _humio: { } } event_type: { - common: false - description: "The type of events sent to this sink. Humio uses this as the name of the parser to use to ingest the data.\n\nIf unset, Humio will default it to none.\n" - required: false + common: false + description: """ + The type of events sent to this sink. Humio uses this as the name of the parser to use to ingest the + data. + + If unset, Humio will default it to none. + """ + required: false warnings: [] type: string: { default: null @@ -109,7 +114,10 @@ components: sinks: _humio: { } host_key: { common: true - description: "The name of the log field to be used as the hostname sent to Humio. This overrides the [global `host_key` option][docs.reference.configuration.global-options#host_key]." + description: """ + The name of the log field to be used as the hostname sent to Humio. This overrides the + [global `host_key` option](\(urls.vector_configuration)/global-options#log_schema.host_key). + """ required: false warnings: [] type: string: { @@ -119,9 +127,12 @@ components: sinks: _humio: { } } source: { - common: false - description: "The source of events sent to this sink. Typically the filename the logs originated from. Maps to @source in Humio.\n" - required: false + common: false + description: """ + The source of events sent to this sink. Typically the filename the logs originated from. Maps to + `@source` in Humio. + """ + required: false warnings: [] type: string: { default: null diff --git a/docs/reference/components/sinks/humio_logs.cue b/docs/cue/reference/components/sinks/humio_logs.cue similarity index 100% rename from docs/reference/components/sinks/humio_logs.cue rename to docs/cue/reference/components/sinks/humio_logs.cue diff --git a/docs/reference/components/sinks/humio_metrics.cue b/docs/cue/reference/components/sinks/humio_metrics.cue similarity index 100% rename from docs/reference/components/sinks/humio_metrics.cue rename to docs/cue/reference/components/sinks/humio_metrics.cue diff --git a/docs/reference/components/sinks/influxdb.cue b/docs/cue/reference/components/sinks/influxdb.cue similarity index 100% rename from docs/reference/components/sinks/influxdb.cue rename to docs/cue/reference/components/sinks/influxdb.cue diff --git a/docs/reference/components/sinks/influxdb_logs.cue b/docs/cue/reference/components/sinks/influxdb_logs.cue similarity index 100% rename from docs/reference/components/sinks/influxdb_logs.cue rename to docs/cue/reference/components/sinks/influxdb_logs.cue diff --git a/docs/reference/components/sinks/influxdb_metrics.cue b/docs/cue/reference/components/sinks/influxdb_metrics.cue similarity index 100% rename from docs/reference/components/sinks/influxdb_metrics.cue rename to docs/cue/reference/components/sinks/influxdb_metrics.cue diff --git a/docs/reference/components/sinks/kafka.cue b/docs/cue/reference/components/sinks/kafka.cue similarity index 100% rename from docs/reference/components/sinks/kafka.cue rename to docs/cue/reference/components/sinks/kafka.cue diff --git a/docs/reference/components/sinks/logdna.cue b/docs/cue/reference/components/sinks/logdna.cue similarity index 100% rename from docs/reference/components/sinks/logdna.cue rename to docs/cue/reference/components/sinks/logdna.cue diff --git a/docs/reference/components/sinks/loki.cue b/docs/cue/reference/components/sinks/loki.cue similarity index 82% rename from docs/reference/components/sinks/loki.cue rename to docs/cue/reference/components/sinks/loki.cue index 7929205d6b9e9..55c84b7974c00 100644 --- a/docs/reference/components/sinks/loki.cue +++ b/docs/cue/reference/components/sinks/loki.cue @@ -92,8 +92,13 @@ components: sinks: loki: { username_example: "${LOKI_USERNAME}" }} labels: { - description: "A set of labels that will be attached to each batch of events. These values are also templateable to allow events to provide dynamic label values.Note: If the set of label values has high cardinality this can cause drastic performance issues with Loki. To ensure this does not happen one should try to reduce the amount of unique label values." - required: true + description: """ + A set of labels that will be attached to each batch of events. These values are also templateable to + allow events to provide dynamic label values. Note: if the set of label values has high cardinality, + this can cause drastic performance issues with Loki. To ensure this doesn't happen, you should try to + reduce the number of unique label values. + """ + required: true warnings: [] type: object: { examples: [ @@ -120,11 +125,9 @@ components: sinks: loki: { out_of_order_action: { common: false description: """ - Some sources may generate events with timestamps that are - not strictly in chronological order. The Loki service cannot - accept a stream of such events. Vector will sort events before - sending it to Loki. However, some late events might arrive after - a batch has been sent. This option specifies what Vector should do + Some sources may generate events with timestamps that aren't in strictly chronological order. The Loki + service can't accept a stream of such events. Vector sorts events before sending them to Loki, however + some late events might arrive after a batch has been sent. This option specifies what Vector should do with those events. """ required: false @@ -154,7 +157,12 @@ components: sinks: loki: { } tenant_id: { common: false - description: "The tenant id that will be sent with every request, by default this is not required since a proxy should set this header. When running Loki locally a tenant id is not required either.\n\nYou can read more about tenant id's [here][urls.loki_multi_tenancy]" + description: """ + The tenant id that's sent with every request, by default this is not required since a proxy should set + this header. When running Loki locally a tenant id is not required either. + + You can read more about tenant id's [here](\(urls.loki_multi_tenancy)). + """ required: false warnings: [] type: string: { diff --git a/docs/reference/components/sinks/nats.cue b/docs/cue/reference/components/sinks/nats.cue similarity index 100% rename from docs/reference/components/sinks/nats.cue rename to docs/cue/reference/components/sinks/nats.cue diff --git a/docs/reference/components/sinks/new_relic_logs.cue b/docs/cue/reference/components/sinks/new_relic_logs.cue similarity index 100% rename from docs/reference/components/sinks/new_relic_logs.cue rename to docs/cue/reference/components/sinks/new_relic_logs.cue diff --git a/docs/reference/components/sinks/papertrail.cue b/docs/cue/reference/components/sinks/papertrail.cue similarity index 100% rename from docs/reference/components/sinks/papertrail.cue rename to docs/cue/reference/components/sinks/papertrail.cue diff --git a/docs/reference/components/sinks/prometheus_exporter.cue b/docs/cue/reference/components/sinks/prometheus_exporter.cue similarity index 86% rename from docs/reference/components/sinks/prometheus_exporter.cue rename to docs/cue/reference/components/sinks/prometheus_exporter.cue index 7fd54ce56d3ba..782e3b4e469ab 100644 --- a/docs/reference/components/sinks/prometheus_exporter.cue +++ b/docs/cue/reference/components/sinks/prometheus_exporter.cue @@ -59,11 +59,10 @@ components: sinks: prometheus_exporter: { requirements: [] warnings: [ """ - High cardinality metric names and labels are discouraged by - Prometheus as they can provide performance and reliability - problems. You should consider alternative strategies to reduce - the cardinality. Vector offers a [`tag_cardinality_limit` transform][docs.transforms.tag_cardinality_limit] - as a way to protect against this. + High cardinality metric names and labels are discouraged by Prometheus as they can provide performance + and reliability problems. You should consider alternative strategies to reduce the cardinality. Vector + offers a [`tag_cardinality_limit` transform](\(urls.vector_transforms)/tag_cardinality_limit) as a way + to protect against this. """, ] notices: [] @@ -81,7 +80,10 @@ components: sinks: prometheus_exporter: { } buckets: { common: false - description: "Default buckets to use for aggregating [distribution][docs.data-model.metric#distribution] metrics into histograms." + description: """ + Default buckets to use for aggregating [distribution](\(urls.vector_data_model)/metric#distribution) + metrics into histograms. + """ required: false warnings: [] type: array: { @@ -91,7 +93,7 @@ components: sinks: prometheus_exporter: { } flush_period_secs: { common: false - description: "Time interval between [set][docs.data-model.metric#set] values are reset." + description: "Time interval between [set](\(urls.vector_data_model)/metric#set) values are reset." required: false warnings: [] type: uint: { @@ -117,7 +119,10 @@ components: sinks: prometheus_exporter: { } quantiles: { common: false - description: "Quantiles to use for aggregating [distribution][docs.data-model.metric#distribution] metrics into a summary." + description: """ + Quantiles to use for aggregating [distribution](\(urls.vector_data_model)/metric#distribution) metrics + into a summary. + """ required: false warnings: [] type: array: { @@ -338,14 +343,14 @@ components: sinks: prometheus_exporter: { how_it_works: { histogram_buckets: { title: "Histogram Buckets" - body: #""" - Choosing the appropriate buckets for Prometheus histograms is a complicated - point of discussion. The [Histograms and Summaries Prometheus guide](\(urls.prometheus_histograms_guide)) provides a good overview of histograms, - buckets, summaries, and how you should think about configuring them. The buckets - you choose should align with your known range and distribution of values as - well as how you plan to report on them. The aforementioned guide provides - examples on how you should align them. - """# + body: """ + Choosing the appropriate buckets for Prometheus histograms is a complicated point of + discussion. The [Histograms and Summaries Prometheus guide](\(urls.prometheus_histograms_guide)) + provides a good overview of histograms, buckets, summaries, and how you should think + about configuring them. The buckets you choose should align with your known range + and distribution of values as well as how you plan to report on them. The + aforementioned guide provides examples on how you should align them. + """ sub_sections: [ { title: "Default Buckets" diff --git a/docs/reference/components/sinks/prometheus_remote_write.cue b/docs/cue/reference/components/sinks/prometheus_remote_write.cue similarity index 94% rename from docs/reference/components/sinks/prometheus_remote_write.cue rename to docs/cue/reference/components/sinks/prometheus_remote_write.cue index 758c6c891c079..e19ab3afb698b 100644 --- a/docs/reference/components/sinks/prometheus_remote_write.cue +++ b/docs/cue/reference/components/sinks/prometheus_remote_write.cue @@ -77,7 +77,8 @@ components: sinks: prometheus_remote_write: { High cardinality metric names and labels are discouraged by Prometheus as they can provide performance and reliability problems. You should consider alternative strategies to reduce - the cardinality. Vector offers a [`tag_cardinality_limit` transform][docs.transforms.tag_cardinality_limit] + the cardinality. Vector offers a [`tag_cardinality_limit` + transform](\(urls.vector_transforms)/tag_cardinality_limit) as a way to protect against this. """, ] @@ -115,7 +116,7 @@ components: sinks: prometheus_remote_write: { } buckets: { common: false - description: "Default buckets to use for aggregating [distribution][docs.data-model.metric#distribution] metrics into histograms." + description: "Default buckets to use for aggregating [distribution](\(urls.vector_metric)/#distribution) metrics into histograms." required: false warnings: [] type: array: { @@ -125,7 +126,7 @@ components: sinks: prometheus_remote_write: { } quantiles: { common: false - description: "Quantiles to use for aggregating [distribution][docs.data-model.metric#distribution] metrics into a summary." + description: "Quantiles to use for aggregating [distribution](\(urls.vector_metric)/#distribution) metrics into a summary." required: false warnings: [] type: array: { diff --git a/docs/reference/components/sinks/pulsar.cue b/docs/cue/reference/components/sinks/pulsar.cue similarity index 100% rename from docs/reference/components/sinks/pulsar.cue rename to docs/cue/reference/components/sinks/pulsar.cue diff --git a/docs/reference/components/sinks/redis.cue b/docs/cue/reference/components/sinks/redis.cue similarity index 100% rename from docs/reference/components/sinks/redis.cue rename to docs/cue/reference/components/sinks/redis.cue diff --git a/docs/reference/components/sinks/sematext.cue b/docs/cue/reference/components/sinks/sematext.cue similarity index 100% rename from docs/reference/components/sinks/sematext.cue rename to docs/cue/reference/components/sinks/sematext.cue diff --git a/docs/reference/components/sinks/sematext_logs.cue b/docs/cue/reference/components/sinks/sematext_logs.cue similarity index 100% rename from docs/reference/components/sinks/sematext_logs.cue rename to docs/cue/reference/components/sinks/sematext_logs.cue diff --git a/docs/reference/components/sinks/sematext_metrics.cue b/docs/cue/reference/components/sinks/sematext_metrics.cue similarity index 97% rename from docs/reference/components/sinks/sematext_metrics.cue rename to docs/cue/reference/components/sinks/sematext_metrics.cue index 512bc458f5300..96a18596f5816 100644 --- a/docs/reference/components/sinks/sematext_metrics.cue +++ b/docs/cue/reference/components/sinks/sematext_metrics.cue @@ -49,7 +49,7 @@ components: sinks: sematext_metrics: { """ [Sematext monitoring](\(urls.sematext_monitoring)) only accepts metrics which contain a single value. Therefore, only `counter` and `gauge` metrics are supported. If you'd like to ingest other - metric types please consider using the [`metric_to_log` transform][docs.transforms.metric_to_log] + metric types please consider using the [`metric_to_log` transform](\(urls.vector_transforms)/metric_to_log) with the `sematext_logs` sink. """, ] diff --git a/docs/reference/components/sinks/socket.cue b/docs/cue/reference/components/sinks/socket.cue similarity index 100% rename from docs/reference/components/sinks/socket.cue rename to docs/cue/reference/components/sinks/socket.cue diff --git a/docs/reference/components/sinks/splunk_hec.cue b/docs/cue/reference/components/sinks/splunk_hec.cue similarity index 93% rename from docs/reference/components/sinks/splunk_hec.cue rename to docs/cue/reference/components/sinks/splunk_hec.cue index e55a2f281f167..78214369f027e 100644 --- a/docs/reference/components/sinks/splunk_hec.cue +++ b/docs/cue/reference/components/sinks/splunk_hec.cue @@ -98,7 +98,10 @@ components: sinks: splunk_hec: { } host_key: { common: true - description: "The name of the log field to be used as the hostname sent to Splunk HEC. This overrides the [global `host_key` option][docs.reference.configuration.global-options#host_key]." + description: """ + The name of the log field to be used as the hostname sent to Splunk HEC. This overrides the + [global `host_key` option](\(urls.vector_configuration)/global-options#log_schema.host_key). + """ required: false warnings: [] type: string: { @@ -120,7 +123,7 @@ components: sinks: splunk_hec: { } indexed_fields: { common: true - description: "Fields to be [added to Splunk index][urls.splunk_hec_indexed_fields]." + description: "Fields to be [added to Splunk index](\(urls.splunk_hec_indexed_fields))." required: false warnings: [] type: array: { diff --git a/docs/reference/components/sinks/statsd.cue b/docs/cue/reference/components/sinks/statsd.cue similarity index 100% rename from docs/reference/components/sinks/statsd.cue rename to docs/cue/reference/components/sinks/statsd.cue diff --git a/docs/reference/components/sinks/vector.cue b/docs/cue/reference/components/sinks/vector.cue similarity index 100% rename from docs/reference/components/sinks/vector.cue rename to docs/cue/reference/components/sinks/vector.cue diff --git a/docs/reference/components/sources.cue b/docs/cue/reference/components/sources.cue similarity index 97% rename from docs/reference/components/sources.cue rename to docs/cue/reference/components/sources.cue index 36343a8dfa653..725033faf133f 100644 --- a/docs/reference/components/sources.cue +++ b/docs/cue/reference/components/sources.cue @@ -185,7 +185,7 @@ components: sources: [Name=string]: { _tls: { title: "Transport Layer Security (TLS)" body: """ - Vector uses [Openssl](\(urls.openssl)) for TLS protocols. You can + Vector uses [OpenSSL](\(urls.openssl)) for TLS protocols. You can adjust TLS behavior via the `tls.*` options. """ } @@ -209,8 +209,8 @@ components: sources: [Name=string]: { context: { title: "Context" body: """ - By default, the `\( Name )` source will augment events with helpful - context keys as shown in the "Output" section. + By default, the `\( Name )` source augments events with helpful + context keys. """ } diff --git a/docs/reference/components/sources/apache_metrics.cue b/docs/cue/reference/components/sources/apache_metrics.cue similarity index 98% rename from docs/reference/components/sources/apache_metrics.cue rename to docs/cue/reference/components/sources/apache_metrics.cue index a5ad31149e4d9..3b866d76c30cb 100644 --- a/docs/reference/components/sources/apache_metrics.cue +++ b/docs/cue/reference/components/sources/apache_metrics.cue @@ -60,7 +60,7 @@ components: sources: apache_metrics: { configuration: { endpoints: { - description: "mod_status endpoints to scrape metrics from." + description: "`mod_status` endpoints to scrape metrics from." required: true type: array: { items: type: string: { diff --git a/docs/reference/components/sources/aws_ecs_metrics.cue b/docs/cue/reference/components/sources/aws_ecs_metrics.cue similarity index 97% rename from docs/reference/components/sources/aws_ecs_metrics.cue rename to docs/cue/reference/components/sources/aws_ecs_metrics.cue index 1838ec99886bf..8fa7fdc1c0d1b 100644 --- a/docs/reference/components/sources/aws_ecs_metrics.cue +++ b/docs/cue/reference/components/sources/aws_ecs_metrics.cue @@ -95,8 +95,8 @@ components: sources: aws_ecs_metrics: { } version: { description: """ - The version of the metadata endpoint. - If empty, the version will be automatically discovered based on envirionment variables. + The version of the metadata endpoint. If empty, the version is automatically discovered based on + environment variables. """ common: false required: false @@ -104,8 +104,8 @@ components: sources: aws_ecs_metrics: { default: "v4" enum: { v4: "When the environment variable `ECS_CONTAINER_METADATA_URI_V4` is defined." - v3: "When fails the v4 check, but the environment variable `ECS_CONTAINER_METADATA_URI` is defined." - v2: "When fails the v4 and v3 checks." + v3: "When the v4 check fails but the environment variable `ECS_CONTAINER_METADATA_URI` is defined." + v2: "When the v4 and v3 checks fail." } syntax: "literal" } diff --git a/docs/reference/components/sources/aws_kinesis_firehose.cue b/docs/cue/reference/components/sources/aws_kinesis_firehose.cue similarity index 92% rename from docs/reference/components/sources/aws_kinesis_firehose.cue rename to docs/cue/reference/components/sources/aws_kinesis_firehose.cue index 08a43d7ae0693..2cb95fea021ac 100644 --- a/docs/reference/components/sources/aws_kinesis_firehose.cue +++ b/docs/cue/reference/components/sources/aws_kinesis_firehose.cue @@ -97,7 +97,7 @@ components: sources: aws_kinesis_firehose: { The compression of records within the Firehose message. Some services, like AWS CloudWatch Logs, will [compress the events with - gzip](\(urls.aws_cloudwatch_logs_firehose), before sending them AWS Kinesis Firehose. This option + gzip](\(urls.aws_cloudwatch_logs_firehose)), before sending them AWS Kinesis Firehose. This option can be used to automatically decompress them before forwarding them to the next component. Note that this is different from [Content encoding option](\(urls.aws_kinesis_firehose_http_protocol)) @@ -192,34 +192,34 @@ components: sources: aws_kinesis_firehose: { how_it_works: { structured_events: { title: "Forwarding CloudWatch Log events" - body: """ + body: """ This source is the recommended way to ingest logs from AWS CloudWatch logs via [AWS CloudWatch Log - subscriptions][aws_cloudwatch_logs_subscriptions]. To + subscriptions](\(urls.aws_cloudwatch_logs_subscriptions)). To set this up: 1. Deploy vector with a publicly exposed HTTP endpoint using this source. You will likely also want to use the - [`aws_cloudwatch_logs_subscription_parser`][vector_transform_aws_cloudwatch_logs_subscription_parser] + [`aws_cloudwatch_logs_subscription_parser`](\(urls.vector_transform_aws_cloudwatch_logs_subscription_parser)) transform to extract the log events. Make sure to set the `access_key` to secure this endpoint. Your configuration might look something like: ```toml - [sources.firehose] - # General - type = "aws_kinesis_firehose" - address = "127.0.0.1:9000" - access_key = "secret" - - [transforms.cloudwatch] - type = "aws_cloudwatch_logs_subscription_parser" - inputs = ["firehose"] - - [sinks.console] - type = "console" - inputs = ["cloudwatch"] - encoding.codec = "json" + [sources.firehose] + # General + type = "aws_kinesis_firehose" + address = "127.0.0.1:9000" + access_key = "secret" + + [transforms.cloudwatch] + type = "aws_cloudwatch_logs_subscription_parser" + inputs = ["firehose"] + + [sinks.console] + type = "console" + inputs = ["cloudwatch"] + encoding.codec = "json" ``` 2. Create a Kinesis Firewatch delivery stream in the region @@ -229,7 +229,7 @@ components: sources: aws_kinesis_firehose: { HTTP Endpoint destination. Make sure to configure the same `access_key` you set earlier. 4. Setup a [CloudWatch Logs - subscription][aws_cloudwatch_logs_subscriptions] to + subscription](\(urls.aws_cloudwatch_logs_subscriptions)) to forward the events to your delivery stream """ } diff --git a/docs/reference/components/sources/aws_s3.cue b/docs/cue/reference/components/sources/aws_s3.cue similarity index 74% rename from docs/reference/components/sources/aws_s3.cue rename to docs/cue/reference/components/sources/aws_s3.cue index c969469b3f3b5..68d810aa5b07f 100644 --- a/docs/reference/components/sources/aws_s3.cue +++ b/docs/cue/reference/components/sources/aws_s3.cue @@ -167,78 +167,78 @@ components: sources: aws_s3: components._aws & { how_it_works: { events: { title: "Handling events from the `aws_s3` source" - body: """ + body: """ This source behaves very similarly to the `file` source in that it will output one event per line (unless the `multiline` configuration option is used). - You will commonly want to use [transforms][urls.vector_transforms] to - parse the data. For example, to parse VPC flow logs sent to S3 you can + You will commonly want to use [transforms](\(urls.vector_transforms)) to + parse the data. For example, to parse VPC flow logs sent to S3 you can chain the `tokenizer` transform: ```toml [transforms.flow_logs] - type = "tokenizer" # required - inputs = ["s3"] - field_names = ["version", "account_id", "interface_id", "srcaddr", "dstaddr", "srcport", "dstport", "protocol", "packets", "bytes", "start", "end", "action", "log_status"] + type = "tokenizer" # required + inputs = ["s3"] + field_names = ["version", "account_id", "interface_id", "srcaddr", "dstaddr", "srcport", "dstport", "protocol", "packets", "bytes", "start", "end", "action", "log_status"] - types.srcport = "int" - types.dstport = "int" - types.packets = "int" - types.bytes = "int" - types.start = "timestamp|%s" - types.end = "timestamp|%s" + types.srcport = "int" + types.dstport = "int" + types.packets = "int" + types.bytes = "int" + types.start = "timestamp|%s" + types.end = "timestamp|%s" ``` To parse AWS load balancer logs, the `regex_parser` transform can be used: ```toml [transforms.elasticloadbalancing_fields_parsed] - type = "regex_parser" - inputs = ["s3"] - regex = '(?x)^ - (?P[\\w]+)[ ] - (?P[\\w:.-]+)[ ] - (?P[^\\s]+)[ ] - (?P[\\d.:-]+)[ ] - (?P[\\d.:-]+)[ ] - (?P[\\d.-]+)[ ] - (?P[\\d.-]+)[ ] - (?P[\\d.-]+)[ ] - (?P[\\d-]+)[ ] - (?P[\\d-]+)[ ] - (?P[\\d-]+)[ ] - (?P[\\d-]+)[ ] - "(?P[\\w-]+)[ ] - (?P[^\\s]+)[ ] - (?P[^"\\s]+)"[ ] - "(?P[^"]+)"[ ] - (?P[^\\s]+)[ ] - (?P[^\\s]+)[ ] - (?P[\\w.:/-]+)[ ] - "(?P[^\\s"]+)"[ ] - "(?P[^\\s"]+)"[ ] - "(?P[\\w:./-]+)"[ ] - (?P[\\d-]+)[ ] - (?P[\\w.:-]+)[ ] - "(?P[\\w,-]+)"[ ] - "(?P[^"]+)"[ ] - "(?P[^"]+)"' - field = "message" - drop_failed = false + type = "regex_parser" + inputs = ["s3"] + regex = '(?x)^ + (?P[\\w]+)[ ] + (?P[\\w:.-]+)[ ] + (?P[^\\s]+)[ ] + (?P[\\d.:-]+)[ ] + (?P[\\d.:-]+)[ ] + (?P[\\d.-]+)[ ] + (?P[\\d.-]+)[ ] + (?P[\\d.-]+)[ ] + (?P[\\d-]+)[ ] + (?P[\\d-]+)[ ] + (?P[\\d-]+)[ ] + (?P[\\d-]+)[ ] + "(?P[\\w-]+)[ ] + (?P[^\\s]+)[ ] + (?P[^"\\s]+)"[ ] + "(?P[^"]+)"[ ] + (?P[^\\s]+)[ ] + (?P[^\\s]+)[ ] + (?P[\\w.:/-]+)[ ] + "(?P[^\\s"]+)"[ ] + "(?P[^\\s"]+)"[ ] + "(?P[\\w:./-]+)"[ ] + (?P[\\d-]+)[ ] + (?P[\\w.:-]+)[ ] + "(?P[\\w,-]+)"[ ] + "(?P[^"]+)"[ ] + "(?P[^"]+)"' + field = "message" + drop_failed = false - types.received_bytes = "int" - types.request_processing_time = "float" - types.sent_bytes = "int" - types.target_processing_time = "float" - types.response_processing_time = "float" + types.received_bytes = "int" + types.request_processing_time = "float" + types.sent_bytes = "int" + types.target_processing_time = "float" + types.response_processing_time = "float" [transforms.elasticloadbalancing_url_parsed] - type = "regex_parser" - inputs = ["elasticloadbalancing_fields_parsed"] - regex = '^(?P[\\w]+)://(?P[^\\s:/?#]+)(?::(?P[\\d-]+))?-?(?:/(?P[^\\s?#]*))?(?P\\?[^\\s#]+)?' - field = "request_url" - drop_failed = false + type = "regex_parser" + inputs = ["elasticloadbalancing_fields_parsed"] + regex = '^(?P[\\w]+)://(?P[^\\s:/?#]+)(?::(?P[\\d-]+))?-?(?:/(?P[^\\s?#]*))?(?P\\?[^\\s#]+)?' + field = "request_url" + drop_failed = false ``` """ } @@ -246,8 +246,10 @@ components: sources: aws_s3: components._aws & { permissions: iam: [ { - platform: "aws" - _service: "s3" + platform: "aws" + _service: "s3" + _docs_tag: "AmazonS3" + _url_fragment: "API" policies: [ { @@ -267,7 +269,7 @@ components: sources: aws_s3: components._aws & { }, { _action: "DeleteMessage" - required_when: "[`strategy`](#strategy) is set to `sqs` and [`delete_message`](#delete_message) is set to `true`" + required_when: "[`strategy`](#strategy) is set to `sqs` and [`delete_message`](#sqs.delete_message) is set to `true`" }, ] }, diff --git a/docs/reference/components/sources/datadog_logs.cue b/docs/cue/reference/components/sources/datadog_logs.cue similarity index 100% rename from docs/reference/components/sources/datadog_logs.cue rename to docs/cue/reference/components/sources/datadog_logs.cue diff --git a/docs/reference/components/sources/dnstap.cue b/docs/cue/reference/components/sources/dnstap.cue similarity index 93% rename from docs/reference/components/sources/dnstap.cue rename to docs/cue/reference/components/sources/dnstap.cue index 8f374885ccaf6..acd31c4108f57 100644 --- a/docs/reference/components/sources/dnstap.cue +++ b/docs/cue/reference/components/sources/dnstap.cue @@ -1201,68 +1201,67 @@ components: sources: dnstap: { how_it_works: { server_uds: { title: "Server Unix Domain Socket (UDS)" - body: #""" - The dnstap source component receives dnstap data through a Unix - Domain Socket (a.k.a. UDS). Path of the UDS must be specified - explicitly in dnstap source configuration. + body: """ + The `dnstap` source receives dnstap data through a Unix Domain Socket (aka UDS). The + path of the UDS must be explicitly specified in the source's configuration. - Upon startup, the dnstap source component will create a new server - UDS at the specified path. If the path of UDS has been occupied already, - it'll be deleted first automatically. + Upon startup, the `dnstap` source creates a new server UDS at the specified path. + If the path of UDS is already in use, Vector automatically deletes it before + creating a new path. - Default permissions of the UDS is determined by current "umask" value. - To customize it to allow local BIND server to send dnstap data to the UDS, - user can specify the desired UDS permissions (a.k.a. file mode) explicitly - in dnstap source configuration. For example, to set its permission as "0774", - add option "socket_file_mode" in dnstap source configuration like below: + The default permissions of the UDS are determined by the current `umask` value. + To customize it to allow the local BIND server to send dnstap data to the UDS, + you can specify the desired UDS permissions (for example the file mode) explicitly + in the `dnstap` source configuration. To set its permissions to `0774`, for example, + add the `socket_file_mode` option: ```toml - [sources.my_dnstap_source] - type = "dnstap" - # ... - socket_file_mode: 0o774 + [sources.my_dnstap_source] + type = "dnstap" + socket_file_mode: 0o774 + # Other configs ``` - """# + """ sub_sections: [ { - title: "Work With Remote BIND server" - body: #""" - The dnstap source component can create server UDS only on local - machine, but it's also possible to work with remote BIND server - too. To do it, you'd have to forward the server UDS from Vector's - hosting machine to the remote BIND server (e.g. through "ssh") - once Vector starts. - Make sure the Unix domain sockets on both local and remote machines - having appropriate permissions set. - """# + title: "Using a remote BIND server" + body: """ + While the `dnstap` source can create server UDS paths only on the local + machine, you can also use it with remote BIND servers by forwarding the + server UDS from the machine Vector is running on to the remote BIND server + (for example via SSH) once Vector starts. Make sure that the Unix domain + sockets on both the local and remote machines have appropriate permissions + set. + """ }, ] } manipulate_uds_buffer_size: { title: "Manipulate UDS Buffer Size" - body: #""" - The dnstap source component supports configuring UDS buffer size for - both receiving and sending, which may be helpful to handle spiked DNS - traffic more smoothly for some high performance use scenarios. + body: """ + The `dnstap` source supports configuring the UDS buffer for both receiving and + sending, which may be helpful for handling DNS traffic spikes more smoothly in + high-usage scenarios in which performance is of paramount concern. - To configure receive/send buffer size for the server UDS, add options - "socket_receive_buffer_size" and "socket_send_buffer_size" in dnstap - configuration accordingly, like below: + To configure the send/receive buffer size for the server UDS, set the + [`socket_receive_buffer_size`](#socket_receive_buffer_size) and + [`socket_send_buffer_size`](#socket_send_buffer_size) parameters in the component's + configuration. Here's an example: ```toml - [sources.my_dnstap_source] - type = "dnstap" - # ... - socket_receive_buffer_size = 10_485_760 - socket_send_buffer_size = 10_485_760 + [sources.my_dnstap_source] + type = "dnstap" + socket_receive_buffer_size = 10_485_760 + socket_send_buffer_size = 10_485_760 + # Other configs ``` - And certainly, for the buffer size settings to actually take effects, - you'd have to ensure that the system-wide settings of max socket - receive/send buffer sizes (i.e. values of '/proc/sys/net/core/rmem_max' - and '/proc/sys/net/core/wmem_max' on Linux) are large enough. - """# + For the buffer size settings to take effect, you need to ensure that the system-wide + settings for send/receive buffer sizes (i.e. the values of + `/proc/sys/net/core/rmem_max` and `/proc/sys/net/core/wmem_max` on Linux) are + large enough. + """ } } diff --git a/docs/reference/components/sources/docker_logs.cue b/docs/cue/reference/components/sources/docker_logs.cue similarity index 93% rename from docs/reference/components/sources/docker_logs.cue rename to docs/cue/reference/components/sources/docker_logs.cue index 68686ed76b5f6..fced4e79215cf 100644 --- a/docs/reference/components/sources/docker_logs.cue +++ b/docs/cue/reference/components/sources/docker_logs.cue @@ -85,13 +85,13 @@ components: sources: docker_logs: { requirements: [] warnings: [ """ - Collecting logs directly from the Docker Engine is known to have - performance problems for very large setups. If you have a large - setup, please consider alternative collection methods, such as the - Docker [`syslog`](\(urls.docker_logging_driver_syslog)) or - [Docker `journald` driver](\(urls.docker_logging_driver_journald)) - drivers. - """, + Collecting logs directly from the Docker Engine is known to have + performance problems for very large setups. If you have a large + setup, please consider alternative collection methods, such as the + Docker [`syslog`](\(urls.docker_logging_driver_syslog)) or + [Docker `journald` driver](\(urls.docker_logging_driver_journald)) + drivers. + """, """ To avoid collecting logs from itself when deployed as a container, the Docker source uses current hostname to find out which container @@ -134,7 +134,7 @@ components: sources: docker_logs: { tls: { common: false description: """ - TLS options to connect to the Docker deamon. This has no effect unless `docker_host` is an HTTPS URL. + TLS options to connect to the Docker daemon. This has no effect unless `docker_host` is an HTTPS URL. If absent, Vector will try to use environment variable `DOCKER_CERT_PATH` and then `DOCKER_CONFIG`. If both environment variables are absent, Vector will try to read certificates in `~/.docker/`. """ @@ -264,7 +264,10 @@ components: sources: docker_logs: { host_key: { category: "Context" common: false - description: "The key name added to each event representing the current host. This can also be globally set via the [global `host_key` option][docs.reference.configuration.global-options#host_key]." + description: """ + The key name added to each event representing the current host. This can also be globally set via the + [global `host_key` option](\(urls.vector_configuration)global-options#log_schema.host_key). + """ required: false warnings: [] type: string: { @@ -378,7 +381,7 @@ components: sources: docker_logs: { message_merging: { title: "Merging Split Messages" body: """ - Docker, by default, will split log messages that exceed 16kb. This can be a + Docker, by default, splits log messages that exceed 16kb. This can be a rather frustrating problem because it produces malformed log messages that are difficult to work with. Vector's solves this by default, automatically merging these messages into a single message. You can turn this off via the diff --git a/docs/reference/components/sources/eventstoredb_metrics.cue b/docs/cue/reference/components/sources/eventstoredb_metrics.cue similarity index 100% rename from docs/reference/components/sources/eventstoredb_metrics.cue rename to docs/cue/reference/components/sources/eventstoredb_metrics.cue diff --git a/docs/reference/components/sources/exec.cue b/docs/cue/reference/components/sources/exec.cue similarity index 98% rename from docs/reference/components/sources/exec.cue rename to docs/cue/reference/components/sources/exec.cue index 525fe6046ebc0..ea721693a7316 100644 --- a/docs/reference/components/sources/exec.cue +++ b/docs/cue/reference/components/sources/exec.cue @@ -211,7 +211,7 @@ components: sources: exec: { title: "Line Delimiters" body: """ Each line is read until a new line delimiter, the `0xA` byte, is found or the end of the - maximum_buffer_size is reached. + [`maximum_buffer_size_bytes`](#maximum_buffer_size_bytes) is reached. """ } } diff --git a/docs/reference/components/sources/file.cue b/docs/cue/reference/components/sources/file.cue similarity index 94% rename from docs/reference/components/sources/file.cue rename to docs/cue/reference/components/sources/file.cue index 856079745ae90..e081ebb2825b0 100644 --- a/docs/reference/components/sources/file.cue +++ b/docs/cue/reference/components/sources/file.cue @@ -137,7 +137,10 @@ components: sources: file: { host_key: { category: "Context" common: false - description: "The key name added to each event representing the current host. This can also be globally set via the [global `host_key` option][docs.reference.configuration.global-options#host_key]." + description: """ + The key name added to each event representing the current host. This can also be globally set via the + [global `host_key` option](\(urls.vector_configuration)/global-options#log_schema.host_key). + """ required: false type: string: { default: "host" @@ -392,17 +395,17 @@ components: sources: file: { } fingerprint: { - title: "Fingerprint" - body: """ - By default, Vector identifies files by creating a - [cyclic redundancy check](urls.crc) (CRC) on the first line of - the file. This serves as a fingerprint to uniquely identify the file. - The amount of lines read can be controlled via the `fingerprint.lines` - and `fingerprint.ignored_header_bytes` options. - - This strategy avoids the common pitfalls of using device and inode - names since inode names can be reused across files. This enables - Vector to properly tail files across various rotation strategies. + title: "Fingerprinting" + body: """ + By default, Vector identifies files by running a [cyclic redundancy + check](\(urls.crc)) (CRC) on the first N lines of the file. This serves as a + *fingerprint* that uniquely identifies the file. The number of lines, N, that are + read can be set using the [`fingerprint.lines`](#fingerprint.lines) and + [`fingerprint.ignored_header_bytes`](#fingerprint.ignored_header_bytes) options. + + This strategy avoids the common pitfalls associated with using device and inode + names since inode names can be reused across files. This enables Vector to properly + tail files across various rotation strategies. """ } @@ -523,14 +526,14 @@ components: sources: file: { ```toml [sources.my_file_source] - type = "file" - # ... - - [sources.my_file_source.multiline] - start_pattern = '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' - mode = "halt_before" - condition_pattern = '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' - timeout_ms = 1000 + type = "file" + # ... + + [sources.my_file_source.multiline] + start_pattern = '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' + mode = "halt_before" + condition_pattern = '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' + timeout_ms = 1000 ``` * `start_pattern`, set to `^\[[0-9]{4}-[0-9]{2}-[0-9]{2}`, tells @@ -547,21 +550,6 @@ components: sources: file: { ] } - read_position: { - title: "Read Position" - body: """ - By default, Vector will read from the beginning of newly discovered - files. You can change this behavior by setting the `read_from` option to - `"end"`. - - Previously discovered files will be [checkpointed](#checkpointing), and - the read position will resume from the last checkpoint. To disable this - behavior, you can set the `ignore_checkpoints` option to `true`. This - will cause Vector to disregard existing checkpoints when determining the - starting read position of a file. - """ - } - permissions: { title: "File permissions" body: """ @@ -579,7 +567,7 @@ components: sources: file: { * Use [POSIX ACLs](\(urls.posix_acls)) to grant access to the files to the `vector` user * Grant the `CAP_DAC_READ_SEARCH` [Linux - capability](\(urls.linux_capability)]. This capability + capability](\(urls.linux_capability)). This capability bypasses the file system permissions checks to allow Vector to read any file. This is not recommended as it gives Vector more permissions than it requires, but it is @@ -600,6 +588,20 @@ components: sources: file: { """ } + read_position: { + title: "Read Position" + body: """ + By default, Vector will read from the beginning of newly discovered + files. You can change this behavior by setting the `read_from` option to + `"end"`. + + Previously discovered files will be [checkpointed](#checkpointing), and + the read position will resume from the last checkpoint. To disable this + behavior, you can set the `ignore_checkpoints` option to `true`. This + will cause Vector to disregard existing checkpoints when determining the + starting read position of a file. + """ + } } telemetry: metrics: { diff --git a/docs/reference/components/sources/fluent.cue b/docs/cue/reference/components/sources/fluent.cue similarity index 100% rename from docs/reference/components/sources/fluent.cue rename to docs/cue/reference/components/sources/fluent.cue diff --git a/docs/reference/components/sources/generator.cue b/docs/cue/reference/components/sources/generator.cue similarity index 100% rename from docs/reference/components/sources/generator.cue rename to docs/cue/reference/components/sources/generator.cue diff --git a/docs/reference/components/sources/heroku_logs.cue b/docs/cue/reference/components/sources/heroku_logs.cue similarity index 100% rename from docs/reference/components/sources/heroku_logs.cue rename to docs/cue/reference/components/sources/heroku_logs.cue diff --git a/docs/reference/components/sources/host_metrics.cue b/docs/cue/reference/components/sources/host_metrics.cue similarity index 100% rename from docs/reference/components/sources/host_metrics.cue rename to docs/cue/reference/components/sources/host_metrics.cue diff --git a/docs/reference/components/sources/http.cue b/docs/cue/reference/components/sources/http.cue similarity index 98% rename from docs/reference/components/sources/http.cue rename to docs/cue/reference/components/sources/http.cue index 325cb42513221..520d35f4d1910 100644 --- a/docs/reference/components/sources/http.cue +++ b/docs/cue/reference/components/sources/http.cue @@ -166,7 +166,7 @@ components: sources: http: { } } structured: { - description: "An individual line from a `application/json` request" + description: "An individual line from an `application/json` request" fields: { "*": { common: false diff --git a/docs/reference/components/sources/internal_logs.cue b/docs/cue/reference/components/sources/internal_logs.cue similarity index 91% rename from docs/reference/components/sources/internal_logs.cue rename to docs/cue/reference/components/sources/internal_logs.cue index 08f7a4e5a5f0c..ffd5b5c7f06e3 100644 --- a/docs/reference/components/sources/internal_logs.cue +++ b/docs/cue/reference/components/sources/internal_logs.cue @@ -125,11 +125,9 @@ components: sources: internal_logs: { limited_logs: { title: "Logs are limited by startup options" body: """ - At startup, the selection of log messages generated by - vector is set by a combination of the `$LOG` environment - variable and the `--quiet` and `--verbose` command-line - options. This internal logs source will only receive - logs that are generated by these options. + At startup, the selection of log messages generated by Vector is determined by a + combination of the `LOG` environment variable and the `--quiet` and `--verbose` + command-line options. The `internal_logs` source only receives logs that are generated by these options. """ } } diff --git a/docs/reference/components/sources/internal_metrics.cue b/docs/cue/reference/components/sources/internal_metrics.cue similarity index 98% rename from docs/reference/components/sources/internal_metrics.cue rename to docs/cue/reference/components/sources/internal_metrics.cue index 16683247c76bc..cffe8684c9f5e 100644 --- a/docs/reference/components/sources/internal_metrics.cue +++ b/docs/cue/reference/components/sources/internal_metrics.cue @@ -372,7 +372,7 @@ components: sources: internal_metrics: { required: false } uri: { - description: "The sanitized uri from which the event originates." + description: "The sanitized URI from which the event originates." required: false } container_name: { @@ -401,10 +401,11 @@ components: sources: internal_metrics: { tags: _component_tags } processed_events_total: { - description: """ + description: """ The total number of events processed by this component. This metric is deprecated in place of using - `events_in_total` and `events_out_total` metrics. + [`events_in_total`](\(urls.vector_sources)/internal_metrics/#events_in_total) and + [`events_out_total`](\(urls.vector_sources)/internal_metrics/#events_out_total) metrics. """ type: "counter" default_namespace: "vector" @@ -635,7 +636,7 @@ components: sources: internal_metrics: { required: false } uri: { - description: "The sanitized uri from which the bytes originate." + description: "The sanitized URI from which the bytes originate." required: false } container_name: { diff --git a/docs/reference/components/sources/journald.cue b/docs/cue/reference/components/sources/journald.cue similarity index 97% rename from docs/reference/components/sources/journald.cue rename to docs/cue/reference/components/sources/journald.cue index 99681af324818..83561f7b717a8 100644 --- a/docs/reference/components/sources/journald.cue +++ b/docs/cue/reference/components/sources/journald.cue @@ -176,14 +176,14 @@ components: sources: journald: { how_it_works: { communication_strategy: { title: "Communication Strategy" - body: """ + body: """ To ensure the `journald` source works across all platforms, Vector interacts with the Systemd journal via the `journalctl` command. This is accomplished by - spawning a [subprocess][urls.rust_subprocess] that Vector interacts + spawning a [subprocess](\(urls.rust_subprocess)) that Vector interacts with. If the `journalctl` command is not in the environment path you can specify the exact location via the `journalctl_path` option. For more information on this communication strategy please see - [issue #1473][urls.issue_1473]. + [issue #1473](\(urls.vector_issues)/1437). """ } non_ascii: { diff --git a/docs/reference/components/sources/kafka.cue b/docs/cue/reference/components/sources/kafka.cue similarity index 94% rename from docs/reference/components/sources/kafka.cue rename to docs/cue/reference/components/sources/kafka.cue index a11b551e7ff4b..2d90f6874b22e 100644 --- a/docs/reference/components/sources/kafka.cue +++ b/docs/cue/reference/components/sources/kafka.cue @@ -37,7 +37,11 @@ components: sources: kafka: { acknowledgements: configuration._acknowledgements auto_offset_reset: { common: false - description: "If offsets for consumer group do not exist, set them using this strategy. [librdkafka documentation][urls.librdkafka_config] for `auto.offset.reset` option for explanation." + description: """ + If offsets for consumer group do not exist, set them using this strategy. See the + [librdkafka documentation](\(urls.librdkafka_config)) for the `auto.offset.reset` option for further + clarification. + """ required: false warnings: [] type: string: { @@ -49,7 +53,7 @@ components: sources: kafka: { bootstrap_servers: components._kafka.configuration.bootstrap_servers commit_interval_ms: { common: false - description: "The frequency that the consumer offsets are committed (written) to offset storage.\n" + description: "The frequency that the consumer offsets are committed (written) to offset storage." required: false warnings: [] type: uint: { @@ -60,7 +64,7 @@ components: sources: kafka: { } fetch_wait_max_ms: { common: false - description: "Maximum time the broker may wait to fill the response.\n" + description: "Maximum time the broker may wait to fill the response." required: false warnings: [] type: uint: { @@ -70,7 +74,7 @@ components: sources: kafka: { } } group_id: { - description: "The consumer group name to be used to consume events from Kafka.\n" + description: "The consumer group name to be used to consume events from Kafka." required: true warnings: [] type: string: { @@ -144,7 +148,7 @@ components: sources: kafka: { options: { enabled: { common: true - description: "Enable SASL/SCRAM authentication to the remote. (Not supported on Windows at this time.)" + description: "Enable SASL/SCRAM authentication to the remote (not supported on Windows at this time)." required: false warnings: [] type: bool: default: null @@ -187,7 +191,7 @@ components: sources: kafka: { } session_timeout_ms: { common: false - description: "The Kafka session timeout in milliseconds.\n" + description: "The Kafka session timeout in milliseconds." required: false warnings: [] type: uint: { @@ -198,7 +202,7 @@ components: sources: kafka: { } socket_timeout_ms: components._kafka.configuration.socket_timeout_ms topics: { - description: "The Kafka topics names to read events from. Regex is supported if the topic begins with `^`.\n" + description: "The Kafka topics names to read events from. Regex is supported if the topic begins with `^`." required: true warnings: [] type: array: items: type: string: { diff --git a/docs/reference/components/sources/kubernetes_logs.cue b/docs/cue/reference/components/sources/kubernetes_logs.cue similarity index 99% rename from docs/reference/components/sources/kubernetes_logs.cue rename to docs/cue/reference/components/sources/kubernetes_logs.cue index d6fd034ea8ba5..67834a131f08b 100644 --- a/docs/reference/components/sources/kubernetes_logs.cue +++ b/docs/cue/reference/components/sources/kubernetes_logs.cue @@ -420,7 +420,7 @@ components: sources: kubernetes_logs: { ] // Note that these sections are also copied over the - // `installation.platforms.kubernetes.how_it_works` key. Therefore, full + // `administration.platforms.kubernetes.how_it_works` key. Therefore, full // URLs should be used in links and language should be used that works in // both contexts. how_it_works: { @@ -483,7 +483,7 @@ components: sources: kubernetes_logs: { `Pod`, and enumerate the `name`s of all the `container`s to exclude in the value of the annotation like so: - ``` + ```yaml vector.dev/exclude-containers: "container1,container2" ``` diff --git a/docs/reference/components/sources/logstash.cue b/docs/cue/reference/components/sources/logstash.cue similarity index 100% rename from docs/reference/components/sources/logstash.cue rename to docs/cue/reference/components/sources/logstash.cue diff --git a/docs/reference/components/sources/mongodb_metrics.cue b/docs/cue/reference/components/sources/mongodb_metrics.cue similarity index 99% rename from docs/reference/components/sources/mongodb_metrics.cue rename to docs/cue/reference/components/sources/mongodb_metrics.cue index 7dd7826e7627a..69d3dd21e4e61 100644 --- a/docs/reference/components/sources/mongodb_metrics.cue +++ b/docs/cue/reference/components/sources/mongodb_metrics.cue @@ -48,7 +48,7 @@ components: sources: mongodb_metrics: { requirements: [ """ User from endpoint should have enough privileges for running - [serverStatus][urls.mongodb_command_server_status] command. + [serverStatus](\(urls.mongodb_command_server_status)) command. """, ] @@ -62,7 +62,7 @@ components: sources: mongodb_metrics: { configuration: { endpoints: { - description: "MongoDB [Connection String URI Format][urls.mongodb_connection_string_uri_format]" + description: "MongoDB [Connection String URI Format](\(urls.mongodb_connection_string_uri_format))" required: true type: array: { items: type: string: { @@ -94,8 +94,8 @@ components: sources: mongodb_metrics: { how_it_works: { mod_status: { title: "MongoDB `serverStatus` command" - body: """ - The [serverStatus][urls.mongodb_command_server_status] command + body: """ + The [serverStatus](\(urls.mongodb_command_server_status)) command returns a document that provides an overview of the database’s state. The output fields vary depending on the version of MongoDB, underlying operating system platform, the storage diff --git a/docs/reference/components/sources/nginx_metrics.cue b/docs/cue/reference/components/sources/nginx_metrics.cue similarity index 98% rename from docs/reference/components/sources/nginx_metrics.cue rename to docs/cue/reference/components/sources/nginx_metrics.cue index af59bac406818..e7fce80252a47 100644 --- a/docs/reference/components/sources/nginx_metrics.cue +++ b/docs/cue/reference/components/sources/nginx_metrics.cue @@ -101,8 +101,8 @@ components: sources: nginx_metrics: { how_it_works: { mod_status: { title: "Module `ngx_http_stub_status_module`" - body: """ - The [ngx_http_stub_status_module][urls.nginx_stub_status_module] + body: """ + The [ngx_http_stub_status_module]9\(urls.nginx_stub_status_module)) module provides access to basic status information. Basic status information is a simple web page with text data. """ diff --git a/docs/reference/components/sources/postgresql_metrics.cue b/docs/cue/reference/components/sources/postgresql_metrics.cue similarity index 95% rename from docs/reference/components/sources/postgresql_metrics.cue rename to docs/cue/reference/components/sources/postgresql_metrics.cue index e4a22922d93a5..71283bf211fdd 100644 --- a/docs/reference/components/sources/postgresql_metrics.cue +++ b/docs/cue/reference/components/sources/postgresql_metrics.cue @@ -2,7 +2,11 @@ package metadata components: sources: postgresql_metrics: { title: "PostgreSQL Metrics" - description: "[PostgreSQL][urls.postgresql] PostgreSQL is a powerful, open source object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance." + description: """ + [PostgreSQL](\(urls.postgresql)) is a powerful, open source object-relational database system with over 30 years + of active development that has earned it a strong reputation for reliability, feature robustness, and + performance. + """ classes: { commonly_used: false @@ -88,14 +92,13 @@ components: sources: postgresql_metrics: { } include_databases: { description: """ - A list of databases to match (by using [POSIX Regular Expressions][urls.postgresql_matching]) against - the `datname` column for which you want to collect metrics from. - If not set, metrics will be collected from all databases. - Specifying `""` will include metrics where `datname` is `NULL`. - This can be used in conjunction with [`exclude_databases`](#exclude_databases). + A list of databases to match (by using [POSIX Regular Expressions](\(urls.postgresql_matching))) against + the `datname` column for which you want to collect metrics from. If not set, metrics are collected from + all databases. Specifying `""` will include metrics where `datname` is `NULL`. This can be used in + conjunction with [`exclude_databases`](#exclude_databases). """ - common: false - required: false + common: false + required: false type: array: { default: null items: type: string: { @@ -106,13 +109,13 @@ components: sources: postgresql_metrics: { } exclude_databases: { description: """ - A list of databases to match (by using [POSIX Regular Expressions][urls.postgresql_matching]) against + A list of databases to match (by using [POSIX Regular Expressions](\(urls.postgresql_matching))) against the `datname` column for which you don't want to collect metrics from. Specifying `""` will include metrics where `datname` is `NULL`. This can be used in conjunction with [`include_databases`](#include_databases). """ - common: false - required: false + common: false + required: false type: array: { default: null items: type: string: { diff --git a/docs/reference/components/sources/prometheus_remote_write.cue b/docs/cue/reference/components/sources/prometheus_remote_write.cue similarity index 100% rename from docs/reference/components/sources/prometheus_remote_write.cue rename to docs/cue/reference/components/sources/prometheus_remote_write.cue diff --git a/docs/reference/components/sources/prometheus_scrape.cue b/docs/cue/reference/components/sources/prometheus_scrape.cue similarity index 100% rename from docs/reference/components/sources/prometheus_scrape.cue rename to docs/cue/reference/components/sources/prometheus_scrape.cue diff --git a/docs/reference/components/sources/socket.cue b/docs/cue/reference/components/sources/socket.cue similarity index 93% rename from docs/reference/components/sources/socket.cue rename to docs/cue/reference/components/sources/socket.cue index 0fecfa15cdf99..a762a3edc3454 100644 --- a/docs/reference/components/sources/socket.cue +++ b/docs/cue/reference/components/sources/socket.cue @@ -74,7 +74,10 @@ components: sources: socket: { host_key: { category: "Context" common: false - description: "The key name added to each event representing the current host. This can also be globally set via the [global `host_key` option][docs.reference.configuration.global-options#host_key]." + description: """ + The key name added to each event representing the current host. This can also be globally set via the + [global `host_key` option](\(urls.vector_configuration)/global-options#log_schema.host_key). + """ required: false warnings: [] type: string: { @@ -144,12 +147,11 @@ components: sources: socket: { 2019-02-13T19:48:34+00:00 [info] Started GET "/" for 127.0.0.1 """ title: "Socket line" - configuration: {} - input: """ - ```text - \( _line ) - ``` - """ + configuration: #""" + [sources.socket] + type = "socket" + """# + input: "\( _line )" output: log: { timestamp: _values.current_timestamp message: _line diff --git a/docs/reference/components/sources/splunk_hec.cue b/docs/cue/reference/components/sources/splunk_hec.cue similarity index 100% rename from docs/reference/components/sources/splunk_hec.cue rename to docs/cue/reference/components/sources/splunk_hec.cue diff --git a/docs/reference/components/sources/statsd.cue b/docs/cue/reference/components/sources/statsd.cue similarity index 87% rename from docs/reference/components/sources/statsd.cue rename to docs/cue/reference/components/sources/statsd.cue index 576e5a49d43e3..fba30cbc3e72e 100644 --- a/docs/reference/components/sources/statsd.cue +++ b/docs/cue/reference/components/sources/statsd.cue @@ -117,14 +117,13 @@ components: sources: statsd: { how_it_works: { timestamps: { title: "Timestamps" - body: """ - StatsD protocol does not provide support for sending metric - timestamps. You'll notice that each parsed metric is assigned a - `null` timestamp, which is a special value which means "a real - time metric", i.e. not a historical one. Normally such `null` - timestamps will be substituted by current time by downstream - sinks or 3rd party services during sending/ingestion. See the - [metric][docs.data-model.metric] data model page for more info. + body: """ + The StatsD protocol doesn't provide support for sending metric timestamps. You may + notice that each parsed metric is assigned a `null` timestmap, which is a special + value indicating a realtime metric (i.e. not a historical metric). Normally, such + `null` timestamps are substituted with the current time by downstream sinks or + third-party services during sending/ingestion. See the + [metric data model](\(urls.vector_metric)) page for more info. """ } } diff --git a/docs/reference/components/sources/stdin.cue b/docs/cue/reference/components/sources/stdin.cue similarity index 91% rename from docs/reference/components/sources/stdin.cue rename to docs/cue/reference/components/sources/stdin.cue index 0d075951b305b..8d5519476fc5b 100644 --- a/docs/reference/components/sources/stdin.cue +++ b/docs/cue/reference/components/sources/stdin.cue @@ -48,7 +48,10 @@ components: sources: stdin: { host_key: { category: "Context" common: false - description: "The key name added to each event representing the current host. This can also be globally set via the [global `host_key` option][docs.reference.configuration.global-options#host_key]." + description: """ + The key name added to each event representing the current host. This can also be globally set via the + [global `host_key` option](\(urls.vector_configuration)/global-options#log_schema.host_key). + """ required: false warnings: [] type: string: { diff --git a/docs/reference/components/sources/syslog.cue b/docs/cue/reference/components/sources/syslog.cue similarity index 89% rename from docs/reference/components/sources/syslog.cue rename to docs/cue/reference/components/sources/syslog.cue index 6fa0bf3235091..1894fb70ef1d5 100644 --- a/docs/reference/components/sources/syslog.cue +++ b/docs/cue/reference/components/sources/syslog.cue @@ -189,18 +189,18 @@ components: sources: syslog: { parsing: { title: "Parsing" body: """ - Vector makes a _best effort_ to parse the various Syslog formats out in the - wild. This includes [RFC 6587][urls.syslog_6587], [RFC 5424][urls.syslog_5424], - [RFC 3164][urls.syslog_3164], and other common variations (such as the Nginx - Syslog style). It's unfortunate that the Syslog specification is not more - accurately followed, but we hope Vector insulates you from these deviations. + Vector makes a _best effort_ to parse the various Syslog formats out in the wild. + This includes [RFC 6587](\(urls.syslog_6587)), [RFC 5424](\(urls.syslog_5424)), + [RFC 3164](\(urls.syslog_3164)), and other common variations (such as the Nginx + Syslog style). It's unfortunate that the Syslog specification isn't more + accurately followed, but we hope that Vector insulates you from these deviations. - If parsing fails, Vector will include the entire Syslog line in the `message` + If parsing fails, Vector includes the entire Syslog line in the `message` key. If you find this happening often, we recommend using the - [`socket` source][docs.sources.socket] combined with the - [`regex_parser` transform][docs.transforms.regex_parser] to implement your own - ingestion and parsing scheme. Or, [open an issue](\(urls.new_feature_request)) - requesting support for your specific format. + [`socket` source](\(urls.vector_socket_source)) combined with + [regex parsing](\(urls.vrl_functions)/#parse_regex) to implement your own custom + ingestion and parsing scheme. Alternatively, you can [open an + issue](\(urls.new_feature_request)) to request support for your specific format. """ } } diff --git a/docs/reference/components/sources/vector.cue b/docs/cue/reference/components/sources/vector.cue similarity index 75% rename from docs/reference/components/sources/vector.cue rename to docs/cue/reference/components/sources/vector.cue index 2adca07d486d6..5a2fc06662d90 100644 --- a/docs/reference/components/sources/vector.cue +++ b/docs/cue/reference/components/sources/vector.cue @@ -65,8 +65,11 @@ components: sources: vector: { configuration: { acknowledgements: configuration._acknowledgements address: { - description: "The TCP address to listen for connections on, or `systemd#N to use the Nth socket passed by systemd socket activation. If an address is used it _must_ include a port." - required: true + description: """ + The TCP address to listen for connections on, or `systemd#N` to use the Nth socket passed by systemd + socket activation. If an address is used it _must_ include a port. + """ + required: true warnings: [] type: string: { examples: ["0.0.0.0:\(_port)", "systemd", "systemd#1"] @@ -105,32 +108,6 @@ components: sources: vector: { } } - how_it_works: { - encoding: { - title: "Encoding" - body: """ - Data is encoded via Vector's [event protobuf](\(urls.event_proto)) - before it is sent over the wire. - """ - } - communication_protocol: { - title: "Communication Protocol" - body: """ - Upstream Vector instances forward data to downstream Vector - instances via the TCP protocol. - """ - } - message_acknowledgement: { - title: "Message Acknowledgement" - body: """ - Currently, Vector does not perform any application level message - acknowledgement. While rare, this means the individual message - could be lost. - """ - } - - } - telemetry: metrics: { events_in_total: components.sources.internal_metrics.output.metrics.events_in_total protobuf_decode_errors_total: components.sources.internal_metrics.output.metrics.protobuf_decode_errors_total diff --git a/docs/reference/components/splunk.cue b/docs/cue/reference/components/splunk.cue similarity index 100% rename from docs/reference/components/splunk.cue rename to docs/cue/reference/components/splunk.cue diff --git a/docs/reference/components/transforms.cue b/docs/cue/reference/components/transforms.cue similarity index 100% rename from docs/reference/components/transforms.cue rename to docs/cue/reference/components/transforms.cue diff --git a/docs/reference/components/transforms/add_fields.cue b/docs/cue/reference/components/transforms/add_fields.cue similarity index 100% rename from docs/reference/components/transforms/add_fields.cue rename to docs/cue/reference/components/transforms/add_fields.cue diff --git a/docs/reference/components/transforms/add_tags.cue b/docs/cue/reference/components/transforms/add_tags.cue similarity index 100% rename from docs/reference/components/transforms/add_tags.cue rename to docs/cue/reference/components/transforms/add_tags.cue diff --git a/docs/reference/components/transforms/aggregate.cue b/docs/cue/reference/components/transforms/aggregate.cue similarity index 75% rename from docs/reference/components/transforms/aggregate.cue rename to docs/cue/reference/components/transforms/aggregate.cue index b9651419a2551..5a0139ec655fc 100644 --- a/docs/reference/components/transforms/aggregate.cue +++ b/docs/cue/reference/components/transforms/aggregate.cue @@ -185,25 +185,25 @@ components: transforms: aggregate: { aggregation_behavior: { title: "Aggregation Behavior" body: """ - Metrics are aggregated based on their kind. During an interval, `incremental` metrics - are "added" and newer `absolute` metrics replace older ones in the same series. This results in a reduction - of volume and less granularity, while maintaining numerical correctness. As an example, two - `incremental` `counter` metrics with values 10 and 13 processed by the transform during a period would be - aggregated into a single `incremental` `counter` with a value of 23. Two `absolute` `gauge` metrics with - values 93 and 95 would result in a single `absolute` `gauge` with the value of 95. More complex - types like `distribution`, `histogram`, `set`, and `summary` behave similarly with `incremental` - values being combined in a manner that makes sense based on their type. + Metrics are aggregated based on their kind. During an interval, `incremental` metrics + are "added" and newer `absolute` metrics replace older ones in the same series. This results in a reduction + of volume and less granularity, while maintaining numerical correctness. As an example, two + `incremental` `counter` metrics with values 10 and 13 processed by the transform during a period would be + aggregated into a single `incremental` `counter` with a value of 23. Two `absolute` `gauge` metrics with + values 93 and 95 would result in a single `absolute` `gauge` with the value of 95. More complex + types like `distribution`, `histogram`, `set`, and `summary` behave similarly with `incremental` + values being combined in a manner that makes sense based on their type. """ } advantages: { title: "Advantages of Use" body: """ - The major advantage to aggregation is the reduction of volume. It may reduce costs - directly in situations that charge by metric event volume, or indirectly by requiring less CPU to - process and/or less network bandwidth to transmit and receive. In systems that are constrained by - the processing required to ingest metric events it may help to reduce the processing overhead. This - may apply to transforms and sinks downstream of the aggregate transform as well. + The major advantage to aggregation is the reduction of volume. It may reduce costs + directly in situations that charge by metric event volume, or indirectly by requiring less CPU to + process and/or less network bandwidth to transmit and receive. In systems that are constrained by + the processing required to ingest metric events it may help to reduce the processing overhead. This + may apply to transforms and sinks downstream of the aggregate transform as well. """ } diff --git a/docs/reference/components/transforms/ansi_stripper.cue b/docs/cue/reference/components/transforms/ansi_stripper.cue similarity index 100% rename from docs/reference/components/transforms/ansi_stripper.cue rename to docs/cue/reference/components/transforms/ansi_stripper.cue diff --git a/docs/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue b/docs/cue/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue similarity index 99% rename from docs/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue rename to docs/cue/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue index 18416e801eeac..a1da992d6162d 100644 --- a/docs/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue +++ b/docs/cue/reference/components/transforms/aws_cloudwatch_logs_subscription_parser.cue @@ -41,7 +41,7 @@ components: transforms: aws_cloudwatch_logs_subscription_parser: { """ \(aws_cloudwatch_logs_subscription_parser._remap_deprecation_notice) - ```vrl + ```ruby .message = parse_aws_cloudwatch_log_subscription_message(.message) ``` """, diff --git a/docs/reference/components/transforms/aws_ec2_metadata.cue b/docs/cue/reference/components/transforms/aws_ec2_metadata.cue similarity index 100% rename from docs/reference/components/transforms/aws_ec2_metadata.cue rename to docs/cue/reference/components/transforms/aws_ec2_metadata.cue diff --git a/docs/reference/components/transforms/coercer.cue b/docs/cue/reference/components/transforms/coercer.cue similarity index 100% rename from docs/reference/components/transforms/coercer.cue rename to docs/cue/reference/components/transforms/coercer.cue diff --git a/docs/reference/components/transforms/concat.cue b/docs/cue/reference/components/transforms/concat.cue similarity index 100% rename from docs/reference/components/transforms/concat.cue rename to docs/cue/reference/components/transforms/concat.cue diff --git a/docs/reference/components/transforms/dedupe.cue b/docs/cue/reference/components/transforms/dedupe.cue similarity index 97% rename from docs/reference/components/transforms/dedupe.cue rename to docs/cue/reference/components/transforms/dedupe.cue index 802ac9548a790..3a5a43621afd4 100644 --- a/docs/reference/components/transforms/dedupe.cue +++ b/docs/cue/reference/components/transforms/dedupe.cue @@ -76,7 +76,7 @@ components: transforms: dedupe: { } match: { common: true - description: "The field names considered when deciding if an Event is a duplicate. This can also be globally set via the [global `log_schema` options][docs.reference.configuration.global-options#log_schema]. Incompatible with the `fields.ignore` option." + description: "The field names considered when deciding if an Event is a duplicate. This can also be globally set via the [global `log_schema` options](\(urls.vector_configuration_global)/#log_schema). Incompatible with the `fields.ignore` option." required: false warnings: [] type: array: { diff --git a/docs/reference/components/transforms/filter.cue b/docs/cue/reference/components/transforms/filter.cue similarity index 100% rename from docs/reference/components/transforms/filter.cue rename to docs/cue/reference/components/transforms/filter.cue diff --git a/docs/reference/components/transforms/geoip.cue b/docs/cue/reference/components/transforms/geoip.cue similarity index 100% rename from docs/reference/components/transforms/geoip.cue rename to docs/cue/reference/components/transforms/geoip.cue diff --git a/docs/reference/components/transforms/grok_parser.cue b/docs/cue/reference/components/transforms/grok_parser.cue similarity index 100% rename from docs/reference/components/transforms/grok_parser.cue rename to docs/cue/reference/components/transforms/grok_parser.cue diff --git a/docs/reference/components/transforms/json_parser.cue b/docs/cue/reference/components/transforms/json_parser.cue similarity index 100% rename from docs/reference/components/transforms/json_parser.cue rename to docs/cue/reference/components/transforms/json_parser.cue diff --git a/docs/reference/components/transforms/key_value_parser.cue b/docs/cue/reference/components/transforms/key_value_parser.cue similarity index 100% rename from docs/reference/components/transforms/key_value_parser.cue rename to docs/cue/reference/components/transforms/key_value_parser.cue diff --git a/docs/reference/components/transforms/log_to_metric.cue b/docs/cue/reference/components/transforms/log_to_metric.cue similarity index 77% rename from docs/reference/components/transforms/log_to_metric.cue rename to docs/cue/reference/components/transforms/log_to_metric.cue index 2ea3ca295142f..6e07a55d87bf2 100644 --- a/docs/reference/components/transforms/log_to_metric.cue +++ b/docs/cue/reference/components/transforms/log_to_metric.cue @@ -87,7 +87,7 @@ components: transforms: log_to_metric: { } } tags: { - description: "Key/value pairs representing [metric tags][docs.data-model.metric#tags]." + description: "Key/value pairs representing [metric tags](\(urls.vector_metric)#tags)." required: false common: true warnings: [] @@ -102,10 +102,10 @@ components: transforms: log_to_metric: { options: { "*": { description: """ - Key/value pairs representing [metric tags][docs.data-model.metric#tags]. + Key/value pairs representing [metric tags](\(urls.vector_metric)#tags). Environment variables and field interpolation is allowed. """ - required: true + required: true warnings: [] type: "*": {} } @@ -118,11 +118,11 @@ components: transforms: log_to_metric: { warnings: [] type: string: { enum: { - counter: "A [counter metric type][docs.data-model.metric#counter]." - gauge: "A [gauge metric type][docs.data-model.metric#gauge]." - histogram: "A [distribution metric type][docs.data-model.metric#distribution] with histogram statistic." - set: "A [set metric type][docs.data-model.metric#set]." - summary: "A [distribution metric type][docs.data-model.metric#distribution] with summary statistic." + counter: "A [counter metric type](\(urls.vector_metric)#counter)." + gauge: "A [gauge metric type](\(urls.vector_metric)#gauge)." + histogram: "A [distribution metric type](\(urls.vector_metric)#histogram) with histogram statistic." + set: "A [set metric type](\(urls.vector_metric)#set)." + summary: "A [distribution metric type](\(urls.vector_metric)#distribution) with summary statistic." } syntax: "literal" } @@ -148,20 +148,13 @@ components: transforms: log_to_metric: { { title: "Counter" notes: "This example demonstrates counting HTTP status codes." - configuration: { - metrics: [ - { - type: "counter" - field: "status" - name: "response_total" - namespace: "service" - tags: { - status: "{{status}}" - host: "{{host}}" - } - }, + configuration: #""" + [transforms.log_to_metric] + type = "log_to_metric" + metrics = [ + { type = "counter", field = "status", name = "response_total", namespace = "service", tags = {status = "{{status}}", host = "{{host}}"} } ] - } + """# input: log: { host: "10.22.11.222" message: "Sent 200 in 54.2ms" @@ -183,19 +176,13 @@ components: transforms: log_to_metric: { { title: "Sum" notes: "In this example we'll demonstrate computing a sum by computing the total of orders placed." - configuration: { - metrics: [ - { - type: "counter" - field: "total" - name: "order_total" - increment_by_value: true - tags: { - host: "{{host}}" - } - }, + configuration: #""" + [transforms.log_to_metric] + type = "log_to_metric" + metrics = [ + { type = "counter", field = "total", name = "order_total", increment_by_value = true, tags = {host = "{{host}}"} } ] - } + """# input: log: { host: "10.22.11.222" message: "Order placed for $122.20" @@ -215,25 +202,15 @@ components: transforms: log_to_metric: { { title: "Gauges" notes: "In this example we'll demonstrate creating a gauge that represents the current CPU load averages." - configuration: { - metrics: [ - { - type: "gauge" - field: "1m_load_avg" - tags: host: "{{host}}" - }, - { - type: "gauge" - field: "5m_load_avg" - tags: host: "{{host}}" - }, - { - type: "gauge" - field: "15m_load_avg" - tags: host: "{{host}}" - }, + configuration: #""" + [transforms.log_to_metric] + type = "log_to_metric" + metrics = [ + { type = "gauge", field = "1m_load_avg", tags = {host = "{{host}}"} }, + { type = "gauge", field = "5m_load_avg", tags = {host = "{{host}}"} }, + { type = "gauge", field = "15m_load_avg", tags = {host = "{{host}}"} } ] - } + """# input: log: { host: "10.22.11.222" message: "CPU activity sample" @@ -277,19 +254,13 @@ components: transforms: log_to_metric: { { title: "Histogram distribution" notes: "This example demonstrates capturing timings in your logs to compute histogram." - configuration: { - metrics: [ - { - type: "histogram" - field: "time" - name: "time_ms" - tags: { - status: "{{status}}" - host: "{{host}}" - } - }, + configuration: #""" + [transforms.log_to_metric] + type = "log_to_metric" + metrics = [ + { type = "histogram", field = "time", name = "time_ms", tags = {status = "{{status}}", host = "{{host}}"} } ] - } + """# input: log: { host: "10.22.11.222" message: "Sent 200 in 54.2ms" @@ -312,19 +283,13 @@ components: transforms: log_to_metric: { { title: "Summary distribution" notes: "This example demonstrates capturing timings in your logs to compute summary." - configuration: { - metrics: [ - { - type: "summary" - field: "time" - name: "time_ms" - tags: { - status: "{{status}}" - host: "{{host}}" - } - }, + configuration: #""" + [transforms.log_to_metric] + type = "log_to_metric" + metrics = [ + { type = "summary", field = "time", name = "time_ms", tags = {status = "{{status}}", host = "{{host}}"} } ] - } + """# input: log: { host: "10.22.11.222" message: "Sent 200 in 54.2ms" @@ -352,18 +317,13 @@ components: transforms: log_to_metric: { The idea is that you pass the unique/high-cardinality value as the metric value and the metric store will count the number of unique values seen. """ - configuration: { - metrics: [ - { - type: "set" - field: "remote_addr" - namespace: "{{branch}}" - tags: { - host: "{{host}}" - } - }, + configuration: #""" + [transforms.log_to_metric] + type = "log_to_metric" + metrics = [ + { type = "set", field = "remote_addr", namespace = "{{branch}}", tags = {host = "{{host}}"} } ] - } + """# input: log: { host: "10.22.11.222" message: "Sent 200 in 54.2ms" @@ -396,12 +356,12 @@ components: transforms: log_to_metric: { } reducing: { title: "Reducing" - body: """ + body: """ It's important to understand that this transform does not reduce multiple logs to a single metric. Instead, this transform converts logs into granular individual metrics that can then be reduced at the edge. Where the reduction happens depends on your metrics storage. For example, the - [`prometheus_exporter` sink][docs.sinks.prometheus_exporter] will reduce logs in the sink itself + [`prometheus_exporter` sink](\(urls.vector_sinks)/prometheus_exporter) will reduce logs in the sink itself for the next scrape, while other metrics sinks will proceed to forward the individual metrics for reduction in the metrics storage itself. """ diff --git a/docs/reference/components/transforms/logfmt_parser.cue b/docs/cue/reference/components/transforms/logfmt_parser.cue similarity index 97% rename from docs/reference/components/transforms/logfmt_parser.cue rename to docs/cue/reference/components/transforms/logfmt_parser.cue index 6eda15efa918f..479048ca2cf15 100644 --- a/docs/reference/components/transforms/logfmt_parser.cue +++ b/docs/cue/reference/components/transforms/logfmt_parser.cue @@ -141,7 +141,7 @@ components: transforms: logfmt_parser: { title: "Quoting Values" body: #""" Values can be quoted to capture spaces, and quotes can be escaped with `\`. - For example + For example, this ```text key1="value with spaces" key2="value with spaces and \"" @@ -164,7 +164,7 @@ components: transforms: logfmt_parser: { [Logfmt](\(urls.logfmt)) is, unfortunately, a very loosely defined format. There is no official specification for the format and Vector makes a best effort to parse key/value pairs delimited with a `=`. It works by splitting the `field`'s - value on non-quoted white-space and then splitting each token by a non-quoted + value on non-quoted whitespace and then splitting each token by a non-quoted `=` character. This makes the parsing process somewhat flexible in that the string does not need to be strictly formatted. diff --git a/docs/reference/components/transforms/lua.cue b/docs/cue/reference/components/transforms/lua.cue similarity index 98% rename from docs/reference/components/transforms/lua.cue rename to docs/cue/reference/components/transforms/lua.cue index d6e13ff87d2cb..0ad770364c440 100644 --- a/docs/reference/components/transforms/lua.cue +++ b/docs/cue/reference/components/transforms/lua.cue @@ -233,24 +233,20 @@ components: transforms: lua: { examples: [ { - title: "Add, rename, & remove log fields" + title: "Add, rename, and remove log fields" configuration: { version: "2" hooks: process: """ function (event, emit) -- Add root level field event.log.field = "new value" - -- Add nested field event.log.nested.field = "nested value" - -- Rename field event.log.renamed_field = event.log.field_to_rename event.log.field_to_rename = nil - -- Remove fields event.log.field_to_remove = nil - emit(event) end """ @@ -273,14 +269,11 @@ components: transforms: lua: { function (event, emit) -- Add tag event.metric.tags.tag = "new value" - -- Rename tag event.metric.tags.renamed_tag = event.log.tag_to_rename event.metric.tags.tag_to_rename = nil - -- Remove tag event.metric.tags.tag_to_remove = nil - emit(event) end """ @@ -336,7 +329,6 @@ components: transforms: lua: { event[f] = nil end end - emit(event) end """ @@ -372,7 +364,6 @@ components: transforms: lua: { nanosec = ms * 1000000 } end - function process(event, emit) event.log.timestamp = parse_timestamp(event.log.timestamp_string) emit(event) @@ -405,20 +396,16 @@ components: transforms: lua: { function init() count = 0 end - function process() count = count + 1 end - function timer_handler(emit) emit(make_counter(count)) count = 0 end - function shutdown(emit) emit(make_counter(count)) end - function make_counter(value) return metric = { name = "event_counter", @@ -453,7 +440,7 @@ components: transforms: lua: { The `process` hook takes an `event` as its first argument. Events are represented as [tables](\(urls.lua_table)) in Lua and follow Vector's data model exactly. Please refer to - Vector's [data model reference][docs.data-model] for the event + Vector's [data model reference](\(urls.vector_data_model)) for the event schema. How Vector's types map to Lua's type are covered below. """ sub_sections: [ @@ -466,7 +453,7 @@ components: transforms: lua: { | Vector Type | Lua Type | Comment | |:----------------------------------------------------|:--------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [`String`](\(urls.vector_log)#strings) | [`string`](\(urls.lua_string)) | | - | [`Integer`](\(urls.vector_log)#ints) | [`integer`](\(urls.lua_integer)) | | + | [`Integer`](\(urls.vector_log)#integers) | [`integer`](\(urls.lua_integer)) | | | [`Float`](\(urls.vector_log)#floats) | [`number`](\(urls.lua_number)) | | | [`Boolean`](\(urls.vector_log)#booleans) | [`boolean`](\(urls.lua_boolean)) | | | [`Timestamp`](\(urls.vector_log)#timestamps) | [`table`](\(urls.lua_table)) | There is no dedicated timestamp type in Lua. Timestamps are represented as tables using the convention defined by [`os.date`](\(urls.lua_os_date)) and [`os.time`](\(urls.lua_os_time)). The table representation of a timestamp contains the fields `year`, `month`, `day`, `hour`, `min`, `sec`, `nanosec`, `yday`, `wday`, and `isdst`. If such a table is passed from Lua to Vector, the fields `yday`, `wday`, and `isdst` can be omitted. In addition to the `os.time` representation, Vector supports sub-second resolution with a `nanosec` field in the table. | diff --git a/docs/reference/components/transforms/merge.cue b/docs/cue/reference/components/transforms/merge.cue similarity index 100% rename from docs/reference/components/transforms/merge.cue rename to docs/cue/reference/components/transforms/merge.cue diff --git a/docs/reference/components/transforms/metric_to_log.cue b/docs/cue/reference/components/transforms/metric_to_log.cue similarity index 95% rename from docs/reference/components/transforms/metric_to_log.cue rename to docs/cue/reference/components/transforms/metric_to_log.cue index ce7ba89c06334..d955f7f46a3bb 100644 --- a/docs/reference/components/transforms/metric_to_log.cue +++ b/docs/cue/reference/components/transforms/metric_to_log.cue @@ -65,9 +65,11 @@ components: transforms: metric_to_log: { examples: [ { title: "Metric To Log" - configuration: { - host_tag: "host" - } + configuration: #""" + [transforms.metric_to_log] + type = "metric_to_log" + host_tag = "host" + """# input: metric: { kind: "absolute" name: "histogram" diff --git a/docs/reference/components/transforms/reduce.cue b/docs/cue/reference/components/transforms/reduce.cue similarity index 96% rename from docs/reference/components/transforms/reduce.cue rename to docs/cue/reference/components/transforms/reduce.cue index fcf0df395107a..efb58acdcd7af 100644 --- a/docs/reference/components/transforms/reduce.cue +++ b/docs/cue/reference/components/transforms/reduce.cue @@ -206,11 +206,13 @@ components: transforms: reduce: { } }, ] - configuration: { - group_by: ["host", "pid", "tid"] - merge_strategies: message: "concat_newline" - starts_when: #"match(.message, /^[^\s]/)"# - } + configuration: #""" + [transforms.reduce] + type = "reduce" + group_by = ["host", "pid", "tid"] + marge_strategies.message = "concat_newline" + starts_when = 'match(.message, /^[^\s]/)' + """# output: [ { log: { @@ -239,7 +241,10 @@ components: transforms: reduce: { }, { title: "Reduce Rails logs into a single transaction" - configuration: {} + configuration: #""" + [transforms.reduce] + type = "reduce" + """# input: [ {log: {timestamp: "2020-10-07T12:33:21.223543Z", message: "Received GET /path", request_id: "abcd1234", request_path: "/path", request_params: {"key": "val"}}}, {log: {timestamp: "2020-10-07T12:33:21.832345Z", message: "Executed query in 5.2ms", request_id: "abcd1234", query: "SELECT * FROM table", query_duration_ms: 5.2}}, diff --git a/docs/reference/components/transforms/regex_parser.cue b/docs/cue/reference/components/transforms/regex_parser.cue similarity index 94% rename from docs/reference/components/transforms/regex_parser.cue rename to docs/cue/reference/components/transforms/regex_parser.cue index 2a3a9ec8217b5..7aaa0b38442e7 100644 --- a/docs/reference/components/transforms/regex_parser.cue +++ b/docs/cue/reference/components/transforms/regex_parser.cue @@ -187,14 +187,14 @@ components: transforms: regex_parser: { } regex_debugger: { title: "Regex Debugger" - body: """ - If you are having difficulty with your regular expression not matching text, you may try debugging your patterns at [Regex 101][regex_tester]. This site includes a regular expression tester and debugger. The regular expression engine used by Vector is most similar to the "Go" implementation, so make sure that is selected in the "Flavor" menu. + body: """ + If you are having difficulty with your regular expression not matching text, you may try debugging your patterns at [Regex 101](\(urls.regex_tester)). This site includes a regular expression tester and debugger. The regular expression engine used by Vector is most similar to the "Go" implementation, so make sure that is selected in the "Flavor" menu. """ } regex_syntax: { title: "Regex Syntax" - body: """ - Vector uses the Rust standard regular expression engine for pattern matching. Its syntax shares most of the features of Perl-style regular expressions, with a few exceptions. You can find examples of patterns in the [Rust regex module documentation][rust_regex_syntax]. + body: """ + Vector uses the Rust standard regular expression engine for pattern matching. Its syntax shares most of the features of Perl-style regular expressions, with a few exceptions. You can find examples of patterns in the [Rust regex module documentation](\(urls.rust_regex_syntax)). """ } } diff --git a/docs/reference/components/transforms/remap.cue b/docs/cue/reference/components/transforms/remap.cue similarity index 85% rename from docs/reference/components/transforms/remap.cue rename to docs/cue/reference/components/transforms/remap.cue index 85a71e109e8ea..3116042934d10 100644 --- a/docs/reference/components/transforms/remap.cue +++ b/docs/cue/reference/components/transforms/remap.cue @@ -124,30 +124,34 @@ components: transforms: "remap": { title: "Lazy Event Mutation" body: #""" When you make changes to an event through VRL's path assignment syntax, the change - is not immediately applied to the actual event. If the program fails to run to - completion, any changes made until that point are dropped, and the event is kept in + isn't immediately applied to the actual event. If the program fails to run to + completion, any changes made until that point are dropped and the event is kept in its original state. If you want to make sure your event is changed as expected, you have to rewrite - your program to never fail at runtime (the compiler will help you with this). + your program to never fail at runtime (the compiler can help you with this). Alternatively, if you want to ignore/drop events that caused the program to fail, you can set the `drop_on_error` configuration value to `true`. - Learn more about Runtime Errors in the [Vector Remap Language + Learn more about runtime errors in the [Vector Remap Language reference](\#(urls.vrl_runtime_errors)). """# } emitting_multiple_events: { title: "Emitting multiple log events" body: #""" - Multiple log events can be emitted from remap by assigning an array - to the root path `.`. One log event will be emitted for each input - element of the array. + Multiple log events can be emitted from remap by assigning an array to the root path + `.`. One log event is emitted for each input element of the array. - If any of the array elements is not an object, a log event will - be created that uses the element value as the `message` key. For - example, `123` will be emitted as `{ "message": 123 }` + If any of the array elements isn't an object, a log event is created that uses the + element's value as the `message` key. For example, `123` is emitted as: + + ```json + { + "message": 123 + } + ``` """# } } diff --git a/docs/reference/components/transforms/remove_fields.cue b/docs/cue/reference/components/transforms/remove_fields.cue similarity index 100% rename from docs/reference/components/transforms/remove_fields.cue rename to docs/cue/reference/components/transforms/remove_fields.cue diff --git a/docs/reference/components/transforms/remove_tags.cue b/docs/cue/reference/components/transforms/remove_tags.cue similarity index 100% rename from docs/reference/components/transforms/remove_tags.cue rename to docs/cue/reference/components/transforms/remove_tags.cue diff --git a/docs/reference/components/transforms/rename_fields.cue b/docs/cue/reference/components/transforms/rename_fields.cue similarity index 100% rename from docs/reference/components/transforms/rename_fields.cue rename to docs/cue/reference/components/transforms/rename_fields.cue diff --git a/docs/reference/components/transforms/route.cue b/docs/cue/reference/components/transforms/route.cue similarity index 85% rename from docs/reference/components/transforms/route.cue rename to docs/cue/reference/components/transforms/route.cue index 8cc38479b72f3..8449a37bab522 100644 --- a/docs/reference/components/transforms/route.cue +++ b/docs/cue/reference/components/transforms/route.cue @@ -3,6 +3,8 @@ package metadata components: transforms: route: { title: "Route" + alias: "swimlanes" + description: """ Splits a stream of events into multiple sub-streams based on a set of conditions. @@ -79,14 +81,14 @@ components: transforms: route: { examples: [ { title: "Split by log level" - configuration: { - route: { - debug: #".level == "debug""# - info: #".level == "info""# - warn: #".level == "warn""# - error: #".level == "error""# - } - } + configuration: #""" + [transforms.route] + type = "route" + route.debug = '.level == "debug"' + route.info = '.level == "info"' + route.warn = '.level == "warn"' + route.error = '.level == "error"' + """# input: log: { level: "info" } @@ -96,12 +98,12 @@ components: transforms: route: { }, { title: "Split by metric namespace" - configuration: { - route: { - app: #".namespace == "app""# - host: #".namespace == "host""# - } - } + configuration: #""" + [transforms.route] + type = "route" + route.app = '.namespace == "app"' + route.host = '.namespace == "host"' + """# input: metric: { counter: { value: 10000.0 diff --git a/docs/reference/components/transforms/sample.cue b/docs/cue/reference/components/transforms/sample.cue similarity index 100% rename from docs/reference/components/transforms/sample.cue rename to docs/cue/reference/components/transforms/sample.cue diff --git a/docs/reference/components/transforms/split.cue b/docs/cue/reference/components/transforms/split.cue similarity index 100% rename from docs/reference/components/transforms/split.cue rename to docs/cue/reference/components/transforms/split.cue diff --git a/docs/reference/components/transforms/tag_cardinality_limit.cue b/docs/cue/reference/components/transforms/tag_cardinality_limit.cue similarity index 97% rename from docs/reference/components/transforms/tag_cardinality_limit.cue rename to docs/cue/reference/components/transforms/tag_cardinality_limit.cue index f023586d72269..68f6deb4062d5 100644 --- a/docs/reference/components/transforms/tag_cardinality_limit.cue +++ b/docs/cue/reference/components/transforms/tag_cardinality_limit.cue @@ -107,12 +107,12 @@ components: transforms: tag_cardinality_limit: { second metric's `user_id` tag has been removed. That's because it exceeded the `value_limit`. """ - configuration: { - fields: { - value_limit: 1 - limit_exceeded_action: "drop_tag" - } - } + configuration: #""" + [transforms.tag_cardinality_limit] + type = "tag_cardinality_limit" + fields.value_limit = 1 + fields.limit_exceeded_action = "drop_tag" + """# input: [ {metric: { kind: "incremental" diff --git a/docs/reference/components/transforms/tokenizer.cue b/docs/cue/reference/components/transforms/tokenizer.cue similarity index 100% rename from docs/reference/components/transforms/tokenizer.cue rename to docs/cue/reference/components/transforms/tokenizer.cue diff --git a/docs/reference/components/transforms/wasm.cue b/docs/cue/reference/components/transforms/wasm.cue similarity index 93% rename from docs/reference/components/transforms/wasm.cue rename to docs/cue/reference/components/transforms/wasm.cue index b3ce18fc9e926..c0148af36380d 100644 --- a/docs/reference/components/transforms/wasm.cue +++ b/docs/cue/reference/components/transforms/wasm.cue @@ -38,10 +38,10 @@ components: transforms: wasm: { } requirements: [ - #""" - Vector must be built with the `wasm` feature. *This is not enabled by default. - Review [Building Vector][urls.contributing]*. - """#, + """ + Vector must be built with the `wasm` feature. This is *not* enabled by default. See the + [Building Vector](\(urls.contributing)) docs for more info.* + """, ] warnings: [] notices: [ diff --git a/docs/reference/configuration.cue b/docs/cue/reference/configuration.cue similarity index 95% rename from docs/reference/configuration.cue rename to docs/cue/reference/configuration.cue index 19326692f6d8c..5433b7012aafe 100644 --- a/docs/reference/configuration.cue +++ b/docs/cue/reference/configuration.cue @@ -132,7 +132,11 @@ configuration: { timezone: { common: false - description: "The name of the time zone to apply to timestamp conversions that do not contain an explicit time zone. The time zone name may be any name in the [TZ database][urls.tz_time_zones], or `local` to indicate system local time." + description: """ + The name of the time zone to apply to timestamp conversions that do not contain an + explicit time zone. The time zone name may be any name in the + [TZ database](\(urls.tz_time_zones)), or `local` to indicate system local time. + """ required: false warnings: [] type: string: { diff --git a/docs/reference/data_model.cue b/docs/cue/reference/data_model.cue similarity index 100% rename from docs/reference/data_model.cue rename to docs/cue/reference/data_model.cue diff --git a/docs/reference/data_model/schema.cue b/docs/cue/reference/data_model/schema.cue similarity index 98% rename from docs/reference/data_model/schema.cue rename to docs/cue/reference/data_model/schema.cue index 64d89233a3bfa..3ed541f350eb5 100644 --- a/docs/reference/data_model/schema.cue +++ b/docs/cue/reference/data_model/schema.cue @@ -7,7 +7,6 @@ data_model: schema: { A Vector log event is a structured representation of a point-in-time event. It contains an arbitrary set of fields that describe the event. - A key tenet of Vector is to remain schema neutral. This ensures that Vector can work with any schema, supporting legacy and future schemas as your needs evolve. Vector @@ -60,9 +59,7 @@ data_model: schema: { counter: { common: true description: """ - A single value that can only be incremented - or reset to zero value, it cannot be - decremented. + A single value that can be incremented or reset to a zero value but *not* decremented. """ required: false warnings: [] @@ -169,7 +166,7 @@ data_model: schema: { histogram: { common: true description: """ - Also called a "timer". A histogram samples + Also called a **timer**. A histogram samples observations (usually things like request durations or response sizes) and counts them in configurable buckets. It also provides a diff --git a/docs/cue/reference/glossary.cue b/docs/cue/reference/glossary.cue new file mode 100644 index 0000000000000..23822a8a24bec --- /dev/null +++ b/docs/cue/reference/glossary.cue @@ -0,0 +1,217 @@ +package metadata + +#Term: { + term: !="" + description: !="" +} + +#Glossary: [#Term, ...#Term] + +glossary: #Glossary & [ + { + term: "Batch" + description: """ + A [batched payload](\(urls.vector_log)) within a [sink](#sink). It is a batch of events + encoded into a payload that the downstream service understands. + """ + }, + { + term: "Benchmark" + description: """ + A test designed to measure performance and resource usage. You can learn more about + Vector's benchmarks in the Vector repo's [main README](\(urls.vector_readme)). + """ + }, + { + term: "Binary" + description: "The static binary that Vector compiles to." + }, + { + term: "Buffer" + description: """ + An ordered queue of events that's coupled with a [sink](#sink). + """ + }, + { + term: "Component" + description: """ + An umbrella term encompassing Vector [sources](#source), [transforms](#transform), and + [sinks](#sink). Vector components can be assembled together into a Vector + [pipeline](#pipeline) for processing observability data in a flexible and configurable + way. + """ + }, + { + term: "Configuration" + description: """ + The settings and options used to control Vector's behavior. You can learn more about + Vector's configuration on the [Configuration](\(urls.vector_configuration)) page. + """ + }, + { + term: "Durability" + description: """ + The ability to retain data across exceptional events. In the context of Vector, this + typically refers to the ability to retain data across restarts. + """ + }, + { + term: "Event" + description: """ + A single unit of data that flows through Vector. You can learn more about events on the + [Data model](\(urls.vector_data_model)) page. + """ + }, + { + term: "Filter" + description: """ + A type of [transform](#transform) that filters events or fields on an event. + """ + }, + { + term: "Flush" + description: #""" + The act of sending a batched payload to a downstream service. This is commonly used in + conjunction with [buffering](#buffer). + """# + }, + { + term: "GitHub" + description: "The service used to host Vector's source code." + }, + { + term: "Guide" + description: """ + A tutorial or walkthrough of a specific subject. You can see Vector’s guides in the + [Guides](\(urls.vector_guides)) section. + """ + }, + { + term: "Log" + description: """ + An individual log event. Logs are one of the core Vector [event types](#event), + alongside [mterics](#metric). + """ + }, + { + term: "Metric" + description: """ + An individual data unit representing a point-in-itme measurement. Metrics are one of the + core Vector [event types](#event), alongside [logs](#log). + """ + }, + { + term: "Parser" + description: "A [transform](#transform) that parses [event](#event) data." + }, + { + term: "Pipeline" + description: """ + The end result of combining [sources](#source), [transforms](#transform), and + [sinks](#sink). + """ + }, + { + term: "Reducer" + description: """ + A [transform](#transform) that reduces data into a [metric](#metric). + """ + }, + { + term: "Repo" + description: """ + A Git repository, usually the [Vector Git repository](\(urls.vector_repo)). + """ + }, + { + term: "Role" + description: """ + A capacity in which Vector is deployed. For more, see the listing of available + [roles](\(urls.vector_roles)) for Vector. + """ + }, + { + term: "Router" + description: """ + Something that accepts and routes data to many destinations. Vector is commonly referred + to as a router. + """ + }, + { + term: "Rust" + description: """ + The [Rust programming language](\(urls.rust)). Vector is written exclusively in Rust and + takes heavy advantage of Rust's core features, such as memory efficiency and memory + safety. + """ + }, + { + term: "Sample" + description: """ + A [transform](#transform) that samples data (i.e. retains only a subset of a stream + based on inclusion criteria). + """ + }, + { + term: "Sink" + description: """ + One of the core [component](#component) types in Vector, **sinks** deliver observability + to a variety of [available destinations](\(urls.vector_sinks)). Sinks are the terminus + points for Vector [pipelines](#pipeline). + """ + }, + { + term: "Source" + description: """ + One of the core [component](#component) types in Vector, **sources** take in + observability data from a wide range of [available targets](\(urls.vector_sources)). + Sources are the entry points for Vector [pipelines](#pipeline). + """ + }, + { + term: "Structured log" + description: """ + A [log](#log) represented in a structured form, such as a map. Structured logs are + distinguished from *text* logs, which are represented as a single text string. + """ + }, + { + term: "Table" + description: """ + The [TOML table type](\(urls.toml_table)), which is a collection of key/value pairs + directly akin to data types like dicts (Python), objects (JavaScript), and hashes + (Ruby). + """ + }, + { + term: "Topology" + description: """ + A [deployment topology](\(urls.vector_topologies)) under which Vector is deployed. + """ + }, + { + term: "Transform" + description: """ + One of the core [component](#component) types in Vector, **transforms** perform some + kind of action upon [events](#event) flowing through Vector [pipelines](#pipeline), + such as [sampling](#sample), [filtering](#filter), or + [modifying](#vector-remap-language) events. + """ + }, + { + term: "Vector Remap Language" + description: """ + An expression-oriented domain-specific language (DSL) that you can use to modify + observability data in Vector and also for other tasks, such as specifying Boolean + conditions for [filtering](#filter) and [routing](\(urls.vector_route_transform)) + events. Also known as **VRL** for short. + + For more information, see the [`remap` transform](\(urls.vector_remap_transform)), + the [announcement blog post](\(urls.vrl_announcement)), the [VRL + overview](\(urls.vrl_reference)), the comprehensive listing of [VRL + functions](\(urls.vrl_functions)), [errors](\(urls.vrl_errors_reference)), and + [examples](\(urls.vrl_examples)), and the overview of [VRL + expressions](\(urls.vrl_expressions)). + """ + }, +] diff --git a/docs/cue/reference/process.cue b/docs/cue/reference/process.cue new file mode 100644 index 0000000000000..68a9c40d41382 --- /dev/null +++ b/docs/cue/reference/process.cue @@ -0,0 +1,66 @@ +package metadata + +process: { + #ExitCode: { + code: int + description: string + } + + #ExitCodes: [Name=string]: #ExitCode + + #Signal: { + description: string + name: string + } + + #Signals: [Name=string]: #Signal & {name: Name} + + exit_codes: { + description: string + codes: #ExitCodes + } + + process_signals: { + description: string + signals: #Signals + } + + exit_codes: { + description: """ + You can find a full list of exit codes in the [`exitcodes` Rust crate](\(urls.exit_codes)). Vector uses the + codes listed in the table below. + """ + + codes: { + "0": { + code: 0 + description: "Exited successfully." + } + "1": { + code: 1 + description: "Exited with a generic error." + } + "78": { + code: 78 + description: "Configuration is invalid." + } + } + } + + process_signals: { + description: """ + The Vector is built to handle the inter-process communication [signals](\(urls.signal)) listed in the + table below. + """ + + signals: { + SIGHUP: { + description: "Reloads configuration on the fly." + } + + SIGTERM: { + description: "Initiates graceful shutdown process." + } + } + } +} diff --git a/docs/reference/releases.cue b/docs/cue/reference/releases.cue similarity index 80% rename from docs/reference/releases.cue rename to docs/cue/reference/releases.cue index 95b6cc1e098c7..70eb94a85f54f 100644 --- a/docs/reference/releases.cue +++ b/docs/cue/reference/releases.cue @@ -18,13 +18,14 @@ releases: { #CommitSha: =~"^[a-z0-9]{40}$" #Release: { - codename: string + version: string + codename?: string date: string description?: string - commits: [#Commit, ...#Commit] + commits?: [#Commit, ...#Commit] whats_next: #Any } - {[Name=string]: #Release} + {[Version=string]: #Release & {version: Version}} } diff --git a/docs/reference/releases/0.10.0.cue b/docs/cue/reference/releases/0.10.0.cue similarity index 99% rename from docs/reference/releases/0.10.0.cue rename to docs/cue/reference/releases/0.10.0.cue index 2e9ff4b16c91d..fdc2fccc2d568 100644 --- a/docs/reference/releases/0.10.0.cue +++ b/docs/cue/reference/releases/0.10.0.cue @@ -7,15 +7,15 @@ releases: "0.10.0": { whats_next: [ { title: "Kubernetes! ⎈" - description: "We're doing this integration right. We've been alpha testing with a number of large clusters and we've honed in on a very high-quality approach that reflects the UX Vector is going after. You can learn more in our [Kubernetes Integration RFC][urls.pr_2222]. Do you want to beta test? [Tell us!][urls.vector_chat]" + description: "We're doing this integration right. We've been alpha testing with a number of large clusters and we've honed in on a very high-quality approach that reflects the UX Vector is going after. You can learn more in our [Kubernetes Integration RFC](\(urls.vector_pull_requests)/2222). Do you want to beta test? [Tell us](\(urls.vector_chat))!" }, { title: "WASM plugins 🔌" - description: "This release included an experimental implementation of a WASM transform behind a `wasm` build flag. We plan to stabilize WASM transforms, as well as add [WASM][urls.wasm] sinks and sources, enabling you to extend Vector in the language of your choice with little performance penalty. ❤️ WASM. Check out the [WASM Plugin RFC][urls.pr_2341] for more info." + description: "This release included an experimental implementation of a WASM transform behind a `wasm` build flag. We plan to stabilize WASM transforms, as well as add [WASM](\(urls.wasm)) sinks and sources, enabling you to extend Vector in the language of your choice with little performance penalty. ❤️ WASM. Check out the [WASM Plugin RFC](\(urls.vector_pull_requests)/2341) for more info." }, { title: "Dynamic HTTP Rate-Limiting (AIMD)" - description: "Fiddling with rate-limits is a frustrating endaevor. If you set them too high you risk overwhelming the service; too low and you're unecessarily limiting throughput. What happens if you deploy a few more Vector instances? Vector is planning to solve this by automatically detecting the optimal rate limits, taking inspiration from TCP congestional control algorithms. Check out the [Dynamic HTTP Rate Limiting RFC][urls.pr_2329]." + description: "Fiddling with rate-limits is a frustrating endaevor. If you set them too high you risk overwhelming the service; too low and you're unecessarily limiting throughput. What happens if you deploy a few more Vector instances? Vector is planning to solve this by automatically detecting the optimal rate limits, taking inspiration from TCP congestional control algorithms. Check out the [Dynamic HTTP Rate Limiting RFC](\(urls.vector_pull_requests)/2329)." }, ] diff --git a/docs/reference/releases/0.11.0.cue b/docs/cue/reference/releases/0.11.0.cue similarity index 100% rename from docs/reference/releases/0.11.0.cue rename to docs/cue/reference/releases/0.11.0.cue diff --git a/docs/reference/releases/0.11.1.cue b/docs/cue/reference/releases/0.11.1.cue similarity index 98% rename from docs/reference/releases/0.11.1.cue rename to docs/cue/reference/releases/0.11.1.cue index 0e627ca0eadb6..803c3cd21eaa2 100644 --- a/docs/reference/releases/0.11.1.cue +++ b/docs/cue/reference/releases/0.11.1.cue @@ -1,8 +1,7 @@ package metadata releases: "0.11.1": { - date: "2020-12-17" - codename: "" + date: "2020-12-17" whats_next: [] diff --git a/docs/reference/releases/0.12.0.cue b/docs/cue/reference/releases/0.12.0.cue similarity index 99% rename from docs/reference/releases/0.12.0.cue rename to docs/cue/reference/releases/0.12.0.cue index 974808a9089ec..078f3e4270440 100644 --- a/docs/reference/releases/0.12.0.cue +++ b/docs/cue/reference/releases/0.12.0.cue @@ -23,7 +23,7 @@ releases: "0.12.0": { { title: "Improved Vector to Vector communication" description: """ - The `vector` source and sink currently leverage the TCP protocol to transmit data. While this has + The `vector` source and sink currently use the TCP protocol to transmit data. While this has served users well, it presents operational challenges for large-scale deployments of Vector. Because HTTP is widely used and easy to integrate into platforms like Kubernetes we will be moving these components to the HTTP protocol. diff --git a/docs/reference/releases/0.12.1.cue b/docs/cue/reference/releases/0.12.1.cue similarity index 99% rename from docs/reference/releases/0.12.1.cue rename to docs/cue/reference/releases/0.12.1.cue index 421a87fed8d78..dddbb861dae9e 100644 --- a/docs/reference/releases/0.12.1.cue +++ b/docs/cue/reference/releases/0.12.1.cue @@ -2,12 +2,11 @@ package metadata releases: "0.12.1": { date: "2021-03-12" - codename: "" description: """ This release contains a few fast follow bug fixes from the 0.12.0 release, primarily centered around the recently released [**Vector Remap Language**](\(urls.vrl_reference)) based on user feedback. - """ + """ whats_next: [] diff --git a/docs/reference/releases/0.12.2.cue b/docs/cue/reference/releases/0.12.2.cue similarity index 94% rename from docs/reference/releases/0.12.2.cue rename to docs/cue/reference/releases/0.12.2.cue index 0e0b9ef8cb0a6..8f8f26840f113 100644 --- a/docs/reference/releases/0.12.2.cue +++ b/docs/cue/reference/releases/0.12.2.cue @@ -1,12 +1,11 @@ package metadata releases: "0.12.2": { - date: "2021-03-30" - codename: "" + date: "2021-03-30" description: """ - This release includes a few critical bug fixes and a an update to - OpenSSL to 1.1.1k resolve CVE-2021-3450 and CVE-2021-3449. + This release includes a few critical bug fixes and a an update to OpenSSL to 1.1.1k resolve CVE-2021-3450 and + CVE-2021-3449. """ whats_next: [] diff --git a/docs/reference/releases/0.13.0.cue b/docs/cue/reference/releases/0.13.0.cue similarity index 99% rename from docs/reference/releases/0.13.0.cue rename to docs/cue/reference/releases/0.13.0.cue index 1c8d93b656af7..10a2e4efa5a40 100644 --- a/docs/reference/releases/0.13.0.cue +++ b/docs/cue/reference/releases/0.13.0.cue @@ -1,8 +1,7 @@ package metadata releases: "0.13.0": { - date: "2021-04-21" - codename: "" + date: "2021-04-21" description: """ The Vector team is pleased to announce version 0.13.0! @@ -18,7 +17,7 @@ releases: "0.13.0": { whats_next: [ { - title: "End to end acknowledgements" + title: "End-to-end acknowledgements" description: """ We've heard from a number of users that they'd like improved delivery guarantees for events flowing through Vector. We are working on a feature to allow, for components that are able to support it, to diff --git a/docs/cue/reference/releases/0.13.1.cue b/docs/cue/reference/releases/0.13.1.cue new file mode 100644 index 0000000000000..0625a0ac0df29 --- /dev/null +++ b/docs/cue/reference/releases/0.13.1.cue @@ -0,0 +1,13 @@ +package metadata + +releases: "0.13.1": { + date: "2021-04-29" + + description: """ + This release includes a high-priority bug fix for a regression in [0.13.0](/releases/0.13.0) that caused very + high memory usage when using the [`kafka`](\(urls.vector_sources)/kafka) source and backpressure was + experienced. + """ + + whats_next: [] +} diff --git a/docs/reference/releases/0.14.0.cue b/docs/cue/reference/releases/0.14.0.cue similarity index 99% rename from docs/reference/releases/0.14.0.cue rename to docs/cue/reference/releases/0.14.0.cue index 1921e9783fc42..9d66bd332fd07 100644 --- a/docs/reference/releases/0.14.0.cue +++ b/docs/cue/reference/releases/0.14.0.cue @@ -10,7 +10,7 @@ releases: "0.14.0": { This release includes a new `exec` source that can be used to execute arbitrary programs and use their output to generate events in Vector along with a number of enhancements. - Check out the [highlights](#highlights) and [changelog](#changelog) for more details. + Check out the [changelog](#changelog) for more details. """ whats_next: [ diff --git a/docs/reference/releases/0.4.0.cue b/docs/cue/reference/releases/0.4.0.cue similarity index 100% rename from docs/reference/releases/0.4.0.cue rename to docs/cue/reference/releases/0.4.0.cue diff --git a/docs/reference/releases/0.5.0.cue b/docs/cue/reference/releases/0.5.0.cue similarity index 100% rename from docs/reference/releases/0.5.0.cue rename to docs/cue/reference/releases/0.5.0.cue diff --git a/docs/reference/releases/0.6.0.cue b/docs/cue/reference/releases/0.6.0.cue similarity index 100% rename from docs/reference/releases/0.6.0.cue rename to docs/cue/reference/releases/0.6.0.cue diff --git a/docs/reference/releases/0.7.0.cue b/docs/cue/reference/releases/0.7.0.cue similarity index 100% rename from docs/reference/releases/0.7.0.cue rename to docs/cue/reference/releases/0.7.0.cue diff --git a/docs/reference/releases/0.7.1.cue b/docs/cue/reference/releases/0.7.1.cue similarity index 99% rename from docs/reference/releases/0.7.1.cue rename to docs/cue/reference/releases/0.7.1.cue index 83af900ad5d6c..32b1a20c338f0 100644 --- a/docs/reference/releases/0.7.1.cue +++ b/docs/cue/reference/releases/0.7.1.cue @@ -1,8 +1,7 @@ package metadata releases: "0.7.1": { - date: "2020-01-24" - codename: "" + date: "2020-01-24" whats_next: [ ] diff --git a/docs/reference/releases/0.7.2.cue b/docs/cue/reference/releases/0.7.2.cue similarity index 99% rename from docs/reference/releases/0.7.2.cue rename to docs/cue/reference/releases/0.7.2.cue index bfe4b303eb250..1ac05f1a38ff2 100644 --- a/docs/reference/releases/0.7.2.cue +++ b/docs/cue/reference/releases/0.7.2.cue @@ -1,8 +1,7 @@ package metadata releases: "0.7.2": { - date: "2020-01-31" - codename: "" + date: "2020-01-31" whats_next: [ ] diff --git a/docs/reference/releases/0.8.0.cue b/docs/cue/reference/releases/0.8.0.cue similarity index 100% rename from docs/reference/releases/0.8.0.cue rename to docs/cue/reference/releases/0.8.0.cue diff --git a/docs/reference/releases/0.8.1.cue b/docs/cue/reference/releases/0.8.1.cue similarity index 90% rename from docs/reference/releases/0.8.1.cue rename to docs/cue/reference/releases/0.8.1.cue index c7f87ec1f7e91..54fb59c6d4414 100644 --- a/docs/reference/releases/0.8.1.cue +++ b/docs/cue/reference/releases/0.8.1.cue @@ -1,8 +1,7 @@ package metadata releases: "0.8.1": { - date: "2020-03-04" - codename: "" + date: "2020-03-04" whats_next: [ ] diff --git a/docs/reference/releases/0.8.2.cue b/docs/cue/reference/releases/0.8.2.cue similarity index 97% rename from docs/reference/releases/0.8.2.cue rename to docs/cue/reference/releases/0.8.2.cue index 918cf355228be..407745a692640 100644 --- a/docs/reference/releases/0.8.2.cue +++ b/docs/cue/reference/releases/0.8.2.cue @@ -1,8 +1,7 @@ package metadata releases: "0.8.2": { - date: "2020-03-06" - codename: "" + date: "2020-03-06" whats_next: [ ] diff --git a/docs/reference/releases/0.9.0.cue b/docs/cue/reference/releases/0.9.0.cue similarity index 99% rename from docs/reference/releases/0.9.0.cue rename to docs/cue/reference/releases/0.9.0.cue index afd9c0e14bd04..137bed01cf6b8 100644 --- a/docs/reference/releases/0.9.0.cue +++ b/docs/cue/reference/releases/0.9.0.cue @@ -7,19 +7,19 @@ releases: "0.9.0": { whats_next: [ { title: "Kubernetes!" - description: "We're doing this integration right. We've been alpha testing with a number of large clusters and we've honed in on a very high-quality approach that reflects the UX Vector is going after. You can learn more in our [Kubernetes Integration RFC][urls.pr_2222]. Feedback is welcome!" + description: "We're doing this integration right. We've been alpha testing with a number of large clusters and we've honed in on a very high-quality approach that reflects the UX Vector is going after. You can learn more in our [Kubernetes Integration RFC](\(urls.vector_pull_requests)/2222). Feedback is welcome!" }, { title: "WASM Driven Plugin Architecture" - description: "This release included an overhaul of our [`lua` transform][docs.transforms.lua], which represents a big step towards making Vector more flexible. Lua is an excellent language when you need some quick scripting capabilities. But what if you need something more powerful? Like writing your own custom source, transform, or sink? Vector plans to solve this with [WASM][urls.wasm] foreign module support, enabling you to extend Vector in the language of your choice with little performance penalty. ❤️ WASM. Check out the [WASM Foreign Module Support RFC][urls.pr_2341] for more info." + description: "This release included an overhaul of our [`lua` transform](\(urls.vector_transforms)/lua), which represents a big step towards making Vector more flexible. Lua is an excellent language when you need some quick scripting capabilities. But what if you need something more powerful? Like writing your own custom source, transform, or sink? Vector plans to solve this with [WASM](\(urls.wasm)) foreign module support, enabling you to extend Vector in the language of your choice with little performance penalty. ❤️ WASM. Check out the [WASM Foreign Module Support RFC](\(urls.vector_pull_requests)/2341) for more info." }, { title: "Dynamic HTTP Rate-Limiting (AIMD)" - description: "Fiddling with rate-limits is a frustratin endaevor. If you set them too high you risk overwhelming the service; too low and you're unecessarily limiting throughput. And what happens if you deploy a few more Vector instances? Vector is planning to solve this by automatically detecting the optimal rate limits, taking inspiration from TCP congestional control algorithms. Check out the [Dynamic HTTP Rate Limiting RFC][urls.pr_2329]." + description: "Fiddling with rate-limits is a frustratin endaevor. If you set them too high you risk overwhelming the service; too low and you're unecessarily limiting throughput. And what happens if you deploy a few more Vector instances? Vector is planning to solve this by automatically detecting the optimal rate limits, taking inspiration from TCP congestional control algorithms. Check out the [Dynamic HTTP Rate Limiting RFC](\(urls.vector_pull_requests)/2329)." }, { title: "Vector Observability" - description: "Did you know this release includes a new hidden `internal` source that emits metrics reflecting Vector's own internal state? 👀 We didn't highlight this source because we have not finished instrumenting Vector and we'll be changing the internal schema used.\n\nFun fact, we took an event-driven approach to Vector's internal observability, which we strongly believe in. We want Vector to be a good example of our own advice. Checkout the [Event-Driven Observability RFC][urls.pr_2093]." + description: "Did you know this release includes a new hidden `internal` source that emits metrics reflecting Vector's own internal state? 👀 We didn't highlight this source because we have not finished instrumenting Vector and we'll be changing the internal schema used.\n\nFun fact, we took an event-driven approach to Vector's internal observability, which we strongly believe in. We want Vector to be a good example of our own advice. Checkout the [Event-Driven Observability RFC](\(urls.vector_pull_requests)/2093)." }, ] diff --git a/docs/reference/releases/0.9.1.cue b/docs/cue/reference/releases/0.9.1.cue similarity index 99% rename from docs/reference/releases/0.9.1.cue rename to docs/cue/reference/releases/0.9.1.cue index 9156952d99a2d..5f1d44788b6fa 100644 --- a/docs/reference/releases/0.9.1.cue +++ b/docs/cue/reference/releases/0.9.1.cue @@ -1,8 +1,7 @@ package metadata releases: "0.9.1": { - date: "2020-04-29" - codename: "" + date: "2020-04-29" whats_next: [ ] diff --git a/docs/reference/releases/0.9.2.cue b/docs/cue/reference/releases/0.9.2.cue similarity index 90% rename from docs/reference/releases/0.9.2.cue rename to docs/cue/reference/releases/0.9.2.cue index 07579f64f3428..2a33e3686347d 100644 --- a/docs/reference/releases/0.9.2.cue +++ b/docs/cue/reference/releases/0.9.2.cue @@ -1,8 +1,7 @@ package metadata releases: "0.9.2": { - date: "2020-06-02" - codename: "" + date: "2020-06-02" whats_next: [ ] diff --git a/docs/reference/remap.cue b/docs/cue/reference/remap.cue similarity index 91% rename from docs/reference/remap.cue rename to docs/cue/reference/remap.cue index 78c13fd41eb79..6a0af641ff196 100644 --- a/docs/reference/remap.cue +++ b/docs/cue/reference/remap.cue @@ -31,30 +31,20 @@ package metadata #Type: "any" | "array" | "boolean" | "float" | "integer" | "object" | "null" | "path" | "string" | "regex" | "timestamp" - concepts: _ - description: string - errors: _ + concepts: _ + errors: _ examples: [#Example, ...#Example] - expressions: _ - features: _ - functions: _ + expressions: _ + functions: _ + function_categories: [string, ...string] how_it_works: #HowItWorks literals: _ principles: _ syntax: _ + features: _ } remap: #Remap & { - description: #""" - **Vector Remap Language** (VRL) is an expression-oriented language designed for transforming observability data - (logs and metrics) in a [safe](\#(urls.vrl_safety)) and [performant](\#(urls.vrl_performance)) manner. It - features a simple [syntax](\#(urls.vrl_expressions)) and a rich set of built-in - [functions](\#(urls.vrl_functions)) tailored specifically to observability use cases. - - You can use VRL in Vector via the [`remap` transform](\#(urls.vector_remap_transform)), and for a more in-depth - picture, see the [announcement blog post](\#(urls.vrl_announcement)). - """# - examples: [ { title: "Parse Syslog logs" diff --git a/docs/reference/remap/concepts.cue b/docs/cue/reference/remap/concepts.cue similarity index 100% rename from docs/reference/remap/concepts.cue rename to docs/cue/reference/remap/concepts.cue diff --git a/docs/cue/reference/remap/concepts/event.cue b/docs/cue/reference/remap/concepts/event.cue new file mode 100644 index 0000000000000..c5f1a312ab2b0 --- /dev/null +++ b/docs/cue/reference/remap/concepts/event.cue @@ -0,0 +1,48 @@ +remap: concepts: event: { + title: "Event" + description: """ + VRL programs operate on observability [events](\(urls.vector_data_model)). This VRL program, + for example, adds a field to a log event: + + ```vrl + .new_field = "new value" + ``` + + The event at hand, represented by `.`, is the entire context of the VRL program. + + The event can be set to a value other than an object, for example `. = 5`. If it is set to + an array, each element of that array is emitted as its own event from the [`remap` + transform](\(urls.vector_remap_transform)). For any elements that aren't an object, or if + the top-level `.` is set to a scalar value, that value is set as the `message` key on the + emitted object. + + This expression, for example... + + ```vrl + . = ["hello", 1, true, { "foo": "bar" }] + ``` + + ...results in these four events being emitted: + + ```json + { "message": "hello" } + { "message": 1 } + { "message": true } + { "foo": "bar" } + ``` + """ + + characteristics: { + path: { + title: "Paths" + description: """ + [Path expressions](\(urls.vrl_path_expressions)) enable you to access values inside + the event: + + ```ruby + .kubernetes.pod_id + ``` + """ + } + } +} diff --git a/docs/cue/reference/remap/concepts/expressions.cue b/docs/cue/reference/remap/concepts/expressions.cue new file mode 100644 index 0000000000000..4aecb1438aa35 --- /dev/null +++ b/docs/cue/reference/remap/concepts/expressions.cue @@ -0,0 +1,7 @@ +remap: concepts: expressions: { + title: "Expressions" + description: """ + VRL is an expression-oriented language. A VRL program consists entirely of + [expressions](\(urls.vrl_expressions)), with every expression returning a value. + """ +} diff --git a/docs/cue/reference/remap/concepts/function.cue b/docs/cue/reference/remap/concepts/function.cue new file mode 100644 index 0000000000000..60f026bb336e3 --- /dev/null +++ b/docs/cue/reference/remap/concepts/function.cue @@ -0,0 +1,23 @@ +remap: concepts: function: { + title: "Function" + description: """ + Like most languages, VRL includes [functions](\(urls.vrl_functions)) that represent named + procedures designed to accomplish specific tasks. Functions are the highest-level construct + of reusable code in VRL, which, for the sake of simplicity, doesn't include modules, + classes, or other complex constructs for organizing functions. + """ + + characteristics: { + fallibility: { + title: "Fallibility" + description: """ + Some VRL functions are *fallible*, meaning that they can error. Any potential errors + thrown by fallible functions must be handled, a requirement enforced at compile + time. + + This feature of VRL programs, which we call [fail safety](\(urls.vrl_fail_safety)), + is a defining characteristic of VRL and a primary source of its safety guarantees. + """ + } + } +} diff --git a/docs/reference/remap/concepts/literal.cue b/docs/cue/reference/remap/concepts/literal.cue similarity index 51% rename from docs/reference/remap/concepts/literal.cue rename to docs/cue/reference/remap/concepts/literal.cue index 0b783c0580492..11812827ddb05 100644 --- a/docs/reference/remap/concepts/literal.cue +++ b/docs/cue/reference/remap/concepts/literal.cue @@ -1,7 +1,8 @@ remap: concepts: literal: { title: "Literal" description: """ - As in most other languages, [literals](\(urls.vrl_literals)) in VRL are values written exactly as they are meant - to be interpreted. Literals include things like strings, Booleans, and integers. + As in most other languages, [literals](\(urls.vrl_literals)) in VRL are values written + exactly as they are meant to be interpreted. Literals include things like strings, Booleans, + and integers. """ } diff --git a/docs/cue/reference/remap/concepts/program.cue b/docs/cue/reference/remap/concepts/program.cue new file mode 100644 index 0000000000000..98d132ca7e7b7 --- /dev/null +++ b/docs/cue/reference/remap/concepts/program.cue @@ -0,0 +1,8 @@ +remap: concepts: program: { + title: "Program" + description: """ + A VRL program is the highest-level unit of computation. A program is the end result of + combining an arbitrary number of [expressions](#\(concepts.expressions.anchor)) operating on + a single observability event. + """ +} diff --git a/docs/reference/remap/errors.cue b/docs/cue/reference/remap/errors.cue similarity index 100% rename from docs/reference/remap/errors.cue rename to docs/cue/reference/remap/errors.cue diff --git a/docs/reference/remap/errors/100_unhandled_root_runtime_error.cue b/docs/cue/reference/remap/errors/100_unhandled_root_runtime_error.cue similarity index 100% rename from docs/reference/remap/errors/100_unhandled_root_runtime_error.cue rename to docs/cue/reference/remap/errors/100_unhandled_root_runtime_error.cue diff --git a/docs/reference/remap/errors/101_malformed_regex_literal.cue b/docs/cue/reference/remap/errors/101_malformed_regex_literal.cue similarity index 88% rename from docs/reference/remap/errors/101_malformed_regex_literal.cue rename to docs/cue/reference/remap/errors/101_malformed_regex_literal.cue index e819b625d3c81..c77663b95ff18 100644 --- a/docs/reference/remap/errors/101_malformed_regex_literal.cue +++ b/docs/cue/reference/remap/errors/101_malformed_regex_literal.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "101": { title: "Malformed regex literal" description: """ - A [regex literal expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) is malformed + A [regex literal expression](\(urls.vrl_expressions)#regular-expression) is malformed and thus doesn't result in a valid regular expression. """ rationale: """ @@ -11,7 +11,7 @@ remap: errors: "101": { """ resolution: """ Regular expressions are difficult to write and commonly result in syntax errors. If you're parsing a common - log format we recommend using one of VRL's [`parse_*` functions](\(urls.vrl_functions)#parsing). If + log format we recommend using one of VRL's [`parse_*` functions](\(urls.vrl_functions)/#parse-functions). If you don't see a function for your format please [request it](\(urls.new_feature_request)). Otherwise, use the [Rust regex tester](\(urls.regex_tester)) to test and correct your regular expression. """ diff --git a/docs/reference/remap/errors/102_non_boolean_if_expression_predicate.cue b/docs/cue/reference/remap/errors/102_non_boolean_if_expression_predicate.cue similarity index 90% rename from docs/reference/remap/errors/102_non_boolean_if_expression_predicate.cue rename to docs/cue/reference/remap/errors/102_non_boolean_if_expression_predicate.cue index 59e8a1dd0eea9..80930248a6fa4 100644 --- a/docs/reference/remap/errors/102_non_boolean_if_expression_predicate.cue +++ b/docs/cue/reference/remap/errors/102_non_boolean_if_expression_predicate.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "102": { title: "Non-boolean if expression predicate" description: """ - An [if expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) predicate doesn't + An [if expression](\(urls.vrl_expressions)#regular-expression) predicate doesn't evaluate to a Boolean. """ rationale: """ diff --git a/docs/reference/remap/errors/103_unhandled_assignment_runtime_error.cue b/docs/cue/reference/remap/errors/103_unhandled_assignment_runtime_error.cue similarity index 96% rename from docs/reference/remap/errors/103_unhandled_assignment_runtime_error.cue rename to docs/cue/reference/remap/errors/103_unhandled_assignment_runtime_error.cue index b28c71e82b716..28aaeeb008679 100644 --- a/docs/reference/remap/errors/103_unhandled_assignment_runtime_error.cue +++ b/docs/cue/reference/remap/errors/103_unhandled_assignment_runtime_error.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "103": { title: "Unhandled fallible assignment" description: """ - The right-hand side of this [assignment](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) + The right-hand side of this [assignment](\(urls.vrl_expressions)#regular-expression) is fallible (that is, it can produce a [runtime error](\(urls.vrl_runtime_errors))), but the error isn't [handled](\(urls.vrl_error_handling)). """ diff --git a/docs/reference/remap/errors/104_unnecessary_error_assignment.cue b/docs/cue/reference/remap/errors/104_unnecessary_error_assignment.cue similarity index 92% rename from docs/reference/remap/errors/104_unnecessary_error_assignment.cue rename to docs/cue/reference/remap/errors/104_unnecessary_error_assignment.cue index 5c5e58abeb7a5..a1651eb614ba7 100644 --- a/docs/reference/remap/errors/104_unnecessary_error_assignment.cue +++ b/docs/cue/reference/remap/errors/104_unnecessary_error_assignment.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "104": { title: "Unnecessary error assignment" description: """ - The left-hand side of an [assignment expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) + The left-hand side of an [assignment expression](\(urls.vrl_expressions)#regular-expression) needlessly handles errors even though the right-hand side _can't_ fail. """ rationale: """ diff --git a/docs/reference/remap/errors/105_undefined_function.cue b/docs/cue/reference/remap/errors/105_undefined_function.cue similarity index 79% rename from docs/reference/remap/errors/105_undefined_function.cue rename to docs/cue/reference/remap/errors/105_undefined_function.cue index f68decfde07af..8127dcfe80e07 100644 --- a/docs/reference/remap/errors/105_undefined_function.cue +++ b/docs/cue/reference/remap/errors/105_undefined_function.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "105": { title: "Undefined function" description: """ - A [function call expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) invokes an + A [function call expression](\(urls.vrl_expressions)#regular-expression) invokes an unknown function. """ resolution: """ diff --git a/docs/reference/remap/errors/106_function_argument_arity_mismatch.cue b/docs/cue/reference/remap/errors/106_function_argument_arity_mismatch.cue similarity index 80% rename from docs/reference/remap/errors/106_function_argument_arity_mismatch.cue rename to docs/cue/reference/remap/errors/106_function_argument_arity_mismatch.cue index 554a4ae4af216..9281c97eef2c4 100644 --- a/docs/reference/remap/errors/106_function_argument_arity_mismatch.cue +++ b/docs/cue/reference/remap/errors/106_function_argument_arity_mismatch.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "106": { title: "Function argument arity mismatch" description: """ - A [function call expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) invokes a + A [function call expression](\(urls.vrl_expressions)#regular-expression) invokes a function with too many arguments. """ resolution: """ diff --git a/docs/reference/remap/errors/107_required_function_argument_missing.cue b/docs/cue/reference/remap/errors/107_required_function_argument_missing.cue similarity index 80% rename from docs/reference/remap/errors/107_required_function_argument_missing.cue rename to docs/cue/reference/remap/errors/107_required_function_argument_missing.cue index d3c3f3cb14a2c..6a63e56478220 100644 --- a/docs/reference/remap/errors/107_required_function_argument_missing.cue +++ b/docs/cue/reference/remap/errors/107_required_function_argument_missing.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "107": { title: "Required function argument missing" description: """ - A [function call expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) fails to pass + A [function call expression](\(urls.vrl_expressions)#regular-expression) fails to pass a required argument. """ resolution: """ diff --git a/docs/reference/remap/errors/108_unknown_function_argument_keyword.cue b/docs/cue/reference/remap/errors/108_unknown_function_argument_keyword.cue similarity index 80% rename from docs/reference/remap/errors/108_unknown_function_argument_keyword.cue rename to docs/cue/reference/remap/errors/108_unknown_function_argument_keyword.cue index fdccc4e0bc267..56f50ebab05ed 100644 --- a/docs/reference/remap/errors/108_unknown_function_argument_keyword.cue +++ b/docs/cue/reference/remap/errors/108_unknown_function_argument_keyword.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "108": { title: "Unknown function argument keyword" description: """ - A [function call expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) passes an + A [function call expression](\(urls.vrl_expressions)#regular-expression) passes an unknown named argument. """ resolution: """ diff --git a/docs/reference/remap/errors/110_invalid_argument_type.cue b/docs/cue/reference/remap/errors/110_invalid_argument_type.cue similarity index 77% rename from docs/reference/remap/errors/110_invalid_argument_type.cue rename to docs/cue/reference/remap/errors/110_invalid_argument_type.cue index 05a9c95c7070b..ff0aef088c87b 100644 --- a/docs/reference/remap/errors/110_invalid_argument_type.cue +++ b/docs/cue/reference/remap/errors/110_invalid_argument_type.cue @@ -3,14 +3,14 @@ package metadata remap: errors: "110": { title: "Invalid argument type" description: """ - An argument passed to a [function call expression](\(urls.vrl_expressions)#\(remap.literals.regular_expression.anchor)) + An argument passed to a [function call expression](\(urls.vrl_expressions)#regular-expression) isn't a supported type. """ rationale: remap._fail_safe_blurb - resolution: #""" - You must guarantee the type of the variable by using the appropriate [type](\(urls.vrl_functions)#type) or - [coercion](\(urls.vrl_functions)#coerce) function. - """# + resolution: """ + You must guarantee the type of the variable by using the appropriate + [type](\(urls.vrl_functions)/#type-functions) or [coercion](\(urls.vrl_functions)/#coerce-functions) function. + """ examples: [...{ source: #""" diff --git a/docs/reference/remap/errors/203_unrecognized_token.cue b/docs/cue/reference/remap/errors/203_unrecognized_token.cue similarity index 100% rename from docs/reference/remap/errors/203_unrecognized_token.cue rename to docs/cue/reference/remap/errors/203_unrecognized_token.cue diff --git a/docs/reference/remap/errors/204_unrecognized_eof.cue b/docs/cue/reference/remap/errors/204_unrecognized_eof.cue similarity index 100% rename from docs/reference/remap/errors/204_unrecognized_eof.cue rename to docs/cue/reference/remap/errors/204_unrecognized_eof.cue diff --git a/docs/reference/remap/errors/205_reserved_keyword.cue b/docs/cue/reference/remap/errors/205_reserved_keyword.cue similarity index 100% rename from docs/reference/remap/errors/205_reserved_keyword.cue rename to docs/cue/reference/remap/errors/205_reserved_keyword.cue diff --git a/docs/reference/remap/errors/206_invalid_numeric_literal.cue b/docs/cue/reference/remap/errors/206_invalid_numeric_literal.cue similarity index 100% rename from docs/reference/remap/errors/206_invalid_numeric_literal.cue rename to docs/cue/reference/remap/errors/206_invalid_numeric_literal.cue diff --git a/docs/reference/remap/errors/207_invalid_string_literal.cue b/docs/cue/reference/remap/errors/207_invalid_string_literal.cue similarity index 100% rename from docs/reference/remap/errors/207_invalid_string_literal.cue rename to docs/cue/reference/remap/errors/207_invalid_string_literal.cue diff --git a/docs/reference/remap/errors/208_invalid_literal.cue b/docs/cue/reference/remap/errors/208_invalid_literal.cue similarity index 100% rename from docs/reference/remap/errors/208_invalid_literal.cue rename to docs/cue/reference/remap/errors/208_invalid_literal.cue diff --git a/docs/reference/remap/errors/209_invalid_escape_character.cue b/docs/cue/reference/remap/errors/209_invalid_escape_character.cue similarity index 100% rename from docs/reference/remap/errors/209_invalid_escape_character.cue rename to docs/cue/reference/remap/errors/209_invalid_escape_character.cue diff --git a/docs/reference/remap/errors/300_unexpected_type.cue b/docs/cue/reference/remap/errors/300_unexpected_type.cue similarity index 100% rename from docs/reference/remap/errors/300_unexpected_type.cue rename to docs/cue/reference/remap/errors/300_unexpected_type.cue diff --git a/docs/reference/remap/errors/301_type_coercion_error.cue b/docs/cue/reference/remap/errors/301_type_coercion_error.cue similarity index 100% rename from docs/reference/remap/errors/301_type_coercion_error.cue rename to docs/cue/reference/remap/errors/301_type_coercion_error.cue diff --git a/docs/reference/remap/errors/302_remainder_error.cue b/docs/cue/reference/remap/errors/302_remainder_error.cue similarity index 100% rename from docs/reference/remap/errors/302_remainder_error.cue rename to docs/cue/reference/remap/errors/302_remainder_error.cue diff --git a/docs/reference/remap/errors/303_multiplication_error.cue b/docs/cue/reference/remap/errors/303_multiplication_error.cue similarity index 73% rename from docs/reference/remap/errors/303_multiplication_error.cue rename to docs/cue/reference/remap/errors/303_multiplication_error.cue index be8043bafed7b..d7c0f556638cc 100644 --- a/docs/reference/remap/errors/303_multiplication_error.cue +++ b/docs/cue/reference/remap/errors/303_multiplication_error.cue @@ -1,6 +1,6 @@ package metadata remap: errors: "303": { - title: "Multiplation error" + title: "Multiplication error" description: "These types can't be multiplied together" } diff --git a/docs/reference/remap/errors/304_division_error.cue b/docs/cue/reference/remap/errors/304_division_error.cue similarity index 100% rename from docs/reference/remap/errors/304_division_error.cue rename to docs/cue/reference/remap/errors/304_division_error.cue diff --git a/docs/reference/remap/errors/305_divide_by_zero_error.cue b/docs/cue/reference/remap/errors/305_divide_by_zero_error.cue similarity index 98% rename from docs/reference/remap/errors/305_divide_by_zero_error.cue rename to docs/cue/reference/remap/errors/305_divide_by_zero_error.cue index ef759f6b552fb..124cf9880c3a0 100644 --- a/docs/reference/remap/errors/305_divide_by_zero_error.cue +++ b/docs/cue/reference/remap/errors/305_divide_by_zero_error.cue @@ -14,7 +14,7 @@ remap: errors: "305": { If you know that a value is necessarily zero, don't divide by it. If a value *could* be zero, capture the potential error thrown by the operation: - ```vrl + ```ruby result, err = 27 / .some_value if err != nil { # Handle error diff --git a/docs/reference/remap/errors/306_nan_float.cue b/docs/cue/reference/remap/errors/306_nan_float.cue similarity index 100% rename from docs/reference/remap/errors/306_nan_float.cue rename to docs/cue/reference/remap/errors/306_nan_float.cue diff --git a/docs/reference/remap/errors/307_addition_error.cue b/docs/cue/reference/remap/errors/307_addition_error.cue similarity index 100% rename from docs/reference/remap/errors/307_addition_error.cue rename to docs/cue/reference/remap/errors/307_addition_error.cue diff --git a/docs/reference/remap/errors/308_subtraction_error.cue b/docs/cue/reference/remap/errors/308_subtraction_error.cue similarity index 100% rename from docs/reference/remap/errors/308_subtraction_error.cue rename to docs/cue/reference/remap/errors/308_subtraction_error.cue diff --git a/docs/reference/remap/errors/309_or_error.cue b/docs/cue/reference/remap/errors/309_or_error.cue similarity index 100% rename from docs/reference/remap/errors/309_or_error.cue rename to docs/cue/reference/remap/errors/309_or_error.cue diff --git a/docs/reference/remap/errors/310_and_error.cue b/docs/cue/reference/remap/errors/310_and_error.cue similarity index 100% rename from docs/reference/remap/errors/310_and_error.cue rename to docs/cue/reference/remap/errors/310_and_error.cue diff --git a/docs/reference/remap/errors/311_greater_than_error.cue b/docs/cue/reference/remap/errors/311_greater_than_error.cue similarity index 100% rename from docs/reference/remap/errors/311_greater_than_error.cue rename to docs/cue/reference/remap/errors/311_greater_than_error.cue diff --git a/docs/reference/remap/errors/312_ge_error.cue b/docs/cue/reference/remap/errors/312_ge_error.cue similarity index 100% rename from docs/reference/remap/errors/312_ge_error.cue rename to docs/cue/reference/remap/errors/312_ge_error.cue diff --git a/docs/reference/remap/errors/313_less_than_error.cue b/docs/cue/reference/remap/errors/313_less_than_error.cue similarity index 100% rename from docs/reference/remap/errors/313_less_than_error.cue rename to docs/cue/reference/remap/errors/313_less_than_error.cue diff --git a/docs/reference/remap/errors/314_le_error.cue b/docs/cue/reference/remap/errors/314_le_error.cue similarity index 100% rename from docs/reference/remap/errors/314_le_error.cue rename to docs/cue/reference/remap/errors/314_le_error.cue diff --git a/docs/reference/remap/errors/400_unexpected_expression.cue b/docs/cue/reference/remap/errors/400_unexpected_expression.cue similarity index 100% rename from docs/reference/remap/errors/400_unexpected_expression.cue rename to docs/cue/reference/remap/errors/400_unexpected_expression.cue diff --git a/docs/reference/remap/errors/401_invalid_enum_variant.cue b/docs/cue/reference/remap/errors/401_invalid_enum_variant.cue similarity index 100% rename from docs/reference/remap/errors/401_invalid_enum_variant.cue rename to docs/cue/reference/remap/errors/401_invalid_enum_variant.cue diff --git a/docs/reference/remap/errors/402_expected_static_expression.cue b/docs/cue/reference/remap/errors/402_expected_static_expression.cue similarity index 100% rename from docs/reference/remap/errors/402_expected_static_expression.cue rename to docs/cue/reference/remap/errors/402_expected_static_expression.cue diff --git a/docs/reference/remap/errors/403_invalid_argument.cue b/docs/cue/reference/remap/errors/403_invalid_argument.cue similarity index 100% rename from docs/reference/remap/errors/403_invalid_argument.cue rename to docs/cue/reference/remap/errors/403_invalid_argument.cue diff --git a/docs/reference/remap/errors/601_invalid_timestamp.cue b/docs/cue/reference/remap/errors/601_invalid_timestamp.cue similarity index 86% rename from docs/reference/remap/errors/601_invalid_timestamp.cue rename to docs/cue/reference/remap/errors/601_invalid_timestamp.cue index 1c5ac3714729a..2427737f249da 100644 --- a/docs/reference/remap/errors/601_invalid_timestamp.cue +++ b/docs/cue/reference/remap/errors/601_invalid_timestamp.cue @@ -3,7 +3,7 @@ package metadata remap: errors: "601": { title: "Invalid timestamp" description: """ - The provided [timestamp literal](\(urls.vrl_expressions)#\(remap.literals.timestamp.anchor)) is properly + The provided [timestamp literal](\(urls.vrl_expressions)#timestamp) is properly formed (i.e. it uses `t'...'` syntax) but the timestamp doesn't adhere to [RFC 3339](\(urls.rfc_3339)) format. """ diff --git a/docs/reference/remap/errors/620_aborting_infallible_function.cue b/docs/cue/reference/remap/errors/620_aborting_infallible_function.cue similarity index 100% rename from docs/reference/remap/errors/620_aborting_infallible_function.cue rename to docs/cue/reference/remap/errors/620_aborting_infallible_function.cue diff --git a/docs/reference/remap/errors/630_fallible_argument.cue b/docs/cue/reference/remap/errors/630_fallible_argument.cue similarity index 100% rename from docs/reference/remap/errors/630_fallible_argument.cue rename to docs/cue/reference/remap/errors/630_fallible_argument.cue diff --git a/docs/reference/remap/errors/640_unnecessary_noop.cue b/docs/cue/reference/remap/errors/640_unnecessary_noop.cue similarity index 100% rename from docs/reference/remap/errors/640_unnecessary_noop.cue rename to docs/cue/reference/remap/errors/640_unnecessary_noop.cue diff --git a/docs/reference/remap/errors/650_chained_comparison_operators.cue b/docs/cue/reference/remap/errors/650_chained_comparison_operators.cue similarity index 100% rename from docs/reference/remap/errors/650_chained_comparison_operators.cue rename to docs/cue/reference/remap/errors/650_chained_comparison_operators.cue diff --git a/docs/reference/remap/errors/651_unnecessary_error_coalescing_operation.cue b/docs/cue/reference/remap/errors/651_unnecessary_error_coalescing_operation.cue similarity index 100% rename from docs/reference/remap/errors/651_unnecessary_error_coalescing_operation.cue rename to docs/cue/reference/remap/errors/651_unnecessary_error_coalescing_operation.cue diff --git a/docs/reference/remap/errors/652_merge_non_objects.cue b/docs/cue/reference/remap/errors/652_merge_non_objects.cue similarity index 100% rename from docs/reference/remap/errors/652_merge_non_objects.cue rename to docs/cue/reference/remap/errors/652_merge_non_objects.cue diff --git a/docs/reference/remap/errors/660_non_boolean_negation.cue b/docs/cue/reference/remap/errors/660_non_boolean_negation.cue similarity index 100% rename from docs/reference/remap/errors/660_non_boolean_negation.cue rename to docs/cue/reference/remap/errors/660_non_boolean_negation.cue diff --git a/docs/reference/remap/expressions.cue b/docs/cue/reference/remap/expressions.cue similarity index 100% rename from docs/reference/remap/expressions.cue rename to docs/cue/reference/remap/expressions.cue diff --git a/docs/reference/remap/expressions/abort.cue b/docs/cue/reference/remap/expressions/abort.cue similarity index 100% rename from docs/reference/remap/expressions/abort.cue rename to docs/cue/reference/remap/expressions/abort.cue diff --git a/docs/reference/remap/expressions/arithmetic.cue b/docs/cue/reference/remap/expressions/arithmetic.cue similarity index 100% rename from docs/reference/remap/expressions/arithmetic.cue rename to docs/cue/reference/remap/expressions/arithmetic.cue diff --git a/docs/reference/remap/expressions/assignment.cue b/docs/cue/reference/remap/expressions/assignment.cue similarity index 100% rename from docs/reference/remap/expressions/assignment.cue rename to docs/cue/reference/remap/expressions/assignment.cue diff --git a/docs/reference/remap/expressions/block.cue b/docs/cue/reference/remap/expressions/block.cue similarity index 100% rename from docs/reference/remap/expressions/block.cue rename to docs/cue/reference/remap/expressions/block.cue diff --git a/docs/reference/remap/expressions/coalesce.cue b/docs/cue/reference/remap/expressions/coalesce.cue similarity index 100% rename from docs/reference/remap/expressions/coalesce.cue rename to docs/cue/reference/remap/expressions/coalesce.cue diff --git a/docs/reference/remap/expressions/comparison.cue b/docs/cue/reference/remap/expressions/comparison.cue similarity index 100% rename from docs/reference/remap/expressions/comparison.cue rename to docs/cue/reference/remap/expressions/comparison.cue diff --git a/docs/reference/remap/expressions/function_call.cue b/docs/cue/reference/remap/expressions/function_call.cue similarity index 100% rename from docs/reference/remap/expressions/function_call.cue rename to docs/cue/reference/remap/expressions/function_call.cue diff --git a/docs/reference/remap/expressions/if.cue b/docs/cue/reference/remap/expressions/if.cue similarity index 100% rename from docs/reference/remap/expressions/if.cue rename to docs/cue/reference/remap/expressions/if.cue diff --git a/docs/reference/remap/expressions/index.cue b/docs/cue/reference/remap/expressions/index.cue similarity index 100% rename from docs/reference/remap/expressions/index.cue rename to docs/cue/reference/remap/expressions/index.cue diff --git a/docs/reference/remap/expressions/logical.cue b/docs/cue/reference/remap/expressions/logical.cue similarity index 100% rename from docs/reference/remap/expressions/logical.cue rename to docs/cue/reference/remap/expressions/logical.cue diff --git a/docs/reference/remap/expressions/path.cue b/docs/cue/reference/remap/expressions/path.cue similarity index 100% rename from docs/reference/remap/expressions/path.cue rename to docs/cue/reference/remap/expressions/path.cue diff --git a/docs/reference/remap/expressions/variable.cue b/docs/cue/reference/remap/expressions/variable.cue similarity index 100% rename from docs/reference/remap/expressions/variable.cue rename to docs/cue/reference/remap/expressions/variable.cue diff --git a/docs/reference/remap/features.cue b/docs/cue/reference/remap/features.cue similarity index 100% rename from docs/reference/remap/features.cue rename to docs/cue/reference/remap/features.cue diff --git a/docs/reference/remap/features/compilation.cue b/docs/cue/reference/remap/features/compilation.cue similarity index 86% rename from docs/reference/remap/features/compilation.cue rename to docs/cue/reference/remap/features/compilation.cue index 7d2a07a116bf9..83439a7104338 100644 --- a/docs/reference/remap/features/compilation.cue +++ b/docs/cue/reference/remap/features/compilation.cue @@ -17,7 +17,7 @@ remap: features: compilation: { fail_safety_checks: { title: "Fail safety checks" description: """ - At compile time, Vector performs [fail safety](#\(features.fail_safety.anchor)) checks to ensure that + At compile time, Vector performs [fail safety](#fail-safety) checks to ensure that all errors thrown by fallible functions are [handled](\(urls.vrl_error_handling)). If you fail to pass a string to the `parse_syslog` function, for example, the VRL compiler aborts and provides a helpful error message. Fail safety means that you need to make explicit decisions about how to handle potentially @@ -27,9 +27,9 @@ remap: features: compilation: { } type_safety_checks: { - title: "Type safety checks" + title: "Type safety checks" description: """ - At compile time, Vector performs [type safety](#\(features.type_safety.anchor)) checks to catch runtime + At compile time, Vector performs [type safety](#type-safety)) checks to catch runtime errors stemming from type mismatches, for example passing an integer to the `parse_syslog` function, which can only take a string. VRL essentially forces you to write programs around the assumption that every incoming event could be malformed, which provides a strong bulwark against both human error and diff --git a/docs/reference/remap/features/ergonomic_safety.cue b/docs/cue/reference/remap/features/ergonomic_safety.cue similarity index 84% rename from docs/reference/remap/features/ergonomic_safety.cue rename to docs/cue/reference/remap/features/ergonomic_safety.cue index c8484f0daa5d1..dd586b6d5a09e 100644 --- a/docs/reference/remap/features/ergonomic_safety.cue +++ b/docs/cue/reference/remap/features/ergonomic_safety.cue @@ -51,18 +51,19 @@ remap: features: ergonomic_safety: { """ } rate_limited_logging: { - title: "Rate-limited logging" + title: "Rate-limited logging" description: """ - The VRL `log` function implements rate limiting by default. This ensures that VRL programs invoking the - `log` method don't accidentally saturate I/O. + The VRL [`log`](\(urls.vrl_functions)#log) function implements rate limiting by default. This ensures + that VRL programs invoking the `log` method don't accidentally saturate I/O. """ } purpose_built: { - title: "Purpose built for observability" + title: "Purpose built for observability" description: """ VRL is laser focused on observability use cases and *only* those use cases. This makes many frustration- and complexity-producing constructs you find in other languages completely superfluous. - Functions like `parse_syslog` and `parse_key_value`, for example, make otherwise complex tasks simple + Functions like [`parse_syslog`](\(urls.vrl_functions)#parse_syslog) and + [`parse_key_value`](\(urls.vrl_functions)#parse_key_value), for example, make otherwise complex tasks simple and prevent the need for complex low-level constructs. """ } diff --git a/docs/reference/remap/features/fail_safety.cue b/docs/cue/reference/remap/features/fail_safety.cue similarity index 94% rename from docs/reference/remap/features/fail_safety.cue rename to docs/cue/reference/remap/features/fail_safety.cue index dd6713e5a792c..12c6cdab3f9dd 100644 --- a/docs/reference/remap/features/fail_safety.cue +++ b/docs/cue/reference/remap/features/fail_safety.cue @@ -1,5 +1,5 @@ remap: features: fail_safety: { - title: "Fail-safety" + title: "Fail safety" description: """ VRL programs are [fail safe](\(urls.fail_safe)), meaning that a VRL program won't compile unless all errors thrown by fallible functions are handled. This eliminates unexpected runtime errors that often plague production diff --git a/docs/reference/remap/features/quality_error_messages.cue b/docs/cue/reference/remap/features/high_quality_error_messages.cue similarity index 88% rename from docs/reference/remap/features/quality_error_messages.cue rename to docs/cue/reference/remap/features/high_quality_error_messages.cue index 8570b8a2a5262..32bebfb966e0c 100644 --- a/docs/reference/remap/features/quality_error_messages.cue +++ b/docs/cue/reference/remap/features/high_quality_error_messages.cue @@ -1,12 +1,12 @@ -remap: features: quality_error_messages: { - title: "Quality error messages" +remap: features: high_quality_error_messages: { + title: "High-quality error messages" description: """ VRL strives to provide high-quality, helpful error messages, streamling the development and iteration workflow around VRL programs. This VRL program, for example... - ```vrl + ```ruby .foo, err = upcase(.foo) ``` diff --git a/docs/reference/remap/features/logs_and_metrics.cue b/docs/cue/reference/remap/features/logs_and_metrics.cue similarity index 100% rename from docs/reference/remap/features/logs_and_metrics.cue rename to docs/cue/reference/remap/features/logs_and_metrics.cue diff --git a/docs/reference/remap/features/memory_safety.cue b/docs/cue/reference/remap/features/memory_safety.cue similarity index 100% rename from docs/reference/remap/features/memory_safety.cue rename to docs/cue/reference/remap/features/memory_safety.cue diff --git a/docs/reference/remap/features/native.cue b/docs/cue/reference/remap/features/native.cue similarity index 100% rename from docs/reference/remap/features/native.cue rename to docs/cue/reference/remap/features/native.cue diff --git a/docs/reference/remap/features/stateless.cue b/docs/cue/reference/remap/features/stateless.cue similarity index 100% rename from docs/reference/remap/features/stateless.cue rename to docs/cue/reference/remap/features/stateless.cue diff --git a/docs/reference/remap/features/type_safety.cue b/docs/cue/reference/remap/features/type_safety.cue similarity index 77% rename from docs/reference/remap/features/type_safety.cue rename to docs/cue/reference/remap/features/type_safety.cue index cadf5ad632bf8..e3669fb5042f0 100644 --- a/docs/reference/remap/features/type_safety.cue +++ b/docs/cue/reference/remap/features/type_safety.cue @@ -1,8 +1,8 @@ remap: features: type_safety: { - title: "Type-safety" + title: "Type safety" description: """ - VRL implements [_progressive_](#\(characteristics.progressive.anchor)) [type safety](\(urls.type_safety)), - erroring at [compilation-time](#\(features.compilation.anchor)) if a type mismatch is detected. + VRL implements [_progressive_ type safety](#progressive-type-safety), + erroring at [compilation-time](#compilation) if a type mismatch is detected. """ principles: { @@ -12,7 +12,7 @@ remap: features: type_safety: { characteristics: { progressive: { - title: "Progressive type-safety" + title: "Progressive type safety" description: """ VRL's type-safety is _progressive_, meaning it will implement type-safety for any value for which it knows the type. Because observability data can be quite unpredictable, it's not always known which @@ -20,7 +20,7 @@ remap: features: type_safety: { evaluated, type information is built up and used at compile-time to enforce type-safety. Let's look at an example: - ```vrl + ```ruby .foo # any .foo = downcase!(.foo) # string .foo = upcase(.foo) # string @@ -29,8 +29,8 @@ remap: features: type_safety: { Breaking down the above: 1. The `.foo` field starts off as an `any` type (AKA unknown). - 2. The call to the `downcase!` function requires error handling (`!`) since VRL cannot guarantee that - `.foo` is a string (the only type supported by `downcase`). + 2. The call to the [`downcase!`](\(urls.vrl_functions)/#downcase) function requires error handling (`!`) + since VRL cannot guarantee that `.foo` is a string (the only type supported by `downcase`). 3. Afterwards, assuming the `downcase` invocation is successful, VRL knows that `.foo` is a string, since `downcase` can only return strings. 4. Finally, the call to `upcase` does not require error handling (`!`) since VRL knows that `.foo` is a @@ -39,7 +39,7 @@ remap: features: type_safety: { To avoid error handling for argument errors, you can specify the types of your fields at the top of your VRL script: - ```vrl + ```ruby .foo = string!(.foo) # string .foo = downcase(.foo) # string diff --git a/docs/reference/remap/functions.cue b/docs/cue/reference/remap/functions.cue similarity index 70% rename from docs/reference/remap/functions.cue rename to docs/cue/reference/remap/functions.cue index 0c838d86f12f5..37ee54344b908 100644 --- a/docs/reference/remap/functions.cue +++ b/docs/cue/reference/remap/functions.cue @@ -29,6 +29,28 @@ remap: { #FunctionCategory: "Array" | "Codec" | "Coerce" | "Convert" | "Debug" | "Enumerate" | "Event" | "Hash" | "IP" | "Number" | "Object" | "Parse" | "Random" | "String" | "System" | "Timestamp" | "Type" + // A helper array for generating docs. At some point, we should generate this from the + // #FunctionCategory enum if CUE adds support for that. + function_categories: [ + "Array", + "Codec", + "Coerce", + "Convert", + "Debug", + "Enumerate", + "Event", + "Hash", + "IP", + "Number", + "Object", + "Parse", + "Random", + "String", + "System", + "Timestamp", + "Type", + ] + functions: [Name=string]: #Function & { name: Name } diff --git a/docs/reference/remap/functions/append.cue b/docs/cue/reference/remap/functions/append.cue similarity index 100% rename from docs/reference/remap/functions/append.cue rename to docs/cue/reference/remap/functions/append.cue diff --git a/docs/reference/remap/functions/array.cue b/docs/cue/reference/remap/functions/array.cue similarity index 100% rename from docs/reference/remap/functions/array.cue rename to docs/cue/reference/remap/functions/array.cue diff --git a/docs/reference/remap/functions/assert.cue b/docs/cue/reference/remap/functions/assert.cue similarity index 100% rename from docs/reference/remap/functions/assert.cue rename to docs/cue/reference/remap/functions/assert.cue diff --git a/docs/reference/remap/functions/bool.cue b/docs/cue/reference/remap/functions/bool.cue similarity index 100% rename from docs/reference/remap/functions/bool.cue rename to docs/cue/reference/remap/functions/bool.cue diff --git a/docs/reference/remap/functions/ceil.cue b/docs/cue/reference/remap/functions/ceil.cue similarity index 100% rename from docs/reference/remap/functions/ceil.cue rename to docs/cue/reference/remap/functions/ceil.cue diff --git a/docs/reference/remap/functions/compact.cue b/docs/cue/reference/remap/functions/compact.cue similarity index 100% rename from docs/reference/remap/functions/compact.cue rename to docs/cue/reference/remap/functions/compact.cue diff --git a/docs/reference/remap/functions/contains.cue b/docs/cue/reference/remap/functions/contains.cue similarity index 100% rename from docs/reference/remap/functions/contains.cue rename to docs/cue/reference/remap/functions/contains.cue diff --git a/docs/reference/remap/functions/decode_base64.cue b/docs/cue/reference/remap/functions/decode_base64.cue similarity index 100% rename from docs/reference/remap/functions/decode_base64.cue rename to docs/cue/reference/remap/functions/decode_base64.cue diff --git a/docs/reference/remap/functions/decode_percent.cue b/docs/cue/reference/remap/functions/decode_percent.cue similarity index 87% rename from docs/reference/remap/functions/decode_percent.cue rename to docs/cue/reference/remap/functions/decode_percent.cue index 9ab0a76b77e20..9c355792e1676 100644 --- a/docs/reference/remap/functions/decode_percent.cue +++ b/docs/cue/reference/remap/functions/decode_percent.cue @@ -3,7 +3,7 @@ package metadata remap: functions: decode_percent: { category: "Codec" description: """ - Decodes a [percent encoded](\(urls.percent_encoded_bytes)) `value` like a URL. + Decodes a [percent-encoded](\(urls.percent_encoded_bytes)) `value` like a URL. """ arguments: [ diff --git a/docs/reference/remap/functions/del.cue b/docs/cue/reference/remap/functions/del.cue similarity index 100% rename from docs/reference/remap/functions/del.cue rename to docs/cue/reference/remap/functions/del.cue diff --git a/docs/reference/remap/functions/downcase.cue b/docs/cue/reference/remap/functions/downcase.cue similarity index 100% rename from docs/reference/remap/functions/downcase.cue rename to docs/cue/reference/remap/functions/downcase.cue diff --git a/docs/reference/remap/functions/encode_base64.cue b/docs/cue/reference/remap/functions/encode_base64.cue similarity index 100% rename from docs/reference/remap/functions/encode_base64.cue rename to docs/cue/reference/remap/functions/encode_base64.cue diff --git a/docs/reference/remap/functions/encode_json.cue b/docs/cue/reference/remap/functions/encode_json.cue similarity index 100% rename from docs/reference/remap/functions/encode_json.cue rename to docs/cue/reference/remap/functions/encode_json.cue diff --git a/docs/reference/remap/functions/encode_key_value.cue b/docs/cue/reference/remap/functions/encode_key_value.cue similarity index 98% rename from docs/reference/remap/functions/encode_key_value.cue rename to docs/cue/reference/remap/functions/encode_key_value.cue index 09e9e9b24e05b..1083e8ee7f152 100644 --- a/docs/reference/remap/functions/encode_key_value.cue +++ b/docs/cue/reference/remap/functions/encode_key_value.cue @@ -1,11 +1,11 @@ package metadata remap: functions: encode_key_value: { - category: "Codec" - description: #""" + category: "Codec" + description: """ Encodes the `value` to in key/value format with customizable delimiters. Default delimiters match the [logfmt](\(urls.logfmt)) format. - """# + """ notices: [ """ If `fields_ordering` is specified then the function is fallible else it is infallible. diff --git a/docs/reference/remap/functions/encode_logfmt.cue b/docs/cue/reference/remap/functions/encode_logfmt.cue similarity index 95% rename from docs/reference/remap/functions/encode_logfmt.cue rename to docs/cue/reference/remap/functions/encode_logfmt.cue index 4bec78456e198..7cf5132981325 100644 --- a/docs/reference/remap/functions/encode_logfmt.cue +++ b/docs/cue/reference/remap/functions/encode_logfmt.cue @@ -2,9 +2,9 @@ package metadata remap: functions: encode_logfmt: { category: "Codec" - description: #""" - Encodes the `value` to [logfmt](\#(urls.logfmt)). - """# + description: """ + Encodes the `value` to [logfmt](\(urls.logfmt)). + """ notices: functions.encode_key_value.notices arguments: [ diff --git a/docs/reference/remap/functions/encode_percent.cue b/docs/cue/reference/remap/functions/encode_percent.cue similarity index 100% rename from docs/reference/remap/functions/encode_percent.cue rename to docs/cue/reference/remap/functions/encode_percent.cue diff --git a/docs/reference/remap/functions/ends_with.cue b/docs/cue/reference/remap/functions/ends_with.cue similarity index 100% rename from docs/reference/remap/functions/ends_with.cue rename to docs/cue/reference/remap/functions/ends_with.cue diff --git a/docs/reference/remap/functions/exists.cue b/docs/cue/reference/remap/functions/exists.cue similarity index 100% rename from docs/reference/remap/functions/exists.cue rename to docs/cue/reference/remap/functions/exists.cue diff --git a/docs/reference/remap/functions/flatten.cue b/docs/cue/reference/remap/functions/flatten.cue similarity index 100% rename from docs/reference/remap/functions/flatten.cue rename to docs/cue/reference/remap/functions/flatten.cue diff --git a/docs/reference/remap/functions/float.cue b/docs/cue/reference/remap/functions/float.cue similarity index 100% rename from docs/reference/remap/functions/float.cue rename to docs/cue/reference/remap/functions/float.cue diff --git a/docs/reference/remap/functions/floor.cue b/docs/cue/reference/remap/functions/floor.cue similarity index 100% rename from docs/reference/remap/functions/floor.cue rename to docs/cue/reference/remap/functions/floor.cue diff --git a/docs/reference/remap/functions/format_int.cue b/docs/cue/reference/remap/functions/format_int.cue similarity index 100% rename from docs/reference/remap/functions/format_int.cue rename to docs/cue/reference/remap/functions/format_int.cue diff --git a/docs/reference/remap/functions/format_number.cue b/docs/cue/reference/remap/functions/format_number.cue similarity index 100% rename from docs/reference/remap/functions/format_number.cue rename to docs/cue/reference/remap/functions/format_number.cue diff --git a/docs/reference/remap/functions/format_timestamp.cue b/docs/cue/reference/remap/functions/format_timestamp.cue similarity index 100% rename from docs/reference/remap/functions/format_timestamp.cue rename to docs/cue/reference/remap/functions/format_timestamp.cue diff --git a/docs/reference/remap/functions/get_env_var.cue b/docs/cue/reference/remap/functions/get_env_var.cue similarity index 100% rename from docs/reference/remap/functions/get_env_var.cue rename to docs/cue/reference/remap/functions/get_env_var.cue diff --git a/docs/reference/remap/functions/get_hostname.cue b/docs/cue/reference/remap/functions/get_hostname.cue similarity index 100% rename from docs/reference/remap/functions/get_hostname.cue rename to docs/cue/reference/remap/functions/get_hostname.cue diff --git a/docs/reference/remap/functions/includes.cue b/docs/cue/reference/remap/functions/includes.cue similarity index 100% rename from docs/reference/remap/functions/includes.cue rename to docs/cue/reference/remap/functions/includes.cue diff --git a/docs/reference/remap/functions/int.cue b/docs/cue/reference/remap/functions/int.cue similarity index 100% rename from docs/reference/remap/functions/int.cue rename to docs/cue/reference/remap/functions/int.cue diff --git a/docs/reference/remap/functions/ip_aton.cue b/docs/cue/reference/remap/functions/ip_aton.cue similarity index 100% rename from docs/reference/remap/functions/ip_aton.cue rename to docs/cue/reference/remap/functions/ip_aton.cue diff --git a/docs/reference/remap/functions/ip_cidr_contains.cue b/docs/cue/reference/remap/functions/ip_cidr_contains.cue similarity index 100% rename from docs/reference/remap/functions/ip_cidr_contains.cue rename to docs/cue/reference/remap/functions/ip_cidr_contains.cue diff --git a/docs/reference/remap/functions/ip_ntoa.cue b/docs/cue/reference/remap/functions/ip_ntoa.cue similarity index 100% rename from docs/reference/remap/functions/ip_ntoa.cue rename to docs/cue/reference/remap/functions/ip_ntoa.cue diff --git a/docs/reference/remap/functions/ip_subnet.cue b/docs/cue/reference/remap/functions/ip_subnet.cue similarity index 100% rename from docs/reference/remap/functions/ip_subnet.cue rename to docs/cue/reference/remap/functions/ip_subnet.cue diff --git a/docs/reference/remap/functions/ip_to_ipv6.cue b/docs/cue/reference/remap/functions/ip_to_ipv6.cue similarity index 100% rename from docs/reference/remap/functions/ip_to_ipv6.cue rename to docs/cue/reference/remap/functions/ip_to_ipv6.cue diff --git a/docs/reference/remap/functions/ipv6_to_ipv4.cue b/docs/cue/reference/remap/functions/ipv6_to_ipv4.cue similarity index 100% rename from docs/reference/remap/functions/ipv6_to_ipv4.cue rename to docs/cue/reference/remap/functions/ipv6_to_ipv4.cue diff --git a/docs/reference/remap/functions/is_array.cue b/docs/cue/reference/remap/functions/is_array.cue similarity index 100% rename from docs/reference/remap/functions/is_array.cue rename to docs/cue/reference/remap/functions/is_array.cue diff --git a/docs/reference/remap/functions/is_boolean.cue b/docs/cue/reference/remap/functions/is_boolean.cue similarity index 100% rename from docs/reference/remap/functions/is_boolean.cue rename to docs/cue/reference/remap/functions/is_boolean.cue diff --git a/docs/reference/remap/functions/is_float.cue b/docs/cue/reference/remap/functions/is_float.cue similarity index 100% rename from docs/reference/remap/functions/is_float.cue rename to docs/cue/reference/remap/functions/is_float.cue diff --git a/docs/reference/remap/functions/is_integer.cue b/docs/cue/reference/remap/functions/is_integer.cue similarity index 100% rename from docs/reference/remap/functions/is_integer.cue rename to docs/cue/reference/remap/functions/is_integer.cue diff --git a/docs/reference/remap/functions/is_null.cue b/docs/cue/reference/remap/functions/is_null.cue similarity index 100% rename from docs/reference/remap/functions/is_null.cue rename to docs/cue/reference/remap/functions/is_null.cue diff --git a/docs/reference/remap/functions/is_nullish.cue b/docs/cue/reference/remap/functions/is_nullish.cue similarity index 100% rename from docs/reference/remap/functions/is_nullish.cue rename to docs/cue/reference/remap/functions/is_nullish.cue diff --git a/docs/reference/remap/functions/is_object.cue b/docs/cue/reference/remap/functions/is_object.cue similarity index 100% rename from docs/reference/remap/functions/is_object.cue rename to docs/cue/reference/remap/functions/is_object.cue diff --git a/docs/reference/remap/functions/is_regex.cue b/docs/cue/reference/remap/functions/is_regex.cue similarity index 100% rename from docs/reference/remap/functions/is_regex.cue rename to docs/cue/reference/remap/functions/is_regex.cue diff --git a/docs/reference/remap/functions/is_string.cue b/docs/cue/reference/remap/functions/is_string.cue similarity index 100% rename from docs/reference/remap/functions/is_string.cue rename to docs/cue/reference/remap/functions/is_string.cue diff --git a/docs/reference/remap/functions/is_timestamp.cue b/docs/cue/reference/remap/functions/is_timestamp.cue similarity index 100% rename from docs/reference/remap/functions/is_timestamp.cue rename to docs/cue/reference/remap/functions/is_timestamp.cue diff --git a/docs/reference/remap/functions/join.cue b/docs/cue/reference/remap/functions/join.cue similarity index 100% rename from docs/reference/remap/functions/join.cue rename to docs/cue/reference/remap/functions/join.cue diff --git a/docs/reference/remap/functions/length.cue b/docs/cue/reference/remap/functions/length.cue similarity index 100% rename from docs/reference/remap/functions/length.cue rename to docs/cue/reference/remap/functions/length.cue diff --git a/docs/reference/remap/functions/log.cue b/docs/cue/reference/remap/functions/log.cue similarity index 100% rename from docs/reference/remap/functions/log.cue rename to docs/cue/reference/remap/functions/log.cue diff --git a/docs/reference/remap/functions/match.cue b/docs/cue/reference/remap/functions/match.cue similarity index 100% rename from docs/reference/remap/functions/match.cue rename to docs/cue/reference/remap/functions/match.cue diff --git a/docs/reference/remap/functions/match_any.cue b/docs/cue/reference/remap/functions/match_any.cue similarity index 100% rename from docs/reference/remap/functions/match_any.cue rename to docs/cue/reference/remap/functions/match_any.cue diff --git a/docs/reference/remap/functions/match_array.cue b/docs/cue/reference/remap/functions/match_array.cue similarity index 100% rename from docs/reference/remap/functions/match_array.cue rename to docs/cue/reference/remap/functions/match_array.cue diff --git a/docs/reference/remap/functions/md5.cue b/docs/cue/reference/remap/functions/md5.cue similarity index 100% rename from docs/reference/remap/functions/md5.cue rename to docs/cue/reference/remap/functions/md5.cue diff --git a/docs/reference/remap/functions/merge.cue b/docs/cue/reference/remap/functions/merge.cue similarity index 100% rename from docs/reference/remap/functions/merge.cue rename to docs/cue/reference/remap/functions/merge.cue diff --git a/docs/reference/remap/functions/now.cue b/docs/cue/reference/remap/functions/now.cue similarity index 100% rename from docs/reference/remap/functions/now.cue rename to docs/cue/reference/remap/functions/now.cue diff --git a/docs/reference/remap/functions/object.cue b/docs/cue/reference/remap/functions/object.cue similarity index 100% rename from docs/reference/remap/functions/object.cue rename to docs/cue/reference/remap/functions/object.cue diff --git a/docs/reference/remap/functions/parse_apache_log.cue b/docs/cue/reference/remap/functions/parse_apache_log.cue similarity index 100% rename from docs/reference/remap/functions/parse_apache_log.cue rename to docs/cue/reference/remap/functions/parse_apache_log.cue diff --git a/docs/reference/remap/functions/parse_aws_alb_log.cue b/docs/cue/reference/remap/functions/parse_aws_alb_log.cue similarity index 100% rename from docs/reference/remap/functions/parse_aws_alb_log.cue rename to docs/cue/reference/remap/functions/parse_aws_alb_log.cue diff --git a/docs/reference/remap/functions/parse_aws_cloudwatch_log_subscription_message.cue b/docs/cue/reference/remap/functions/parse_aws_cloudwatch_log_subscription_message.cue similarity index 100% rename from docs/reference/remap/functions/parse_aws_cloudwatch_log_subscription_message.cue rename to docs/cue/reference/remap/functions/parse_aws_cloudwatch_log_subscription_message.cue diff --git a/docs/reference/remap/functions/parse_aws_vpc_flow_log.cue b/docs/cue/reference/remap/functions/parse_aws_vpc_flow_log.cue similarity index 100% rename from docs/reference/remap/functions/parse_aws_vpc_flow_log.cue rename to docs/cue/reference/remap/functions/parse_aws_vpc_flow_log.cue diff --git a/docs/reference/remap/functions/parse_common_log.cue b/docs/cue/reference/remap/functions/parse_common_log.cue similarity index 93% rename from docs/reference/remap/functions/parse_common_log.cue rename to docs/cue/reference/remap/functions/parse_common_log.cue index 3f4c7055994ad..9b489360d0a40 100644 --- a/docs/reference/remap/functions/parse_common_log.cue +++ b/docs/cue/reference/remap/functions/parse_common_log.cue @@ -1,9 +1,9 @@ package metadata remap: functions: parse_common_log: { - category: "Parse" + category: "Parse" description: """ - Parses the `value` using the [Common Log Format](https://httpd.apache.org/docs/1.3/logs.html#common) (CLF). + Parses the `value` using the [Common Log Format](\(urls.apache_common)) (CLF). """ notices: [ """ diff --git a/docs/reference/remap/functions/parse_csv.cue b/docs/cue/reference/remap/functions/parse_csv.cue similarity index 100% rename from docs/reference/remap/functions/parse_csv.cue rename to docs/cue/reference/remap/functions/parse_csv.cue diff --git a/docs/reference/remap/functions/parse_duration.cue b/docs/cue/reference/remap/functions/parse_duration.cue similarity index 100% rename from docs/reference/remap/functions/parse_duration.cue rename to docs/cue/reference/remap/functions/parse_duration.cue diff --git a/docs/reference/remap/functions/parse_glog.cue b/docs/cue/reference/remap/functions/parse_glog.cue similarity index 100% rename from docs/reference/remap/functions/parse_glog.cue rename to docs/cue/reference/remap/functions/parse_glog.cue diff --git a/docs/reference/remap/functions/parse_grok.cue b/docs/cue/reference/remap/functions/parse_grok.cue similarity index 100% rename from docs/reference/remap/functions/parse_grok.cue rename to docs/cue/reference/remap/functions/parse_grok.cue diff --git a/docs/reference/remap/functions/parse_int.cue b/docs/cue/reference/remap/functions/parse_int.cue similarity index 100% rename from docs/reference/remap/functions/parse_int.cue rename to docs/cue/reference/remap/functions/parse_int.cue diff --git a/docs/reference/remap/functions/parse_json.cue b/docs/cue/reference/remap/functions/parse_json.cue similarity index 100% rename from docs/reference/remap/functions/parse_json.cue rename to docs/cue/reference/remap/functions/parse_json.cue diff --git a/docs/reference/remap/functions/parse_key_value.cue b/docs/cue/reference/remap/functions/parse_key_value.cue similarity index 97% rename from docs/reference/remap/functions/parse_key_value.cue rename to docs/cue/reference/remap/functions/parse_key_value.cue index 80e8db879f98b..336bc197e4834 100644 --- a/docs/reference/remap/functions/parse_key_value.cue +++ b/docs/cue/reference/remap/functions/parse_key_value.cue @@ -1,13 +1,13 @@ package metadata remap: functions: parse_key_value: { - category: "Parse" - description: #""" + category: "Parse" + description: """ Parses the `value` in key/value format. Also known as [logfmt](\(urls.logfmt)). * Keys and values can be wrapped with `"`. - * `"` characters can be escaped using `\`. - """# + * `"` characters can be escaped using `\\`. + """ notices: [ """ All values are returned as strings. We recommend manually coercing values to desired types as you see fit. diff --git a/docs/reference/remap/functions/parse_klog.cue b/docs/cue/reference/remap/functions/parse_klog.cue similarity index 100% rename from docs/reference/remap/functions/parse_klog.cue rename to docs/cue/reference/remap/functions/parse_klog.cue diff --git a/docs/reference/remap/functions/parse_linux_authorization.cue b/docs/cue/reference/remap/functions/parse_linux_authorization.cue similarity index 84% rename from docs/reference/remap/functions/parse_linux_authorization.cue rename to docs/cue/reference/remap/functions/parse_linux_authorization.cue index c041a241c626d..b4955d8a40784 100644 --- a/docs/reference/remap/functions/parse_linux_authorization.cue +++ b/docs/cue/reference/remap/functions/parse_linux_authorization.cue @@ -3,8 +3,8 @@ package metadata remap: functions: parse_linux_authorization: { category: "Parse" description: """ - Parses Linux authorization logs usually found under either /var/log/auth.log (for Debian based systems) or under /var/log/secure (for RedHat based system). - according to [Syslog](\(urls.syslog)) format. + Parses Linux authorization logs usually found under either `/var/log/auth.log` (for Debian-based systems) or + `/var/log/secure` (for RedHat-based systems) according to [Syslog](\(urls.syslog)) format. """ notices: [ """ diff --git a/docs/reference/remap/functions/parse_logfmt.cue b/docs/cue/reference/remap/functions/parse_logfmt.cue similarity index 69% rename from docs/reference/remap/functions/parse_logfmt.cue rename to docs/cue/reference/remap/functions/parse_logfmt.cue index a6101726588b7..eb9998260966e 100644 --- a/docs/reference/remap/functions/parse_logfmt.cue +++ b/docs/cue/reference/remap/functions/parse_logfmt.cue @@ -2,13 +2,14 @@ package metadata remap: functions: parse_logfmt: { category: "Parse" - description: #""" - Parses the `value` in [logfmt](\#(urls.logfmt)). + description: """ + Parses the `value` in [logfmt](\(urls.logfmt)). - * Keys and values can be wrapped with `"`. - * `"` characters can be escaped by `\`. - * As per this [logfmt specification](\#(urls.logfmt_specs)) standlone key are accepted and will be associated with the boolean value `true`. - """# + * Keys and values can be wrapped using the `\"` character. + * `\"` characters can be escaped by the `\\` character. + * As per this [logfmt specification](\(urls.logfmt_specs)), the `parse_logfmt` function + accepts standalone keys and assigns them a Boolean value of `true`. + """ notices: functions.encode_key_value.notices arguments: [ @@ -20,7 +21,7 @@ remap: functions: parse_logfmt: { }, ] internal_failure_reasons: [ - "`value` is not a properly formatted key/value string", + "`value` isn't a properly formatted key/value string", ] return: types: ["object"] diff --git a/docs/reference/remap/functions/parse_nginx_log.cue b/docs/cue/reference/remap/functions/parse_nginx_log.cue similarity index 87% rename from docs/reference/remap/functions/parse_nginx_log.cue rename to docs/cue/reference/remap/functions/parse_nginx_log.cue index 6c74d3be0640d..8b9edc243062a 100644 --- a/docs/reference/remap/functions/parse_nginx_log.cue +++ b/docs/cue/reference/remap/functions/parse_nginx_log.cue @@ -19,14 +19,15 @@ remap: functions: parse_nginx_log: { type: ["string"] }, { - name: "timestamp_format" + name: "timestamp_format" description: """ - The [date/time format](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) to use for - encoding the timestamp. The time is parsed in local time if the timestamp doesn't specify a timezone. - The default %d/%b/%Y:%T %z format for the combined logs and %Y/%m/%d %H:%M:%S for the error logs. + + The [date/time format](\(urls.chrono_time_formats)) to use for encoding the timestamp. The time is parsed + in local time if the timestamp doesn't specify a timezone. The default format is `%d/%b/%Y:%T %z` for + combined logs and `%Y/%m/%d %H:%M:%S` for error logs. """ - required: false - default: "%d/%b/%Y:%T %z" + required: false + default: "%d/%b/%Y:%T %z" type: ["string"] }, { diff --git a/docs/reference/remap/functions/parse_query_string.cue b/docs/cue/reference/remap/functions/parse_query_string.cue similarity index 100% rename from docs/reference/remap/functions/parse_query_string.cue rename to docs/cue/reference/remap/functions/parse_query_string.cue diff --git a/docs/reference/remap/functions/parse_regex.cue b/docs/cue/reference/remap/functions/parse_regex.cue similarity index 100% rename from docs/reference/remap/functions/parse_regex.cue rename to docs/cue/reference/remap/functions/parse_regex.cue diff --git a/docs/reference/remap/functions/parse_regex_all.cue b/docs/cue/reference/remap/functions/parse_regex_all.cue similarity index 91% rename from docs/reference/remap/functions/parse_regex_all.cue rename to docs/cue/reference/remap/functions/parse_regex_all.cue index 4e03baacb55bc..30283949ab4a7 100644 --- a/docs/reference/remap/functions/parse_regex_all.cue +++ b/docs/cue/reference/remap/functions/parse_regex_all.cue @@ -25,8 +25,8 @@ remap: functions: parse_regex_all: { { name: "numeric_groups" description: """ - If true, the index of each group in the regular expression is also captured. The 0th index - will contain the whole match. + If `true`, the index of each group in the regular expression is also captured. The 0th index + contains the whole match. """ required: false default: false diff --git a/docs/reference/remap/functions/parse_ruby_hash.cue b/docs/cue/reference/remap/functions/parse_ruby_hash.cue similarity index 100% rename from docs/reference/remap/functions/parse_ruby_hash.cue rename to docs/cue/reference/remap/functions/parse_ruby_hash.cue diff --git a/docs/reference/remap/functions/parse_syslog.cue b/docs/cue/reference/remap/functions/parse_syslog.cue similarity index 100% rename from docs/reference/remap/functions/parse_syslog.cue rename to docs/cue/reference/remap/functions/parse_syslog.cue diff --git a/docs/reference/remap/functions/parse_timestamp.cue b/docs/cue/reference/remap/functions/parse_timestamp.cue similarity index 100% rename from docs/reference/remap/functions/parse_timestamp.cue rename to docs/cue/reference/remap/functions/parse_timestamp.cue diff --git a/docs/reference/remap/functions/parse_tokens.cue b/docs/cue/reference/remap/functions/parse_tokens.cue similarity index 100% rename from docs/reference/remap/functions/parse_tokens.cue rename to docs/cue/reference/remap/functions/parse_tokens.cue diff --git a/docs/reference/remap/functions/parse_url.cue b/docs/cue/reference/remap/functions/parse_url.cue similarity index 100% rename from docs/reference/remap/functions/parse_url.cue rename to docs/cue/reference/remap/functions/parse_url.cue diff --git a/docs/reference/remap/functions/parse_xml.cue b/docs/cue/reference/remap/functions/parse_xml.cue similarity index 100% rename from docs/reference/remap/functions/parse_xml.cue rename to docs/cue/reference/remap/functions/parse_xml.cue diff --git a/docs/reference/remap/functions/push.cue b/docs/cue/reference/remap/functions/push.cue similarity index 100% rename from docs/reference/remap/functions/push.cue rename to docs/cue/reference/remap/functions/push.cue diff --git a/docs/reference/remap/functions/redact.cue b/docs/cue/reference/remap/functions/redact.cue similarity index 65% rename from docs/reference/remap/functions/redact.cue rename to docs/cue/reference/remap/functions/redact.cue index d48c1a0df05b0..e9a63c9e39e43 100644 --- a/docs/reference/remap/functions/redact.cue +++ b/docs/cue/reference/remap/functions/redact.cue @@ -35,24 +35,24 @@ remap: functions: redact: { { name: "filters" description: #""" - List of filters to be applied to the `value`. + List of filters to be applied to the `value`. - Each filter can be specified in one of three ways: + Each filter can be specified in one of three ways: - - As a regular expression directly, which will be used to redact text matching it - - As an object with a `type` key that corresponds to a named filter and additional keys for customizing that filter - - As a named filter, if it has no required parameters + - As a regular expression directly, which will be used to redact text matching it + - As an object with a `type` key that corresponds to a named filter and additional keys for customizing that filter + - As a named filter, if it has no required parameters - Named filters are: + Named filters are: - - `pattern`: Redact text matching any regular expressions specified in the, required, `patterns` - key. This is the expanded form of just passing a regular expression as a filter. - - `us_social_security_number`: Redact US social security card numbers. + - `pattern`: Redact text matching any regular expressions specified in the, required, `patterns` + key. This is the expanded form of just passing a regular expression as a filter. + - `us_social_security_number`: Redact US social security card numbers. - See examples for more details. + See examples for more details. - This parameter must be a static expression. You cannot use variables or other dynamic expressions - with it. This allows us to validate the argument at compile-time to avoid runtime errors. + This parameter must be a static expression. You cannot use variables or other dynamic expressions + with it. This allows us to validate the argument at compile-time to avoid runtime errors. """# required: false type: ["array"] diff --git a/docs/reference/remap/functions/replace.cue b/docs/cue/reference/remap/functions/replace.cue similarity index 100% rename from docs/reference/remap/functions/replace.cue rename to docs/cue/reference/remap/functions/replace.cue diff --git a/docs/reference/remap/functions/round.cue b/docs/cue/reference/remap/functions/round.cue similarity index 100% rename from docs/reference/remap/functions/round.cue rename to docs/cue/reference/remap/functions/round.cue diff --git a/docs/reference/remap/functions/sha1.cue b/docs/cue/reference/remap/functions/sha1.cue similarity index 100% rename from docs/reference/remap/functions/sha1.cue rename to docs/cue/reference/remap/functions/sha1.cue diff --git a/docs/reference/remap/functions/sha2.cue b/docs/cue/reference/remap/functions/sha2.cue similarity index 100% rename from docs/reference/remap/functions/sha2.cue rename to docs/cue/reference/remap/functions/sha2.cue diff --git a/docs/reference/remap/functions/sha3.cue b/docs/cue/reference/remap/functions/sha3.cue similarity index 100% rename from docs/reference/remap/functions/sha3.cue rename to docs/cue/reference/remap/functions/sha3.cue diff --git a/docs/reference/remap/functions/slice.cue b/docs/cue/reference/remap/functions/slice.cue similarity index 100% rename from docs/reference/remap/functions/slice.cue rename to docs/cue/reference/remap/functions/slice.cue diff --git a/docs/reference/remap/functions/split.cue b/docs/cue/reference/remap/functions/split.cue similarity index 100% rename from docs/reference/remap/functions/split.cue rename to docs/cue/reference/remap/functions/split.cue diff --git a/docs/reference/remap/functions/starts_with.cue b/docs/cue/reference/remap/functions/starts_with.cue similarity index 100% rename from docs/reference/remap/functions/starts_with.cue rename to docs/cue/reference/remap/functions/starts_with.cue diff --git a/docs/reference/remap/functions/string.cue b/docs/cue/reference/remap/functions/string.cue similarity index 100% rename from docs/reference/remap/functions/string.cue rename to docs/cue/reference/remap/functions/string.cue diff --git a/docs/reference/remap/functions/strip_ansi_escape_codes.cue b/docs/cue/reference/remap/functions/strip_ansi_escape_codes.cue similarity index 100% rename from docs/reference/remap/functions/strip_ansi_escape_codes.cue rename to docs/cue/reference/remap/functions/strip_ansi_escape_codes.cue diff --git a/docs/reference/remap/functions/strip_whitespace.cue b/docs/cue/reference/remap/functions/strip_whitespace.cue similarity index 100% rename from docs/reference/remap/functions/strip_whitespace.cue rename to docs/cue/reference/remap/functions/strip_whitespace.cue diff --git a/docs/reference/remap/functions/tag_types_externally.cue b/docs/cue/reference/remap/functions/tag_types_externally.cue similarity index 100% rename from docs/reference/remap/functions/tag_types_externally.cue rename to docs/cue/reference/remap/functions/tag_types_externally.cue diff --git a/docs/reference/remap/functions/timestamp.cue b/docs/cue/reference/remap/functions/timestamp.cue similarity index 100% rename from docs/reference/remap/functions/timestamp.cue rename to docs/cue/reference/remap/functions/timestamp.cue diff --git a/docs/reference/remap/functions/to_bool.cue b/docs/cue/reference/remap/functions/to_bool.cue similarity index 100% rename from docs/reference/remap/functions/to_bool.cue rename to docs/cue/reference/remap/functions/to_bool.cue diff --git a/docs/reference/remap/functions/to_float.cue b/docs/cue/reference/remap/functions/to_float.cue similarity index 100% rename from docs/reference/remap/functions/to_float.cue rename to docs/cue/reference/remap/functions/to_float.cue diff --git a/docs/reference/remap/functions/to_int.cue b/docs/cue/reference/remap/functions/to_int.cue similarity index 100% rename from docs/reference/remap/functions/to_int.cue rename to docs/cue/reference/remap/functions/to_int.cue diff --git a/docs/reference/remap/functions/to_regex.cue b/docs/cue/reference/remap/functions/to_regex.cue similarity index 100% rename from docs/reference/remap/functions/to_regex.cue rename to docs/cue/reference/remap/functions/to_regex.cue diff --git a/docs/reference/remap/functions/to_string.cue b/docs/cue/reference/remap/functions/to_string.cue similarity index 100% rename from docs/reference/remap/functions/to_string.cue rename to docs/cue/reference/remap/functions/to_string.cue diff --git a/docs/reference/remap/functions/to_syslog_facility.cue b/docs/cue/reference/remap/functions/to_syslog_facility.cue similarity index 100% rename from docs/reference/remap/functions/to_syslog_facility.cue rename to docs/cue/reference/remap/functions/to_syslog_facility.cue diff --git a/docs/reference/remap/functions/to_syslog_level.cue b/docs/cue/reference/remap/functions/to_syslog_level.cue similarity index 92% rename from docs/reference/remap/functions/to_syslog_level.cue rename to docs/cue/reference/remap/functions/to_syslog_level.cue index 868fa6da3e1a6..c39f69e93d02c 100644 --- a/docs/reference/remap/functions/to_syslog_level.cue +++ b/docs/cue/reference/remap/functions/to_syslog_level.cue @@ -4,7 +4,7 @@ remap: functions: to_syslog_level: { category: "Convert" description: """ Converts the `value`, a Syslog [severity level](\(urls.syslog_levels)), into its corresponding keyword, - i.e. 0 into `"emerg"`, 1 into `"alert", etc. + i.e. 0 into `"emerg"`, 1 into `"alert"`, etc. """ arguments: [ diff --git a/docs/reference/remap/functions/to_syslog_severity.cue b/docs/cue/reference/remap/functions/to_syslog_severity.cue similarity index 100% rename from docs/reference/remap/functions/to_syslog_severity.cue rename to docs/cue/reference/remap/functions/to_syslog_severity.cue diff --git a/docs/reference/remap/functions/to_timestamp.cue b/docs/cue/reference/remap/functions/to_timestamp.cue similarity index 100% rename from docs/reference/remap/functions/to_timestamp.cue rename to docs/cue/reference/remap/functions/to_timestamp.cue diff --git a/docs/reference/remap/functions/to_unix_timestamp.cue b/docs/cue/reference/remap/functions/to_unix_timestamp.cue similarity index 100% rename from docs/reference/remap/functions/to_unix_timestamp.cue rename to docs/cue/reference/remap/functions/to_unix_timestamp.cue diff --git a/docs/reference/remap/functions/truncate.cue b/docs/cue/reference/remap/functions/truncate.cue similarity index 100% rename from docs/reference/remap/functions/truncate.cue rename to docs/cue/reference/remap/functions/truncate.cue diff --git a/docs/reference/remap/functions/upcase.cue b/docs/cue/reference/remap/functions/upcase.cue similarity index 100% rename from docs/reference/remap/functions/upcase.cue rename to docs/cue/reference/remap/functions/upcase.cue diff --git a/docs/reference/remap/functions/uuid_v4.cue b/docs/cue/reference/remap/functions/uuid_v4.cue similarity index 100% rename from docs/reference/remap/functions/uuid_v4.cue rename to docs/cue/reference/remap/functions/uuid_v4.cue diff --git a/docs/reference/remap/literals.cue b/docs/cue/reference/remap/literals.cue similarity index 91% rename from docs/reference/remap/literals.cue rename to docs/cue/reference/remap/literals.cue index 7e504e770a1db..b3a618a21f20c 100644 --- a/docs/reference/remap/literals.cue +++ b/docs/cue/reference/remap/literals.cue @@ -2,7 +2,6 @@ package metadata remap: { #Literal: { - anchor: name name: string title: string description: string diff --git a/docs/reference/remap/literals/array.cue b/docs/cue/reference/remap/literals/array.cue similarity index 87% rename from docs/reference/remap/literals/array.cue rename to docs/cue/reference/remap/literals/array.cue index 3fa31e6b85b93..4fc627af37882 100644 --- a/docs/reference/remap/literals/array.cue +++ b/docs/cue/reference/remap/literals/array.cue @@ -13,10 +13,10 @@ remap: literals: array: { #"[.field1, .field2, to_int!("2"), variable_1]"#, #""" [ - "expressions", - 1 + 2, - 2 == 5, - true || false + "expressions", + 1 + 2, + 2 == 5, + true || false ] """#, ] diff --git a/docs/reference/remap/literals/boolean.cue b/docs/cue/reference/remap/literals/boolean.cue similarity index 100% rename from docs/reference/remap/literals/boolean.cue rename to docs/cue/reference/remap/literals/boolean.cue diff --git a/docs/reference/remap/literals/float.cue b/docs/cue/reference/remap/literals/float.cue similarity index 100% rename from docs/reference/remap/literals/float.cue rename to docs/cue/reference/remap/literals/float.cue diff --git a/docs/reference/remap/literals/integer.cue b/docs/cue/reference/remap/literals/integer.cue similarity index 100% rename from docs/reference/remap/literals/integer.cue rename to docs/cue/reference/remap/literals/integer.cue diff --git a/docs/reference/remap/literals/null.cue b/docs/cue/reference/remap/literals/null.cue similarity index 100% rename from docs/reference/remap/literals/null.cue rename to docs/cue/reference/remap/literals/null.cue diff --git a/docs/reference/remap/literals/object.cue b/docs/cue/reference/remap/literals/object.cue similarity index 100% rename from docs/reference/remap/literals/object.cue rename to docs/cue/reference/remap/literals/object.cue diff --git a/docs/reference/remap/literals/regular_expression.cue b/docs/cue/reference/remap/literals/regular_expression.cue similarity index 99% rename from docs/reference/remap/literals/regular_expression.cue rename to docs/cue/reference/remap/literals/regular_expression.cue index 018d3c0e8161a..5264691aed353 100644 --- a/docs/reference/remap/literals/regular_expression.cue +++ b/docs/cue/reference/remap/literals/regular_expression.cue @@ -39,7 +39,7 @@ remap: literals: regular_expression: { Regular expressions support named capture groups, allowing extractions to be associated with keys. Named captures should be preceded with a `?P` declaraction. This regex, for example... - ```vrl + ```ruby r'(?P\d{4})-(?P\d{2})-(?P\d{2})' ``` diff --git a/docs/reference/remap/literals/string.cue b/docs/cue/reference/remap/literals/string.cue similarity index 100% rename from docs/reference/remap/literals/string.cue rename to docs/cue/reference/remap/literals/string.cue diff --git a/docs/reference/remap/literals/timestamp.cue b/docs/cue/reference/remap/literals/timestamp.cue similarity index 100% rename from docs/reference/remap/literals/timestamp.cue rename to docs/cue/reference/remap/literals/timestamp.cue diff --git a/docs/reference/remap/principles.cue b/docs/cue/reference/remap/principles.cue similarity index 100% rename from docs/reference/remap/principles.cue rename to docs/cue/reference/remap/principles.cue diff --git a/docs/reference/remap/principles/performance.cue b/docs/cue/reference/remap/principles/performance.cue similarity index 100% rename from docs/reference/remap/principles/performance.cue rename to docs/cue/reference/remap/principles/performance.cue diff --git a/docs/reference/remap/principles/safety.cue b/docs/cue/reference/remap/principles/safety.cue similarity index 100% rename from docs/reference/remap/principles/safety.cue rename to docs/cue/reference/remap/principles/safety.cue diff --git a/docs/reference/remap/syntax.cue b/docs/cue/reference/remap/syntax.cue similarity index 91% rename from docs/reference/remap/syntax.cue rename to docs/cue/reference/remap/syntax.cue index a8cbb7b4f77d2..fc90d3aeed045 100644 --- a/docs/reference/remap/syntax.cue +++ b/docs/cue/reference/remap/syntax.cue @@ -2,7 +2,6 @@ package metadata remap: { #Syntax: { - anchor: name name: string title: string description: string diff --git a/docs/reference/remap/syntax/comment.cue b/docs/cue/reference/remap/syntax/comment.cue similarity index 100% rename from docs/reference/remap/syntax/comment.cue rename to docs/cue/reference/remap/syntax/comment.cue diff --git a/docs/reference/remap/syntax/keywords.cue b/docs/cue/reference/remap/syntax/keywords.cue similarity index 100% rename from docs/reference/remap/syntax/keywords.cue rename to docs/cue/reference/remap/syntax/keywords.cue diff --git a/docs/reference/remap/syntax/whitespace.cue b/docs/cue/reference/remap/syntax/whitespace.cue similarity index 100% rename from docs/reference/remap/syntax/whitespace.cue rename to docs/cue/reference/remap/syntax/whitespace.cue diff --git a/docs/reference/services.cue b/docs/cue/reference/services.cue similarity index 100% rename from docs/reference/services.cue rename to docs/cue/reference/services.cue diff --git a/docs/reference/services/apache_http.cue b/docs/cue/reference/services/apache_http.cue similarity index 100% rename from docs/reference/services/apache_http.cue rename to docs/cue/reference/services/apache_http.cue diff --git a/docs/reference/services/aws_cloudwatch.cue b/docs/cue/reference/services/aws_cloudwatch.cue similarity index 100% rename from docs/reference/services/aws_cloudwatch.cue rename to docs/cue/reference/services/aws_cloudwatch.cue diff --git a/docs/reference/services/aws_cloudwatch_logs.cue b/docs/cue/reference/services/aws_cloudwatch_logs.cue similarity index 100% rename from docs/reference/services/aws_cloudwatch_logs.cue rename to docs/cue/reference/services/aws_cloudwatch_logs.cue diff --git a/docs/reference/services/aws_cloudwatch_metrics.cue b/docs/cue/reference/services/aws_cloudwatch_metrics.cue similarity index 100% rename from docs/reference/services/aws_cloudwatch_metrics.cue rename to docs/cue/reference/services/aws_cloudwatch_metrics.cue diff --git a/docs/reference/services/aws_ecs.cue b/docs/cue/reference/services/aws_ecs.cue similarity index 100% rename from docs/reference/services/aws_ecs.cue rename to docs/cue/reference/services/aws_ecs.cue diff --git a/docs/reference/services/aws_kinesis_data_streams.cue b/docs/cue/reference/services/aws_kinesis_data_streams.cue similarity index 100% rename from docs/reference/services/aws_kinesis_data_streams.cue rename to docs/cue/reference/services/aws_kinesis_data_streams.cue diff --git a/docs/reference/services/aws_kinesis_firehose.cue b/docs/cue/reference/services/aws_kinesis_firehose.cue similarity index 100% rename from docs/reference/services/aws_kinesis_firehose.cue rename to docs/cue/reference/services/aws_kinesis_firehose.cue diff --git a/docs/reference/services/aws_s3.cue b/docs/cue/reference/services/aws_s3.cue similarity index 100% rename from docs/reference/services/aws_s3.cue rename to docs/cue/reference/services/aws_s3.cue diff --git a/docs/reference/services/aws_sqs.cue b/docs/cue/reference/services/aws_sqs.cue similarity index 100% rename from docs/reference/services/aws_sqs.cue rename to docs/cue/reference/services/aws_sqs.cue diff --git a/docs/reference/services/azure_blob.cue b/docs/cue/reference/services/azure_blob.cue similarity index 100% rename from docs/reference/services/azure_blob.cue rename to docs/cue/reference/services/azure_blob.cue diff --git a/docs/reference/services/azure_monitor_logs.cue b/docs/cue/reference/services/azure_monitor_logs.cue similarity index 100% rename from docs/reference/services/azure_monitor_logs.cue rename to docs/cue/reference/services/azure_monitor_logs.cue diff --git a/docs/reference/services/clickhouse.cue b/docs/cue/reference/services/clickhouse.cue similarity index 100% rename from docs/reference/services/clickhouse.cue rename to docs/cue/reference/services/clickhouse.cue diff --git a/docs/reference/services/datadog.cue b/docs/cue/reference/services/datadog.cue similarity index 100% rename from docs/reference/services/datadog.cue rename to docs/cue/reference/services/datadog.cue diff --git a/docs/reference/services/datadog_events.cue b/docs/cue/reference/services/datadog_events.cue similarity index 100% rename from docs/reference/services/datadog_events.cue rename to docs/cue/reference/services/datadog_events.cue diff --git a/docs/reference/services/datadog_logs.cue b/docs/cue/reference/services/datadog_logs.cue similarity index 100% rename from docs/reference/services/datadog_logs.cue rename to docs/cue/reference/services/datadog_logs.cue diff --git a/docs/reference/services/datadog_metrics.cue b/docs/cue/reference/services/datadog_metrics.cue similarity index 100% rename from docs/reference/services/datadog_metrics.cue rename to docs/cue/reference/services/datadog_metrics.cue diff --git a/docs/reference/services/dnstap_data.cue b/docs/cue/reference/services/dnstap_data.cue similarity index 100% rename from docs/reference/services/dnstap_data.cue rename to docs/cue/reference/services/dnstap_data.cue diff --git a/docs/reference/services/docker.cue b/docs/cue/reference/services/docker.cue similarity index 100% rename from docs/reference/services/docker.cue rename to docs/cue/reference/services/docker.cue diff --git a/docs/reference/services/elasticsearch.cue b/docs/cue/reference/services/elasticsearch.cue similarity index 100% rename from docs/reference/services/elasticsearch.cue rename to docs/cue/reference/services/elasticsearch.cue diff --git a/docs/reference/services/eventstoredb_stats_client.cue b/docs/cue/reference/services/eventstoredb_stats_client.cue similarity index 100% rename from docs/reference/services/eventstoredb_stats_client.cue rename to docs/cue/reference/services/eventstoredb_stats_client.cue diff --git a/docs/reference/services/exec.cue b/docs/cue/reference/services/exec.cue similarity index 100% rename from docs/reference/services/exec.cue rename to docs/cue/reference/services/exec.cue diff --git a/docs/reference/services/files.cue b/docs/cue/reference/services/files.cue similarity index 100% rename from docs/reference/services/files.cue rename to docs/cue/reference/services/files.cue diff --git a/docs/reference/services/fluent.cue b/docs/cue/reference/services/fluent.cue similarity index 100% rename from docs/reference/services/fluent.cue rename to docs/cue/reference/services/fluent.cue diff --git a/docs/cue/reference/services/gcp_cloud_monitoring.cue b/docs/cue/reference/services/gcp_cloud_monitoring.cue new file mode 100644 index 0000000000000..7b46dcd2f20c8 --- /dev/null +++ b/docs/cue/reference/services/gcp_cloud_monitoring.cue @@ -0,0 +1,10 @@ +package metadata + +services: gcp_cloud_monitoring: { + name: "GCP Cloud (formerly Stackdriver) metrics" + thing: "a \(name) account" + url: urls.gcp_stackdriver_metrics + versions: null + + description: "[Stackdriver](\(urls.gcp_stackdriver)) is Google Cloud's embedded observability suite designed to monitor, troubleshoot, and improve cloud infrastructure, software and application performance. Stackdriver enables you to efficiently build and run workloads, keeping applications available and performing well." +} diff --git a/docs/cue/reference/services/gcp_cloud_storage.cue b/docs/cue/reference/services/gcp_cloud_storage.cue new file mode 100644 index 0000000000000..151f8930fb21b --- /dev/null +++ b/docs/cue/reference/services/gcp_cloud_storage.cue @@ -0,0 +1,10 @@ +package metadata + +services: gcp_cloud_storage: { + name: "GCP Cloud Storage" + thing: "a \(name) bucket" + url: urls.gcp_cloud_storage + versions: null + + description: "[Google Cloud Storage](\(urls.gcp_cloud_storage)) is a RESTful online file storage web service for storing and accessing data on Google Cloud Platform infrastructure. The service combines the performance and scalability of Google's cloud with advanced security and sharing capabilities. This makes it a prime candidate for log data." +} diff --git a/docs/cue/reference/services/gcp_operations_logs.cue b/docs/cue/reference/services/gcp_operations_logs.cue new file mode 100644 index 0000000000000..171b5b4d26ac2 --- /dev/null +++ b/docs/cue/reference/services/gcp_operations_logs.cue @@ -0,0 +1,10 @@ +package metadata + +services: gcp_operations_logs: { + name: "GCP Operations (formerly Stackdriver) logs" + thing: "a \(name) account" + url: urls.gcp_stackdriver_logging + versions: null + + description: "[Stackdriver](\(urls.gcp_stackdriver)) is Google Cloud's embedded observability suite designed to monitor, troubleshoot, and improve cloud infrastructure, software and application performance. Stackdriver enables you to efficiently build and run workloads, keeping applications available and performing well." +} diff --git a/docs/cue/reference/services/gcp_pubsub.cue b/docs/cue/reference/services/gcp_pubsub.cue new file mode 100644 index 0000000000000..c4bbc77d33cc7 --- /dev/null +++ b/docs/cue/reference/services/gcp_pubsub.cue @@ -0,0 +1,10 @@ +package metadata + +services: gcp_pubsub: { + name: "GCP PubSub" + thing: "a \(name) pipeline" + url: urls.gcp_pubsub + versions: null + + description: "[GCP Pub/Sub](\(urls.gcp_pubsub)) is a fully-managed real-time messaging service that allows you to send and receive messages between independent applications on the Google Cloud Platform." +} diff --git a/docs/reference/services/heroku.cue b/docs/cue/reference/services/heroku.cue similarity index 100% rename from docs/reference/services/heroku.cue rename to docs/cue/reference/services/heroku.cue diff --git a/docs/reference/services/honeycomb.cue b/docs/cue/reference/services/honeycomb.cue similarity index 100% rename from docs/reference/services/honeycomb.cue rename to docs/cue/reference/services/honeycomb.cue diff --git a/docs/reference/services/host.cue b/docs/cue/reference/services/host.cue similarity index 100% rename from docs/reference/services/host.cue rename to docs/cue/reference/services/host.cue diff --git a/docs/reference/services/http.cue b/docs/cue/reference/services/http.cue similarity index 100% rename from docs/reference/services/http.cue rename to docs/cue/reference/services/http.cue diff --git a/docs/cue/reference/services/humio.cue b/docs/cue/reference/services/humio.cue new file mode 100644 index 0000000000000..62b0370fc2db9 --- /dev/null +++ b/docs/cue/reference/services/humio.cue @@ -0,0 +1,10 @@ +package metadata + +services: humio: { + name: "Humio" + thing: "a \(name) database" + url: urls.humio + versions: null + + description: "[Humio](\(urls.humio)) is a time-series logging and aggregation platform for unrestricted, comprehensive event analysis, On-Premises or in the Cloud. With 1TB/day of raw log ingest/node, in-memory stream processing, and live, shareable dashboards and alerts, you can instantly and in real-time explore, monitor, and visualize any system’s data. Metrics are converted to log events via the metric_to_log transform." +} diff --git a/docs/reference/services/influxdb.cue b/docs/cue/reference/services/influxdb.cue similarity index 100% rename from docs/reference/services/influxdb.cue rename to docs/cue/reference/services/influxdb.cue diff --git a/docs/reference/services/journald.cue b/docs/cue/reference/services/journald.cue similarity index 100% rename from docs/reference/services/journald.cue rename to docs/cue/reference/services/journald.cue diff --git a/docs/reference/services/kafka.cue b/docs/cue/reference/services/kafka.cue similarity index 100% rename from docs/reference/services/kafka.cue rename to docs/cue/reference/services/kafka.cue diff --git a/docs/reference/services/kubernetes.cue b/docs/cue/reference/services/kubernetes.cue similarity index 100% rename from docs/reference/services/kubernetes.cue rename to docs/cue/reference/services/kubernetes.cue diff --git a/docs/reference/services/logdna.cue b/docs/cue/reference/services/logdna.cue similarity index 100% rename from docs/reference/services/logdna.cue rename to docs/cue/reference/services/logdna.cue diff --git a/docs/reference/services/logstash.cue b/docs/cue/reference/services/logstash.cue similarity index 100% rename from docs/reference/services/logstash.cue rename to docs/cue/reference/services/logstash.cue diff --git a/docs/cue/reference/services/loki.cue b/docs/cue/reference/services/loki.cue new file mode 100644 index 0000000000000..7e3102b466449 --- /dev/null +++ b/docs/cue/reference/services/loki.cue @@ -0,0 +1,10 @@ +package metadata + +services: loki: { + name: "Loki" + thing: "a \(name) database" + url: urls.loki + versions: null + + description: "[Loki](\(urls.loki)) is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by [Prometheus](\(urls.prometheus)). It is designed to be very cost effective and easy to operate. It does not index the contents of the logs, but rather a set of labels for each log stream." +} diff --git a/docs/cue/reference/services/mongodb.cue b/docs/cue/reference/services/mongodb.cue new file mode 100644 index 0000000000000..e1433a535a234 --- /dev/null +++ b/docs/cue/reference/services/mongodb.cue @@ -0,0 +1,10 @@ +package metadata + +services: mongodb: { + name: "MongoDB" + thing: "an \(name) instance" + url: urls.mongodb + versions: null + + description: "[MongoDB](\(urls.mongodb)) is a general purpose, document-based, distributed database built for modern application developers and for the cloud era." +} diff --git a/docs/reference/services/nats.cue b/docs/cue/reference/services/nats.cue similarity index 100% rename from docs/reference/services/nats.cue rename to docs/cue/reference/services/nats.cue diff --git a/docs/cue/reference/services/new_relic_logs.cue b/docs/cue/reference/services/new_relic_logs.cue new file mode 100644 index 0000000000000..2a2d76f637016 --- /dev/null +++ b/docs/cue/reference/services/new_relic_logs.cue @@ -0,0 +1,10 @@ +package metadata + +services: new_relic_logs: { + name: "New Relic logs" + thing: "a \(name) account" + url: urls.new_relic + versions: null + + description: "[New Relic](\(urls.new_relic)) is a San Francisco, California-based technology company which develops cloud-based software to help website and application owners track the performances of their services." +} diff --git a/docs/cue/reference/services/nginx.cue b/docs/cue/reference/services/nginx.cue new file mode 100644 index 0000000000000..6ffcb06123de3 --- /dev/null +++ b/docs/cue/reference/services/nginx.cue @@ -0,0 +1,10 @@ +package metadata + +services: nginx: { + name: "Nginx" + thing: "an \(name) server" + url: urls.nginx + versions: null + + description: "[Nginx](\(urls.nginx)) is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server." +} diff --git a/docs/reference/services/papertrail.cue b/docs/cue/reference/services/papertrail.cue similarity index 100% rename from docs/reference/services/papertrail.cue rename to docs/cue/reference/services/papertrail.cue diff --git a/docs/reference/services/prometheus.cue b/docs/cue/reference/services/prometheus.cue similarity index 100% rename from docs/reference/services/prometheus.cue rename to docs/cue/reference/services/prometheus.cue diff --git a/docs/reference/services/prometheus_client.cue b/docs/cue/reference/services/prometheus_client.cue similarity index 100% rename from docs/reference/services/prometheus_client.cue rename to docs/cue/reference/services/prometheus_client.cue diff --git a/docs/reference/services/pulsar.cue b/docs/cue/reference/services/pulsar.cue similarity index 100% rename from docs/reference/services/pulsar.cue rename to docs/cue/reference/services/pulsar.cue diff --git a/docs/reference/services/redis.cue b/docs/cue/reference/services/redis.cue similarity index 100% rename from docs/reference/services/redis.cue rename to docs/cue/reference/services/redis.cue diff --git a/docs/reference/services/sematext.cue b/docs/cue/reference/services/sematext.cue similarity index 100% rename from docs/reference/services/sematext.cue rename to docs/cue/reference/services/sematext.cue diff --git a/docs/reference/services/socket_client.cue b/docs/cue/reference/services/socket_client.cue similarity index 100% rename from docs/reference/services/socket_client.cue rename to docs/cue/reference/services/socket_client.cue diff --git a/docs/reference/services/socket_recevier.cue b/docs/cue/reference/services/socket_recevier.cue similarity index 100% rename from docs/reference/services/socket_recevier.cue rename to docs/cue/reference/services/socket_recevier.cue diff --git a/docs/reference/services/splunk.cue b/docs/cue/reference/services/splunk.cue similarity index 100% rename from docs/reference/services/splunk.cue rename to docs/cue/reference/services/splunk.cue diff --git a/docs/reference/services/statsd.cue b/docs/cue/reference/services/statsd.cue similarity index 100% rename from docs/reference/services/statsd.cue rename to docs/cue/reference/services/statsd.cue diff --git a/docs/reference/services/statsd_receiver.cue b/docs/cue/reference/services/statsd_receiver.cue similarity index 100% rename from docs/reference/services/statsd_receiver.cue rename to docs/cue/reference/services/statsd_receiver.cue diff --git a/docs/reference/services/stdin.cue b/docs/cue/reference/services/stdin.cue similarity index 100% rename from docs/reference/services/stdin.cue rename to docs/cue/reference/services/stdin.cue diff --git a/docs/reference/services/stdout.cue b/docs/cue/reference/services/stdout.cue similarity index 100% rename from docs/reference/services/stdout.cue rename to docs/cue/reference/services/stdout.cue diff --git a/docs/reference/services/syslog.cue b/docs/cue/reference/services/syslog.cue similarity index 100% rename from docs/reference/services/syslog.cue rename to docs/cue/reference/services/syslog.cue diff --git a/docs/reference/services/vector.cue b/docs/cue/reference/services/vector.cue similarity index 100% rename from docs/reference/services/vector.cue rename to docs/cue/reference/services/vector.cue diff --git a/docs/reference/team.cue b/docs/cue/reference/team.cue similarity index 100% rename from docs/reference/team.cue rename to docs/cue/reference/team.cue diff --git a/docs/reference/urls.cue b/docs/cue/reference/urls.cue similarity index 84% rename from docs/reference/urls.cue rename to docs/cue/reference/urls.cue index 992563a5979ba..37b07cc90b8d0 100644 --- a/docs/reference/urls.cue +++ b/docs/cue/reference/urls.cue @@ -6,9 +6,9 @@ urls: { amazon_linux: "https://aws.amazon.com/amazon-linux-ami/" ansi_escape_codes: "\(wikipedia)/wiki/ANSI_escape_code" apache: "https://httpd.apache.org" - apache_common: "\(apache)/docs/1.3/logs.html#common" - apache_combined: "\(apache)/docs/1.3/logs.html#combined" - apache_error: "\(apache)/docs/1.3/logs.html#errorlog" + apache_common: "\(apache)/docs/current/logs.html#common" + apache_combined: "\(apache)/docs/current/logs.html#combined" + apache_error: "\(apache)/docs/current/logs.html#errorlog" apache_extended_status: "\(apache)/docs/current/mod/core.html#extendedstatus" apache_install: "\(apache)/docs/current/install.html" apache_mod_status: "http://httpd.apache.org/docs/current/mod/mod_status.html" @@ -44,7 +44,7 @@ urls: { aws_ecs: "https://aws.amazon.com/ecs/" aws_ecs_task_metadata: "\(aws_docs)/AmazonECS/latest/developerguide/task-metadata-endpoint.html" aws_elb: "https://aws.amazon.com/elasticloadbalancing/" - aws_elb_access_format: "https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-examples" + aws_elb_access_format: "\(aws_docs)/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-examples" aws_elb_https: "\(aws_docs)/elasticloadbalancing/latest/classic/elb-create-https-ssl-load-balancer.html" aws_iam: "\(aws_docs)/IAM/latest/UserGuide/introduction.html" aws_iam_role: "\(aws_docs)/IAM/latest/UserGuide/id_roles.html" @@ -125,6 +125,7 @@ urls: { docker: "https://www.docker.com/" docker_alpine: "\(docker_hub)/_/alpine" docker_cli: "\(docker_docs)/engine/reference/commandline/cli/" + docker_compose: "https://docs.docker.com/compose/" docker_debian: "\(docker_hub)/_/debian" docker_daemon: "\(docker_docs)/engine/docker-overview/#the-docker-daemon" docker_daemon_socket_option: "\(docker_docs)/engine/reference/commandline/dockerd/#daemon-socket-option" @@ -165,41 +166,41 @@ urls: { eventstoredb_stats_client: "https://developers.eventstore.com/server/v21.2/docs/diagnostics/stats.html" exit_codes: "https://docs.rs/exitcode/latest/exitcode/#constants" externally_tagged_representation: "https://serde.rs/enum-representations.html#externally-tagged" - fail_safe: "https://en.wikipedia.org/wiki/Fail-safe" - ffi: "https://en.wikipedia.org/wiki/Foreign_function_interface" + fail_safe: "\(wikipedia)/wiki/Fail-safe" + ffi: "\(wikipedia)/wiki/Foreign_function_interface" file: "\(wikipedia)/wiki/Computer_file" file_system: "\(wikipedia)/wiki/File_system" fluent: "https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1" fluentd: "https://www.fluentd.org/" fluentbit: "https://fluentbit.io/" freebsd: "https://www.freebsd.org/" - gcp_authentication: "https://cloud.google.com/docs/authentication/" - gcp_authentication_api_key: "https://cloud.google.com/docs/authentication/api-keys" - gcp_authentication_server_to_server: "https://cloud.google.com/docs/authentication/production" - gcp_authentication_service_account: "https://cloud.google.com/docs/authentication/production#obtaining_and_providing_service_account_credentials_manually" - gcp_cloud_storage: "https://cloud.google.com/storage" - gcp_folders: "https://cloud.google.com/resource-manager/docs/creating-managing-folders" - gcp_pubsub: "https://cloud.google.com/pubsub/" - gcp_pubsub_rest: "https://cloud.google.com/pubsub/docs/reference/rest/" - gcp_projects: "https://cloud.google.com/resource-manager/docs/creating-managing-projects" - gcp_resources: "https://cloud.google.com/monitoring/api/resources" - gcp_stackdriver: "https://cloud.google.com/products/operations" - gcp_stackdriver_logging: "https://cloud.google.com/logging/docs/reference/v2/rest/" - gcp_stackdriver_logging_rest: "https://cloud.google.com/logging/" - gcp_stackdriver_metrics: "https://cloud.google.com/monitoring/api/ref_v3/rest/" + gcp: "https://cloud.google.com" + gcp_authentication: "\(gcp)/docs/authentication/" + gcp_authentication_api_key: "\(gcp)/docs/authentication/api-keys" + gcp_authentication_server_to_server: "\(gcp)/docs/authentication/production" + gcp_authentication_service_account: "\(gcp)/docs/authentication/production#obtaining_and_providing_service_account_credentials_manually" + gcp_cloud_storage: "\(gcp)/storage" + gcp_folders: "\(gcp)/resource-manager/docs/creating-managing-folders" + gcp_pubsub: "\(gcp)/pubsub/" + gcp_pubsub_rest: "\(gcp)/pubsub/docs/reference/rest/" + gcp_projects: "\(gcp)/resource-manager/docs/creating-managing-projects" + gcp_resources: "\(gcp)/monitoring/api/resources" + gcp_stackdriver: "\(gcp)/products/operations" + gcp_stackdriver_logging: "\(gcp)/logging/docs/reference/v2/rest/" + gcp_stackdriver_logging_rest: "\(gcp)/logging/" + gcp_stackdriver_metrics: "\(gcp)/monitoring/api/ref_v3/rest/" gcp_stackdriver_metrics_rest: "https://monitoring.googleapis.com/" - gcp_stackdriver_severity: "https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity" - gcp_xml_interface: "https://cloud.google.com/storage/docs/xml-api/overview" - gcs_predefined_acl: "https://cloud.google.com/storage/docs/access-control/lists#predefined-acl" - gcs_storage_classes: "https://cloud.google.com/storage/docs/storage-classes" - gcs_custom_metadata: "https://cloud.google.com/storage/docs/metadata#custom-metadata" + gcp_stackdriver_severity: "\(gcp)/logging/docs/reference/v2/rest/v2/LogEntry#logseverity" + gcp_xml_interface: "\(gcp)/storage/docs/xml-api/overview" + gcs_predefined_acl: "\(gcp)/storage/docs/access-control/lists#predefined-acl" + gcs_storage_classes: "\(gcp)/storage/docs/storage-classes" + gcs_custom_metadata: "\(gcp)/storage/docs/metadata#custom-metadata" git: "https://git-scm.com/" github: "https://github.com" github_protected_branches: "https://help.github.com/en/github/administering-a-repository/about-protected-branches" github_sign_commits: "https://help.github.com/en/github/authenticating-to-github/signing-commits" globbing: "\(wikipedia)/wiki/Glob_(programming)" glog: "\(github)/google/glog" - gnu_allocator: "https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html" graphql: "https://graphql.org" graphql_playground: "\(github)/graphql/graphql-playground" grok: "https://grokdebug.herokuapp.com/" @@ -239,7 +240,7 @@ urls: { iso_8601: "\(wikipedia)/wiki/ISO_8601" iso3166_2: "\(wikipedia)/wiki/ISO_3166-2" issue_1694: "\(vector_repo)/issues/1694" - jemalloc: "\(github)/jemalloc/jemalloc" + journalctl: "https://www.freedesktop.org/software/systemd/man/journalctl.html" journald: "https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html" json: "\(wikipedia)/wiki/JSON" json_types: "\(wikipedia)/wiki/JSON#Data_types_and_syntax" @@ -300,7 +301,7 @@ urls: { lz4: "https://lz4.github.io/lz4/" macos: "\(wikipedia)/wiki/MacOS" magic_bytes: "\(wikipedia)/wiki/List_of_file_signatures" - mailing_list: "\(vector_website)/community/" + mailing_list: "/community/" maxmind: "https://www.maxmind.com/en/home" maxmind_db_file_format: "https://maxmind.github.io/MaxMind-DB/" maxmind_geoip2: "https://dev.maxmind.com/geoip/geoip2/downloadable" @@ -314,7 +315,6 @@ urls: { mongodb: "https://www.mongodb.com" mongodb_command_server_status: "https://docs.mongodb.com/manual/reference/command/serverStatus/" mongodb_connection_string_uri_format: "https://docs.mongodb.com/manual/reference/connection-string/" - musl_allocator: "https://musl.libc.org/releases.html" musl_builder_docker_image: "\(vector_repo)/blob/master/scripts/ci-docker-images/builder-x86_64-unknown-linux-musl/Dockerfile" nats: "https://nats.io/" new_bug_report: "\(vector_repo)/issues/new?labels=type%3A+bug" @@ -407,9 +407,10 @@ urls: { sematext_monitoring: "https://sematext.com/docs/monitoring/" sematext_registration: "https://apps.sematext.com/ui/registration" semver: "https://semver.org/" - sha1: "https://en.wikipedia.org/wiki/SHA-1" - sha2: "https://en.wikipedia.org/wiki/SHA-2" - sha3: "https://en.wikipedia.org/wiki/SHA-3" + sha1: "\(wikipedia)/wiki/SHA-1" + sha2: "\(wikipedia)/wiki/SHA-2" + sha3: "\(wikipedia)/wiki/SHA-3" + signal: "\(wikipedia)/wiki/Signal_(IPC)" snake_case: "\(wikipedia)/wiki/Snake_case" snappy: "https://google.github.io/snappy/" socket: "\(wikipedia)/wiki/Network_socket" @@ -448,8 +449,8 @@ urls: { toml_table: "\(github)/toml-lang/toml#table" toml_types: "\(github)/toml-lang/toml#table-of-contents" twelve_factor_app: "https://12factor.net/" - type_safety: "https://en.wikipedia.org/wiki/Type_safety" - tz_time_zones: "https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" + type_safety: "\(wikipedia)/wiki/Type_safety" + tz_time_zones: "\(wikipedia)/wiki/List_of_tz_database_time_zones" ubuntu: "https://ubuntu.com/" udp: "\(wikipedia)/wiki/User_Datagram_Protocol" uds: "\(wikipedia)/wiki/Unix_domain_socket" @@ -458,101 +459,108 @@ urls: { unix_timestamp: "\(wikipedia)/wiki/Unix_time" utf8: "\(wikipedia)/wiki/UTF-8" uuidv4: "\(wikipedia)/wiki/Universally_unique_identifier#Version_4_(random)" - url: "https://en.wikipedia.org/wiki/URL" + url: "\(wikipedia)/wiki/URL" us_social_security_number: "https://www.ssa.gov/history/ssn/geocard.html" - vector_aggregator_role: "\(vector_website)/docs/setup/deployment/roles/#aggregator" - vector_blog: "\(vector_website)/blog/" + vector_agent_role: "/docs/setup/deployment/roles/#agent" + vector_aggregator_role: "/docs/setup/deployment/roles/#aggregator" + vector_blog: "/blog/" vector_bug_issues: "\(vector_repo)/issues?q=is%3Aopen+is%3Aissue+label%3A%22type%3A+bug%22" vector_changelog: "\(vector_repo)/blob/master/CHANGELOG.md" vector_chat: "https://chat.vector.dev" vector_code_of_conduct: "\(vector_repo)/blob/master/CODE_OF_CONDUCT.md" - vector_community: "\(vector_website)/community/" - vector_components: "\(vector_website)/components/" - vector_configuration: "\(vector_website)/docs/configuration/" - vector_data_model: "\(vector_website)/docs/about/under-the-hood/architecture/data-model/" + vector_community: "/community/" + vector_components: "/components/" + vector_configuration: "/docs/reference/configuration/" + vector_configuration_global: "/docs/reference/configuration/global-options" + vector_data_model: "/docs/about/under-the-hood/architecture/data-model/" vector_debian_source_files: "\(vector_repo)/tree/master/distribution/debian" - vector_dedupe_transform: "\(vector_website)/docs/reference/configuration/transforms/dedupe/" - vector_docker_logs_source: "\(vector_website)/docs/reference/configuration/sources/docker_logs/" + vector_dedupe_transform: "/docs/reference/configuration/transforms/dedupe/" + vector_docker_logs_source: "/docs/reference/configuration/sources/docker_logs/" vector_docker_source_files: "\(vector_repo)/tree/master/distribution/docker" - vector_docs: "\(vector_website)/docs/" - vector_download: "\(vector_website)/releases/latest/download/" - vector_download_nightly: "\(vector_website)/releases/nightly/download/" - vector_enriching_transforms: "\(vector_website)/components/?functions%5B%5D=enrich" - vector_exec_source: "\(vector_website)/docs/reference/configuration/sources/exec" - vector_file_source: "\(vector_website)/docs/reference/configuration/sources/file/" + vector_docs: "/docs/" + vector_download: "/releases/latest/download/" + vector_download_nightly: "/releases/nightly/download/" + vector_enriching_transforms: "/components/?functions%5B%5D=enrich" + vector_file_source: "/docs/reference/configuration/sources/file/" + vector_exec_source: "/docs/reference/configuration/sources/exec" + vector_file_source: "/docs/reference/configuration/sources/file/" vector_generate_arguments_issue: "\(vector_repo)/issues/1966" - vector_guides: "\(vector_website)/guides/" + vector_guides: "/guides/" vector_glibc_benchmarks: "\(vector_repo)/issues/2313" vector_graphql_playground: "https://playground.vector.dev:8686/playground" - vector_highlights: "\(vector_website)/highlights/" - vector_host_metrics_source: "\(vector_website)/docs/reference/configuration/sources/host_metrics/" - vector_http_auth_token: "\(vector_website)/docs/reference/configuration/sinks/http/#token" - vector_homebrew: "\(vector_website)/docs/setup/installation/package-managers/homebrew/" + vector_highlights: "/highlights/" + vector_host_metrics_source: "/docs/reference/configuration/sources/host_metrics" + vector_http_auth_token: "/docs/reference/configuration/sinks/http/#token" + vector_homebrew: "/docs/setup/installation/package-managers/homebrew" vector_homebrew_source_files: "\(github)/timberio/homebrew-brew/blob/master/Formula/vector.rb" - vector_http_source: "\(vector_website)/docs/reference/configuration/sources/http/" + vector_http_source: "/docs/reference/configuration/sources/http/" vector_initd_service: "\(vector_repo)/blob/master/distribution/init.d/vector" vector_installer: "https://sh.vector.dev" vector_issues: "\(vector_repo)/issues" - vector_journald_source: "\(vector_website)/docs/reference/configuration/sources/journald/" - vector_kubernetes_logs_source: "\(vector_website)/docs/reference/configuration/sources/kubernetes_logs/" - vector_level_up: "\(vector_website)/guides/level-up/" - vector_log: "\(vector_website)/docs/about/data-model/log/" - vector_log_data_types: "\(vector_website)/docs/about/data-model/log/#types" + vector_journald_source: "/docs/reference/configuration/sources/journald/" + vector_kubernetes_logs_source: "/docs/reference/configuration/sources/kubernetes_logs/" + vector_level_up: "/guides/level-up/" + vector_log: "/docs/about/under-the-hood/architecture/data-model/log" + vector_log_data_types: "/docs/about/under-the-hood/architecture/data-model/log/#types" vector_lua_rfc: "\(vector_repo)/blob/master/rfcs/2020-03-06-1999-api-extensions-for-lua-transform.md" - vector_metric: "\(vector_website)/docs/about/data-model/metric/" + vector_metric: "/docs/about/under-the-hood/architecture/data-model/metric" + vector_monitoring: "/docs/administration/monitoring" vector_msi_source_files: "\(vector_repo)/tree/master/distribution/msi" vector_nightly_builds: "https://packages.timber.io/vector/nightly/latest/" vector_nix_package: "\(github)/NixOS/nixpkgs/blob/master/pkgs/tools/misc/vector/default.nix" - vector_parsing_transforms: "\(vector_website)/components/?functions%5B%5D=parse" - vector_performance: "\(vector_website)/#performance" + vector_packages_root: "https://packages.timber.io" + vector_parsing_transforms: "/components/?functions%5B%5D=parse" + vector_performance: "\(vector_repo)/#performance" vector_privacy_policy: "\(vector_repo)/blob/master/PRIVACY.md" - vector_programmable_transforms: "\(vector_website)/components/?functions%5B%5D=program" + vector_programmable_transforms: "/components/?functions%5B%5D=program" vector_pull_requests: "\(vector_repo)/pulls" - vector_receiving_sources: "\(vector_website)/components/?functions%5B%5D=receive" - vector_regex_parser: "\(vector_website)/docs/reference/configuration/transforms/regex_parser/" - vector_releases: "\(vector_website)/releases/latest/" - vector_release_v0_14_0_full: "https://packages.timber.io/vector/v0.14.0" - vector_release_v0_14_0: "\(vector_website)/releases/v0.14.0/" - vector_reduce_transform: "\(vector_website)/docs/reference/configuration/transforms/reduce/" + vector_readme: "\(vector_repo)/blob/master/README.md" + vector_receiving_sources: "/components/?functions%5B%5D=receive" + vector_regex_parser: "/docs/reference/configuration/transforms/regex_parser" + vector_releases: "/releases/latest/" + vector_reduce_transform: "/docs/reference/configuration/transforms/reduce" vector_release_policy: "https://github.com/timberio/vector/blob/master/RELEASING.md" - vector_remap_transform: "\(vector_website)/docs/reference/configuration/transforms/remap/" + vector_remap_transform: "/docs/reference/configuration/transforms/remap" vector_repo: "\(github)/timberio/vector" vector_roadmap: "https://roadmap.vector.dev" + vector_roles: "/docs/setup/deployment/roles" + vector_route_transform: "/docs/reference/configuration/transforms/route" vector_rpm_source_files: "\(vector_repo)/tree/master/distribution/rpm" vector_security_policy: "\(vector_repo)/security/policy" vector_semantic_yml: "\(vector_repo)/blob/master/.github/semantic.yml" - vector_sink: "\(vector_website)/docs/reference/configuration/sinks/vector" - vector_sinks: "\(vector_website)/docs/reference/configuration/sinks/" - vector_sink_http_batch: "\(vector_website)/docs/reference/configuration/sinks/http/#batch" - vector_sink_kafka_sasl: "\(vector_website)/docs/reference/configuration/sources/kafka/#sasl" - vector_socket_source: "\(vector_website)/docs/reference/configuration/sources/socket/" - vector_source: "\(vector_website)/docs/reference/configuration/sources/vector/" - vector_sources: "\(vector_website)/docs/reference/configuration/sources/" + vector_sink: "/docs/reference/configuration/sinks/vector" + vector_sinks: "/docs/reference/configuration/sinks" + vector_sink_http_batch: "/docs/reference/configuration/sinks/http/#batch" + vector_sink_kafka_sasl: "/docs/reference/configuration/sources/kafka/#sasl" + vector_socket_source: "/docs/reference/configuration/sources/socket" + vector_source: "/docs/reference/configuration/sources/vector" + vector_sources: "/docs/reference/configuration/sources" vector_stars: "\(vector_repo)/stargazers" - vector_stdin_source: "\(vector_website)/docs/reference/configuration/sources/stdin/" + vector_stdin_source: "/docs/reference/configuration/sources/stdin" vector_systemd_file: "\(vector_repo)/blob/master/distribution/systemd/vector.service" vector_test_harness: "\(vector_repo)-test-harness/" - vector_transform_aws_cloudwatch_logs_subscription_parser: "\(vector_website)/docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser" - vector_transforms: "\(vector_website)/docs/reference/configuration/transforms/" + vector_topologies: "/docs/setup/deployment/topologies" + vector_transform_aws_cloudwatch_logs_subscription_parser: "/docs/reference/configuration/transforms/aws_cloudwatch_logs_subscription_parser" + vector_transforms: "/docs/reference/configuration/transforms" vector_twitter: "https://twitter.com/vectordotdev" - vector_unit_testing: "\(vector_website)/guides/level-up/unit-testing/" + vector_unit_testing: "/guides/level-up/unit-testing/" vector_version_branches: "\(vector_repo)/branches/all?query=v" - vector_website: "https://vector.dev" - vrl_announcement: "\(vector_website)/blog/vector-remap-language" + vrl_announcement: "/blog/vector-remap-language" vrl_error_handling: "\(vrl_errors_reference)#handling" vrl_error_handling_assigning: "\(vrl_errors_reference)#assigning" - vrl_error_handling_coalescing: "\(vrl_errors_reference)#coalesing" + vrl_error_handling_coalescing: "\(vrl_errors_reference)#coalescing" vrl_error_handling_raising: "\(vrl_errors_reference)#raising" - vrl_errors_reference: "\(vrl_reference)errors/" - vrl_expressions: "\(vrl_reference)expressions/" - vrl_fail_safety: "\(vrl_reference)#fail-safety" - vrl_features: "\(vrl_reference)#features" - vrl_functions: "\(vrl_reference)functions/" - vrl_literals: "\(vrl_expressions)#literal-expressions" - vrl_parsing_functions: "\(vrl_functions)#parse-functions" + vrl_errors_reference: "\(vrl_reference)/errors/" + vrl_examples: "\(vrl_reference)/examples" + vrl_expressions: "\(vrl_reference)/expressions/" + vrl_fail_safety: "\(vrl_reference)/#fail-safety" + vrl_features: "\(vrl_reference)/#features" + vrl_functions: "\(vrl_reference)/functions" + vrl_literals: "\(vrl_expressions)/#literal-expressions" + vrl_parsing_functions: "\(vrl_functions)/#parse-functions" vrl_path_expressions: "\(vrl_expressions)#path" vrl_performance: "\(vrl_reference)#performance" - vrl_reference: "\(vector_website)/docs/reference/vrl/" + vrl_reference: "/docs/reference/vrl" vrl_runtime_errors: "\(vrl_errors_reference)#runtime-errors" vrl_safety: "\(vrl_reference)#safety" vrl_type_safety: "\(vrl_reference)#type-safety" diff --git a/docs/cue/reference/versions.cue b/docs/cue/reference/versions.cue new file mode 100644 index 0000000000000..e4ad9ae7c7949 --- /dev/null +++ b/docs/cue/reference/versions.cue @@ -0,0 +1,26 @@ +package metadata + +// This has to be maintained manually because there's currently no way to sort versions programmatically +versions: [string, ...string] & [ + "0.14.0", + "0.13.1", + "0.13.0", + "0.12.2", + "0.12.1", + "0.12.0", + "0.11.1", + "0.11.0", + "0.10.0", + "0.9.2", + "0.9.1", + "0.9.0", + "0.8.2", + "0.8.1", + "0.8.0", + "0.7.2", + "0.7.1", + "0.7.0", + "0.6.0", + "0.5.0", + "0.4.0", +] diff --git a/docs/data/.gitkeep b/docs/data/.gitkeep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/docs/guides/integrate.cue b/docs/guides/integrate.cue deleted file mode 100644 index 4581604a05db7..0000000000000 --- a/docs/guides/integrate.cue +++ /dev/null @@ -1,46 +0,0 @@ -package metadata - -#ComponentConfig: { - _args: { - component: _ - } -} - -guides: integrate: { - sources: { - for source_type, source in components.sources { - "\(source_type)": { - config: { - sources: in: { - for config_name, source_config in source.configuration { - "\( config_name )"?: _ | *null - } - } - } - sinks: { - for sink_type, sink in components.sinks { - "\(sink_type)": { - if sink.input.logs == true && source.output.logs != _|_ { - config: { - sources: in: { - type: source_type - } - sinks: out: { - type: sink_type - inputs: ["in"] - } - } - } - } - } - } - } - } - } - - sinks: { - for type, component in components.sinks { - "\(type)": "hi" - } - } -} diff --git a/docs/highlights/.schema.json b/docs/highlights/.schema.json deleted file mode 100644 index 907f67820b945..0000000000000 --- a/docs/highlights/.schema.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/timberio/vector/master/.meta/schemas/highlights.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Vector Highlights Front Matter Schema", - "type": "object", - "additionalProperties": false, - "required": [ - "$schema", - "author_github", - "description", - "hide_on_release_notes", - "last_modified_on", - "pr_numbers", - "tags", - "title" - ], - "properties": { - "$schema": { - "type": "string", - "description": "The path to this schema." - }, - "author_github": { - "type": "string", - "description": "Github URL of the author." - }, - "description": { - "type": "string", - "description": "Short single-line description" - }, - "draft": { - "type": "boolean", - "description": "Draft mode ensure this guide is not included in releases." - }, - "featured": { - "type": "boolean", - "description": "Is this the feature of the release? Only one can be selected per release." - }, - "hide_pagination": { - "type": "boolean", - "description": "Hides the pagination nav" - }, - "hide_on_release_notes": { - "type": "boolean", - "description": "Should this highlight appear in the upcoming release notes? Setting this to `false` allows you to make announce a highlight of low imortance without adding noise to the release notes." - }, - "last_modified_on": { - "type": "string", - "description": "When the guide was last modified." - }, - "pr_numbers": { - "type": "array", - "description": "List of pull request numbers relevant to this highlight.", - "items": { - "type": "int" - } - }, - "release": { - "type": "string", - "description": "The release/version number this highlight is included in." - }, - "tags": { - "type": "array", - "description": "Array of tags", - "items": { - "type": "string", - "enum": ["sink: tcp","source: tcp","source: udp","type: announcement","type: enhancement","type: new feature","type: performance","type: breaking change","domain: buffers","domain: cli","domain: config","domain: deps","domain: networking","domain: observability","domain: operations","domain: platforms","domain: privacy","domain: security","domain: sinks","domain: sources","domain: tests","domain: topology","domain: transforms","domain: ux","domain: website","event type: log","event type: metric","platform: arm64","platform: armv7","platform: amazon-linux","platform: centos","platform: debian","platform: docker","platform: dpkg","platform: homebrew","platform: macos","platform: msi","platform: nix","platform: nixos","platform: raspbian","platform: rhel","platform: rpm","platform: ubuntu","platform: windows","platform: x86_64","provider: aws","provider: confluent","provider: heroku","provider: splunk","provider: yandex","provider: datadog","provider: azure","provider: elastic","provider: gcp","provider: honeycomb","provider: humio","provider: influxdata","provider: logdna","provider: grafana","provider: new relic","provider: papertrail","provider: sematext","source: docker","source: file","source: generator","source: http","source: journald","source: kafka","source: logplex","source: prometheus","source: socket","source: splunk_hec","source: statsd","source: stdin","source: syslog","source: vector","source: kubernetes","transform: add_fields","transform: add_tags","transform: ansi_stripper","transform: aws_ec2_metadata","transform: coercer","transform: concat","transform: dedupe","transform: filter","transform: geoip","transform: grok_parser","transform: json_parser","transform: log_to_metric","transform: logfmt_parser","transform: lua","transform: merge","transform: reduce","transform: regex_parser","transform: remove_fields","transform: remove_tags","transform: rename_fields","transform: sampler","transform: split","transform: swimlanes","transform: tag_cardinality_limit","transform: tokenizer","transform: wasm","sink: aws_cloudwatch_logs","sink: aws_cloudwatch_metrics","sink: aws_kinesis_firehose","sink: aws_kinesis_streams","sink: aws_s3","sink: blackhole","sink: clickhouse","sink: console","sink: datadog_logs","sink: datadog_metrics","sink: elasticsearch","sink: file","sink: gcp_cloud_storage","sink: gcp_pubsub","sink: gcp_stackdriver_logs","sink: honeycomb","sink: http","sink: humio_logs","sink: influxdb_logs","sink: influxdb_metrics","sink: kafka","sink: logdna","sink: loki","sink: new_relic_logs","sink: papertrail","sink: prometheus","sink: pulsar","sink: sematext_logs","sink: socket","sink: splunk_hec","sink: statsd","sink: vector"] - } - }, - "title": { - "type": "string", - "description": "Title of the guide." - } - } -} diff --git a/docs/highlights/2020-02-20-new-sinks.md b/docs/highlights/2020-02-20-new-sinks.md deleted file mode 100644 index e119497642b70..0000000000000 --- a/docs/highlights/2020-02-20-new-sinks.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -last_modified_on: "2020-04-13" -$schema: ".schema.json" -title: "Lots of New Sinks!" -description: "7 new sinks have been added to Vector" -author_github: "https://github.com/binarylogic" -pr_numbers: [1555, 1562, 1668, 1716, 1759, 1783, 1794] -release: "0.8.0" -hide_on_release_notes: false -tags: ["type: new feature", "domain: sinks"] ---- - -We all love a good sink. Now you can enjoy our latest offerings: - -- [`gcp_stackdriver_logging` sink][docs.sinks.gcp_stackdriver_logs] -- [`gcp_cloud_storage` sink][docs.sinks.gcp_cloud_storage] -- [`logdna` sink][docs.sinks.logdna] -- [`humio_logs` sink][docs.sinks.humio_logs] -- [`influxdb_metrics` sink][docs.sinks.influxdb_metrics] -- [`loki` sink][docs.sinks.loki] -- [`sematext_logs` sink][docs.sinks.sematext_logs] - -[docs.sinks.gcp_cloud_storage]: /docs/reference/sinks/gcp_cloud_storage/ -[docs.sinks.gcp_stackdriver_logs]: /docs/reference/sinks/gcp_stackdriver_logs/ -[docs.sinks.humio_logs]: /docs/reference/sinks/humio_logs/ -[docs.sinks.influxdb_metrics]: /docs/reference/sinks/influxdb_metrics/ -[docs.sinks.logdna]: /docs/reference/sinks/logdna/ -[docs.sinks.loki]: /docs/reference/sinks/loki/ -[docs.sinks.sematext_logs]: /docs/reference/sinks/sematext_logs/ diff --git a/docs/highlights/2020-02-24-rename-fields-transform.md b/docs/highlights/2020-02-24-rename-fields-transform.md deleted file mode 100644 index aaf277a2cdd04..0000000000000 --- a/docs/highlights/2020-02-24-rename-fields-transform.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -last_modified_on: "2020-04-13" -$schema: ".schema.json" -title: "New Rename Fields Transform" -description: "An easier way to rename fields" -author_github: "https://github.com/binarylogic" -pr_numbers: [1800] -release: "0.8.0" -hide_on_release_notes: false -tags: ["type: new feature", "domain: transforms", "transform: rename_fields"] ---- - -Vector has a long overdue [`rename_fields` transform][docs.transforms.rename_fields]. -This does exactly what it says, rename fields :). - -[docs.transforms.rename_fields]: /docs/reference/transforms/rename_fields/ diff --git a/docs/highlights/2020-03-31-filter-transform.md b/docs/highlights/2020-03-31-filter-transform.md deleted file mode 100644 index 6729e88620e75..0000000000000 --- a/docs/highlights/2020-03-31-filter-transform.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -last_modified_on: "2020-04-16" -$schema: ".schema.json" -title: "New Filter Transform" -description: "Filter and route your logs based on defined conditions" -author_github: "https://github.com/binarylogic" -pr_numbers: [2088] -release: "0.9.0" -hide_on_release_notes: false -tags: ["type: new feature", "domain: transforms", "transform: filter"] ---- - -We recently introduced a concept of conditions, which you can see in our -[`swimlanes` transform][docs.transforms.swimlanes] as well as our [unit -tests feature][docs.reference.tests]. This paved the way for a new `filter` -transform, allowing you to filter events based on a set of conditions. This -is replaces our old `field_filter` transform since it is much more expressive. - -## Get Started - -```toml title="vector.toml" -[transforms.haproxy_errors] - # General - type = "filter" - inputs = ["my-source-id"] - - # Conditions - condition."level.eq" = "error" - condition."service.eq" = "haproxy" -``` - -Check out the [docs][docs.transforms.filter] for a fill list of available -conditions. - -[docs.reference.tests]: /docs/reference/tests/ -[docs.transforms.filter]: /docs/reference/transforms/filter/ -[docs.transforms.swimlanes]: /docs/reference/transforms/swimlanes/ diff --git a/docs/highlights/2020-04-07-lua-transform-version-2.md b/docs/highlights/2020-04-07-lua-transform-version-2.md deleted file mode 100644 index e27181824ef5b..0000000000000 --- a/docs/highlights/2020-04-07-lua-transform-version-2.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -last_modified_on: "2020-03-31" -$schema: ".schema.json" -title: "Lua Transform v2" -description: "The next iteration of our Lua transform." -author_github: "https://github.com/binarylogic" -pr_numbers: [2126] -release: "0.9.0" -hide_on_release_notes: false -tags: ["type: enhancement", "domain: sources", "source: vector"] ---- - -v2 of our [`lua` transform][docs.transforms.lua] has been released! This is a -complete overhaul that provides a new and improved API, better data processing -ergonomics, and faster processing. Specific improvements include: - -1. Events are [represented as Lua tables][docs.transforms.lua#representation-of-events] with proper type conversion. -2. Introduction of [hooks][docs.transforms.lua#hooks] to maintain global state. -3. Introduction of [timers][docs.transforms.lua#timers] to facilitate timed flushing. Useful for aggregations. -4. The ability to accept and work with metric events in addition to log events. - -This raises the bar in terms of capabilities, which is important! Lua is often -used as an escape hatch when Vector's native transforms are not expressive -enough. - - - -Did you know we're also [working on a WASM integration][urls.pr_2006] 👀 - - - - - -## Get Started - -Docs: Lua Transform -Guide: Custom aggregations with Lua -Guide: Parsing CSV logs with Lua -Guide: Merge multi-line logs with Lua - -And for the curious: - -Vector's Lua RFC - -[docs.transforms.lua#hooks]: /docs/reference/transforms/lua/#hooks -[docs.transforms.lua#representation-of-events]: /docs/reference/transforms/lua/#representation-of-events -[docs.transforms.lua#timers]: /docs/reference/transforms/lua/#timers -[docs.transforms.lua]: /docs/reference/transforms/lua/ -[urls.pr_2006]: https://github.com/timberio/vector/pull/2006 diff --git a/docs/layouts/404.html b/docs/layouts/404.html new file mode 100644 index 0000000000000..6e953781b95f7 --- /dev/null +++ b/docs/layouts/404.html @@ -0,0 +1,28 @@ +{{ define "main" }} +
+
+

+ 404 + Page not found +

+ +

+ Uh-oh! That link doesn't seem to exist. +

+
+ +
+

+ Below is a full listing of the site's pages in alphabetical order by title. We hope you find what you're looking for! +

+ +
+ {{ range site.AllPages }} + + {{ .Title }} + + {{ end }} +
+
+
+{{ end }} \ No newline at end of file diff --git a/docs/layouts/_default/_markup/render-heading.html b/docs/layouts/_default/_markup/render-heading.html new file mode 100644 index 0000000000000..158704095d38a --- /dev/null +++ b/docs/layouts/_default/_markup/render-heading.html @@ -0,0 +1,10 @@ +{{ $iconSizes := dict "1" "7" "2" "6" "3" "5" "4" "4" "5" "3" "6" "3" }} +{{ $n := index $iconSizes (.Level | string) }} + + {{ .Text | safeHTML }} + + + + + + \ No newline at end of file diff --git a/docs/layouts/_default/_markup/render-link.html b/docs/layouts/_default/_markup/render-link.html new file mode 100644 index 0000000000000..ce62b06b8dc0b --- /dev/null +++ b/docs/layouts/_default/_markup/render-link.html @@ -0,0 +1,12 @@ +{{- $link := .Destination -}} +{{- $isRemote := strings.HasPrefix $link "http" -}} +{{- if not $isRemote -}} +{{- $url := urls.Parse .Destination -}} +{{- if $url.Path -}} +{{- $fragment := "" -}} +{{- with $url.Fragment -}}{{- $fragment = printf "#%s" . -}}{{ end -}} +{{- if .Page.GetPage $url.Path -}}{{- $link = printf "%s%s" (.Page.GetPage $url.Path).RelPermalink $fragment -}}{{- end -}}{{- end -}} +{{- end -}} + + {{- .Text | safeHTML -}} + \ No newline at end of file diff --git a/docs/layouts/_default/baseof.html b/docs/layouts/_default/baseof.html new file mode 100644 index 0000000000000..ed65648aa4741 --- /dev/null +++ b/docs/layouts/_default/baseof.html @@ -0,0 +1,66 @@ +{{/* Root template for all pages */}} +{{ $hasBottomNav := eq .Section "docs" }} + + + + + {{/* Make sure the page is always visible if JS is disabled */}} + + + {{/* Ensure smooth page loading */}} + + + {{ partial "meta.html" . }} + + + {{ block "title" . }} + {{ site.Title }} | {{ site.Params.description }} + {{ end }} + + + {{ partial "css.html" . }} + + {{/* JS that needs to load at the start */}} + {{ partial "javascript/head.html" . }} + + +
+ {{ partial "banner.html" . }} + {{ partial "navbar.html" . }} + + {{ block "main" . }} + {{ end }} +
+ + {{/* For things pushed down with the footer (e.g. pagination) */}} + {{ block "below" . }} + {{ end }} + + {{ partial "footer.html" . }} + + {{/* For the mobile nav footer */}} + {{ block "subfooter" . }} + {{ end }} + + {{/* JS that needs to load last */}} + {{ partial "javascript/below.html" . }} + + {{/* JS that's solely for the front page React.js shenanigans */}} + {{ if .IsHome }} + {{ partial "javascript/home.html" . }} + {{ end }} + + diff --git a/docs/layouts/_default/blog-post-card.html b/docs/layouts/_default/blog-post-card.html new file mode 100644 index 0000000000000..f9d991fc48e8b --- /dev/null +++ b/docs/layouts/_default/blog-post-card.html @@ -0,0 +1,45 @@ +{{ $date := .Date | dateFormat "January 2, 2006" }} + \ No newline at end of file diff --git a/docs/layouts/_default/component-card-selectable.html b/docs/layouts/_default/component-card-selectable.html new file mode 100644 index 0000000000000..bdbf99bd7f373 --- /dev/null +++ b/docs/layouts/_default/component-card-selectable.html @@ -0,0 +1,30 @@ +{{ $tag := .File.BaseFileName }} +{{ $type := .CurrentSection.Params.component_type }} +{{ $docs := index (index site.Data.docs.components $type) $tag }} +{{ $desc := .Description }} +{{ $tags := slice }} +{{ $tags = $tags | append $type }} + +{{ if $docs.input.logs }} +{{ $tags = $tags | append "logs" }} +{{ end }} + +{{ if $docs.input.metrics }} +{{ $tags = $tags | append "metrics" }} +{{ end }} + + +
+
+ {{ .Title }} {{ .Params.kind }} +
+ + {{ with $desc }} +
+

+ {{ . | markdownify | plainify }} +

+
+ {{ end }} +
+
diff --git a/docs/layouts/_default/component-card.html b/docs/layouts/_default/component-card.html new file mode 100644 index 0000000000000..b7749bebc2a0f --- /dev/null +++ b/docs/layouts/_default/component-card.html @@ -0,0 +1,28 @@ +{{ $title := .Params.short | default .Title }} +{{ $componentTag := .File.BaseFileName }} +{{ $kind := .Params.kind }} + \ No newline at end of file diff --git a/docs/layouts/_default/li.html b/docs/layouts/_default/li.html new file mode 100644 index 0000000000000..34c0aca732c1a --- /dev/null +++ b/docs/layouts/_default/li.html @@ -0,0 +1,13 @@ +{{ $title := .Params.short | default .Title }} + + + {{ $title }} + + + {{/* Heroicon: outline/chevron-right */}} + + + + + + \ No newline at end of file diff --git a/docs/layouts/_default/list.search.json b/docs/layouts/_default/list.search.json new file mode 100644 index 0000000000000..c7942b354f474 --- /dev/null +++ b/docs/layouts/_default/list.search.json @@ -0,0 +1,17 @@ +{{/* Algolia search index, See the "searchableAttributes" field algolia.js for the list of fields that we send over to Algolia. */}} +{{- $pages := where site.AllPages "Draft" false -}} +{{- $index := slice -}} +{{- range site.AllPages -}} +{{- $isComponent := eq .Layout "component" -}} +{{- $url := .RelPermalink -}} +{{- $title := .Params.search_title | default .Params.short | default .Title | markdownify | plainify -}} +{{- $title := cond $isComponent (printf "%s %s" .Title .Params.kind) $title -}} +{{- $sectionTitle := (.FirstSection.Params.short | default .FirstSection.Params.Title) | title -}} +{{- $section := cond (eq .Layout "component") "Component" $sectionTitle -}} +{{- $tags := .Params.tags | default slice -}} +{{- $content := .Plain -}} +{{- $summary := .Summary -}} +{{- $description := .Description | markdownify | plainify -}} +{{- $index = $index | append (dict "objectID" .File.UniqueID "title" $title "tags" $tags "content" $content "section" $section "summary" $summary "description" $description "url" $url) -}} +{{- end -}} +{{- $index | jsonify -}} diff --git a/docs/layouts/_default/section-card.html b/docs/layouts/_default/section-card.html new file mode 100644 index 0000000000000..11d0fd332c9ea --- /dev/null +++ b/docs/layouts/_default/section-card.html @@ -0,0 +1,15 @@ +{{ $title := .Params.short | default .Title }} + diff --git a/docs/layouts/blog/section.html b/docs/layouts/blog/section.html new file mode 100644 index 0000000000000..7fe2e3c71694f --- /dev/null +++ b/docs/layouts/blog/section.html @@ -0,0 +1,42 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $rss := .OutputFormats.Get "rss" }} +{{ $posts := .RegularPages }} +
+
+
+ {{ partial "breadcrumb.html" . }} +
+ +

+ {{ .Title }} +

+ + {{ with .Description }} +

+ {{ . | markdownify }} +

+ {{ end }} + + +
+ +
+
+ {{ range $posts }} + {{ .Render "blog-post-card" }} + {{ end }} +
+
+
+{{ end }} \ No newline at end of file diff --git a/docs/layouts/blog/single.html b/docs/layouts/blog/single.html new file mode 100644 index 0000000000000..9cab894331640 --- /dev/null +++ b/docs/layouts/blog/single.html @@ -0,0 +1,26 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $date := .Date | dateFormat "January 2, 2006" }} +
+
+ {{ partial "blog/hero.html" . }} + +
+ {{ partial "content.html" . }} +
+
+ + +
+{{ end }} + +{{ define "below" }} +{{ partial "blog/pagination.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/community/section.html b/docs/layouts/community/section.html new file mode 100644 index 0000000000000..ea3b8b48d54e7 --- /dev/null +++ b/docs/layouts/community/section.html @@ -0,0 +1,37 @@ +{{ define "title" }} +Community | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $buttons := .Params.buttons }} +{{ $faq := .Params.faq }} +
+ {{ partial "hero.html" . }} + +
+ {{ range $buttons }} + + {{ end }} +
+ +
+ + {{ partial "heading.html" (dict "text" "FAQ" "level" 2) }} + + + {{ partial "content.html" . }} +
+
+{{ end }} \ No newline at end of file diff --git a/docs/layouts/components/section.html b/docs/layouts/components/section.html new file mode 100644 index 0000000000000..044dfd69a9fe7 --- /dev/null +++ b/docs/layouts/components/section.html @@ -0,0 +1,43 @@ +{{ define "title" }} +Components - Sources, Transforms, and Sinks | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $criteria := .Params.criteria }} +{{ $types := slice "Sources" "Transforms" "Sinks" }} +
+
+ {{ partial "hero.html" . }} +
+ +
+ {{ range $types }} + {{ $components := where site.RegularPages ".CurrentSection.Params.short" . }} + {{ $num := len $components }} + {{ $link := printf "docs/reference/configuration/%s" (. | lower) | relURL }} +
+

+ + {{ . }} + + + + + count + + + {{ $num }} + + +

+ +
+ {{ range $components }} + {{ .Render "component-card" }} + {{ end }} +
+
+ {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/docs/layouts/docs/component.html b/docs/layouts/docs/component.html new file mode 100644 index 0000000000000..988d9a99ad1e1 --- /dev/null +++ b/docs/layouts/docs/component.html @@ -0,0 +1,137 @@ +{{ define "title" }} +{{ .Title }} | Vector documentation +{{ end }} + +{{ define "main" }} +{{ $tag := .File.BaseFileName }} +{{ $kind := .CurrentSection.Params.component_type }} +{{ $kindSingular := $kind | singularize }} +{{ $config := index (index site.Data.docs.components $kind) $tag }} +{{ $desc := .Description | default $config.description }} +
+
+ + +
+
+
+ {{ partial "hero.html" . }} +
+ +
+ {{ with $config.alias }} + {{ partial "heading.html" (dict "text" "Alias" "level" 2) }} + +

+ This component was previously called the {{ . }} {{ $kindSingular }}. Make sure to update your + Vector configuration to accommodate the name change: +

+ + {{ $diff := printf "[%s.%s]\n+type = \"%s\"\n-type = \"%s\"" $kind $tag $tag . }} + + {{ highlight $diff "diff" "" }} + {{ end }} + + {{/* Component requirements */}} + {{ with $config.support.requirements }} + {{ partial "heading.html" (dict "text" "Requirements" "level" 2) }} + {{ partial "data.html" (dict "component_requirements" .) }} + {{ end }} + + {{/* Component warnings */}} + {{ with $config.support.warnings }} + {{ partial "heading.html" (dict "text" "Warnings" "level" 2) }} + {{ partial "data.html" (dict "component_warnings" .) }} + {{ end }} + + {{/* Component configuration */}} + {{ with $config.configuration }} + {{ if gt (len .) 1 }} {{/* Don't display if only the "type" config is present */}} + {{ partial "heading.html" (dict "text" "Configuration" "level" 2) }} + {{ partial "data.html" (dict "component_config" . ) }} + {{ end }} + {{ end }} + + {{/* Component environment variables */}} + {{ with $config.env_vars }} + {{ partial "heading.html" (dict "text" "Environment variables" "level" 2) }} + {{ partial "data.html" (dict "component_env_vars" . ) }} + {{ end }} + + {{/* Component log/metric output */}} + {{ with $config.output }} + {{ partial "heading.html" (dict "text" "Output" "level" 2) }} + {{ partial "data.html" (dict "component_output" . ) }} + {{ end }} + + {{/* Component telemetry output */}} + {{ with $config.telemetry }} + {{ partial "heading.html" (dict "text" "Telemetry" "level" 2) }} + {{ partial "data.html" (dict "component_telemetry" . ) }} + {{ end }} + + {{/* Component examples */}} + {{ with $config.examples }} + {{ partial "heading.html" (dict "text" "Examples" "level" 2) }} + {{ partial "data.html" (dict "component_examples" . ) }} + {{ end }} + + {{/* Cloud platform permissions */}} + {{ with $config.permissions }} + {{ partial "heading.html" (dict "text" "Permissions" "level" 2) }} + {{ partial "data.html" (dict "component_permissions" .) }} + {{ end }} + + {{/* How it works */}} + {{ with $config.how_it_works }} + {{ partial "heading.html" (dict "text" "How it works" "level" 2) }} + + {{ range $k, $v := . }} +
+ {{ partial "heading.html" (dict "text" $v.title "level" 3) }} + + {{ with .svg }} + {{ partial "svg.html" (dict "src" .) }} + {{ end }} + + {{ $v.body | $.Page.RenderString }} + + {{ with $v.sub_sections }} + {{ range . }} + {{ partial "heading.html" (dict "text" .title "level" 4) }} + + {{ with .svg }} + {{ partial "svg.html" (dict "src" .) }} + {{ end }} + + {{ .body | $.Page.RenderString }} + {{ end }} +
+ {{ end }} + + {{ end }} + {{ end }} +
+
+
+ + +
+
+{{ end }} + +{{ define "below" }} +{{ partial "docs/pagination.html" . }} +{{ end }} + +{{ define "subfooter" }} +{{ partial "docs/mobile-nav.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/docs/section.html b/docs/layouts/docs/section.html new file mode 100644 index 0000000000000..7972be67c7fde --- /dev/null +++ b/docs/layouts/docs/section.html @@ -0,0 +1,15 @@ +{{ define "title" }} +{{ .Title }} | Vector documentation +{{ end }} + +{{ define "main" }} +{{ partial "docs/dashboard.html" . }} +{{ end }} + +{{ define "below" }} +{{ partial "docs/pagination.html" . }} +{{ end }} + +{{ define "subfooter" }} +{{ partial "docs/mobile-nav.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/docs/single.html b/docs/layouts/docs/single.html new file mode 100644 index 0000000000000..7972be67c7fde --- /dev/null +++ b/docs/layouts/docs/single.html @@ -0,0 +1,15 @@ +{{ define "title" }} +{{ .Title }} | Vector documentation +{{ end }} + +{{ define "main" }} +{{ partial "docs/dashboard.html" . }} +{{ end }} + +{{ define "below" }} +{{ partial "docs/pagination.html" . }} +{{ end }} + +{{ define "subfooter" }} +{{ partial "docs/mobile-nav.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/download/section.html b/docs/layouts/download/section.html new file mode 100644 index 0000000000000..aff64c8bf6fad --- /dev/null +++ b/docs/layouts/download/section.html @@ -0,0 +1,127 @@ +{{/* TODO: find a way to generate less HTML for displaying the download info */}} + +{{ define "title" }} +Download | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $releases := site.Data.docs.releases }} +{{ $versions := site.Data.docs.versions }} +{{ $latest := index $versions 0 }} +
+
+ {{ partial "hero.html" . }} + +
+
+ {{ partial "download/release-toggle.html" . }} + + {{ partial "download/version-selector.html" . }} + + {{ template "latest-toggler" }} +
+
+ + {{/* Stable releases */}} + {{ range $k, $v := $releases }} +
+
+ + Date {{ $v.date }} + + + + License MPL 2.0 + + + + {{ $k }} release notes + +
+ +
+
+
+
+ {{ partial "heading.html" (dict "text" "Downloads" "level" 2) }} +
+ +
+ {{ partial "download/download-matrix.html" (dict "version" $k) }} +
+
+ +
+
+ {{ partial "heading.html" (dict "text" "Other methods" "level" 2) }} +
+ +
+ {{ partial "download/links.html" . }} +
+
+
+
+
+ {{ end }} + + {{/* Nightly release */}} +
+
+ + Date + + + + License MPL 2.0 + +
+ +
+
+
+ {{ template "download-heading" (dict "text" "Download") }} + +
+ {{ partial "download/download-matrix.html" (dict "version" "nightly") }} +
+ +
+ {{/* Heroicon: outline/exclamation */}} + + + + + + + + Nightly versions contain bleeding-edge changes that may contain bugs. Proceed with caution. + +
+
+ +
+ {{ template "download-heading" (dict "text" "Other methods") }} + +
+ {{ partial "download/links.html" . }} +
+
+
+
+
+
+
+{{ end }} + +{{ define "download-heading" }} +

+ {{ .text }} +

+{{ end }} + +{{ define "latest-toggler" }} + +{{ end }} \ No newline at end of file diff --git a/docs/layouts/guides/integrate.html b/docs/layouts/guides/integrate.html new file mode 100644 index 0000000000000..b4fd97581e989 --- /dev/null +++ b/docs/layouts/guides/integrate.html @@ -0,0 +1,110 @@ +{{ define "title" }} +Send {{ .Params.data }}{{ with .Params.from }} from {{ .name }}{{ end }}{{ with .Params.to }} to {{ .name }}{{ end }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $ctx := . }} +{{ $role := .Params.role | default "agent" }} +
+
+
+ {{ partial "guides/integrate/hero.html" . }} +
+ +
+ {{ with .Params.data }} + {{ $src := printf "data/%s" . }} + {{ template "snippet" (dict "src" $src "ctx" $ctx) }} + {{ end }} + + {{ template "tagline" .Params }} + + {{/* Background section */}} + {{ with .Params.background }} +
+ + {{ $heading := printf "What is %s?" . }} + {{ partial "heading.html" (dict "text" "Background" "level" 2) }} + {{ partial "heading.html" (dict "text" $heading "level" 3) }} + {{ $src := printf "background/%s" (. | urlize) }} + {{ template "snippet" (dict "src" $src "ctx" $ctx) }} + {{ end }} + +
+ + {{/* Strategy section */}} + {{ partial "heading.html" (dict "text" "Strategy" "level" 2) }} + {{ partial "heading.html" (dict "text" "How this guide works" "level" 3) }} + + {{ template "snippet" (dict "src" "vector" "ctx" .) }} + + {{ $article := cond (eq $role "agent") "an" "a" }} + In this guide, we'll deploy Vector as {{ $article }} {{ $role }}. + + {{ $img := cond (eq $role "agent") "daemon" "aggregator" }} + {{ $src := printf "img/%s-role.svg" $img }} + {{ partial "svg.html" (dict "src" $src) }} + + {{/* Accomplish section */}} +
+ {{ partial "heading.html" (dict "text" "What we'll accomplish" "level" 2) }} + +

+ We'll build an observability pipeline that: +

+ +
+ {{ template "check" }} + + + Collects your {{ .Params.data }} {{ template "from-to" .Params }} + +
+
+ + {{/* Tutorial section */}} + {{ with .Params.tutorial }} +
+ {{ partial "heading.html" (dict "text" "Tutorial" "level" 2) }} + +
+ {{ partial "guides/tutorial.html" . }} +
+
+ {{ end }} +
+
+ + +
+{{ end }} + +{{ define "snippet" }} +{{ $path := printf "snippets/guides/integrate/%s.md" .src }} +{{ readFile $path | .ctx.RenderString }} +{{ end }} + +{{ define "tagline" }} +

+ Fear not! In this guide we'll build an observability pipeline that sends {{ .data }}{{ with .from }} from {{ .name }}{{ end }}{{ with .to }} to {{ .name }}{{ end }}. +

+{{ end }} + +{{ define "link" }} +{{ if .href }}{{ .name }}{{ else }}{{ .name }}{{ end }} +{{ end }} + +{{ define "from-to" }} +{{ with .from }} from {{ template "link" . }}{{ end }} +{{ end }} + +{{ define "check" }} +{{/* Heroicon: outline/check */}} + + + +{{ end }} \ No newline at end of file diff --git a/docs/layouts/guides/li.html b/docs/layouts/guides/li.html new file mode 100644 index 0000000000000..451e31dc5f4ea --- /dev/null +++ b/docs/layouts/guides/li.html @@ -0,0 +1,42 @@ +{{ $title := .Params.short | default .Title }} +{{ $section := cond (eq .CurrentSection.Parent.Title "Integrate") "Integrate" .CurrentSection.Title }} + + \ No newline at end of file diff --git a/docs/layouts/guides/list.html b/docs/layouts/guides/list.html new file mode 100644 index 0000000000000..dcfea9d275241 --- /dev/null +++ b/docs/layouts/guides/list.html @@ -0,0 +1,5 @@ +
+ {{ range .RegularPages }} + {{ .Render "li" }} + {{ end }} +
\ No newline at end of file diff --git a/docs/layouts/guides/section.html b/docs/layouts/guides/section.html new file mode 100644 index 0000000000000..0a14d428b74f8 --- /dev/null +++ b/docs/layouts/guides/section.html @@ -0,0 +1,105 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $desc := .Description }} +{{ $numSections := len .Sections }} +{{ $isRoot := eq .FirstSection .CurrentSection }} +
+
+ {{ partial "hero.html" . }} +
+ +
+ {{ if $isRoot }} + {{ $columnedSections := where .Sections ".Params.self_standing" "ne" true }} + {{ $fullWidthSections := where .Sections ".Params.self_standing" true }} + +
+ {{ range $columnedSections }} +
+ + {{ partial "heading.html" (dict "text" .Title "level" 2 "href" .RelPermalink "icon" false) }} + + + {{ with .Description }} +
+ {{ . | markdownify }} +
+ {{ end }} + +
+ {{ .Render "list" }} +
+
+ {{ end }} +
+ + {{ range $fullWidthSections }} +
+ + {{ partial "heading.html" (dict "text" .Title "level" 2 "href" .RelPermalink "icon" false) }} + + + {{ with .Description }} +
+ {{ . | markdownify }} +
+ {{ end }} + +
+ {{ range .Sections }} +
+ + {{ partial "heading.html" (dict "text" .Title "level" 3 "href" .RelPermalink "icon" false) }} + + + {{ with .Description }} +
+ {{ . | markdownify }} +
+ {{ end }} + +
+ {{ .Render "list" }} +
+
+ {{ end }} +
+
+ {{ end }} + {{ else }} +
+ {{ with .Sections }} +
+ {{ range . }} +
+ + {{ partial "heading.html" (dict "text" .Title "level" 3 "href" .RelPermalink "icon" false) }} + + + {{ with .Description }} +
+ {{ . | markdownify }} +
+ {{ end }} + +
+ {{ .Render "list" }} +
+
+ {{ end }} +
+ {{ else }} + {{ .Render "list" }} + {{ end }} +
+ {{ end }} +
+
+{{ end }} + +{{ define "below" }} +{{ partial "guides/pagination.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/guides/single.html b/docs/layouts/guides/single.html new file mode 100644 index 0000000000000..12ed267da69e9 --- /dev/null +++ b/docs/layouts/guides/single.html @@ -0,0 +1,31 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +
+
+
+ {{ partial "hero.html" . }} + +
+ {{ partial "guides/badges.html" . }} +
+
+ +
+ {{ partial "content.html" . }} +
+
+ + +
+{{ end }} + +{{ define "below" }} +{{ partial "guides/pagination.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/highlights/li.html b/docs/layouts/highlights/li.html new file mode 100644 index 0000000000000..9ae3a10113714 --- /dev/null +++ b/docs/layouts/highlights/li.html @@ -0,0 +1,63 @@ +{{ $title := .Title | markdownify }} +{{ $date := .Date | dateFormat "January 2, 2006" }} +{{ $badges := .Params.badges }} +
+ +
+ + {{ $title }} + + +

+ +

+ +
+ +
+ {{ with $badges.type }} + {{ partial "badge.html" (dict "prefix" "type" "word" . "color" "blue" "inline" true) }} + {{ end }} + + {{ range $badges.domains }} + {{ partial "badge.html" (dict "prefix" "domain" "word" . "color" "indigo" "inline" true) }} + {{ end }} + + {{ range $badges.sources }} + {{ partial "badge.html" (dict "prefix" "source" "word" . "color" "violet" "inline" true) }} + {{ end }} + + {{ range $badges.transforms }} + {{ partial "badge.html" (dict "prefix" "transform" "word" . "color" "violet" "inline" true) }} + {{ end }} + + {{ range $badges.sinks }} + {{ partial "badge.html" (dict "prefix" "sink" "word" . "color" "violet" "inline" true) }} + {{ end }} +
+
+ +
\ No newline at end of file diff --git a/docs/layouts/highlights/section.html b/docs/layouts/highlights/section.html new file mode 100644 index 0000000000000..bff360415e21d --- /dev/null +++ b/docs/layouts/highlights/section.html @@ -0,0 +1,61 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $highlights := .RegularPages }} +{{ $versions := site.Data.docs.versions }} +{{ $latest := index $versions }} +{{ $highlights := .RegularPages }} +{{ $numVersions := len $versions }} +
+
+ {{ partial "hero.html" . }} + + +
+
    + {{ range $idx, $version := $versions }} + {{ $isLast := eq $idx (sub $numVersions 1) }} + {{ $thisVersionHighlights := where $highlights ".Params.release" "eq" . }} + {{ if gt (len $thisVersionHighlights) 0 }} +
  • +
    + {{ if not $isLast }} + + {{ end }} + +
    +
    + + {{/* Heroicon: outline/gear */}} + + + + + +
    + +
    +
    +
    + Version {{ . }} +
    +
    + +
    + {{ range $thisVersionHighlights }} + {{ .Render "li" }} + {{ end }} +
    +
    +
    +
    +
  • + {{ end }} + {{ end }} +
+
+
+
+{{ end }} \ No newline at end of file diff --git a/docs/layouts/highlights/single.html b/docs/layouts/highlights/single.html new file mode 100644 index 0000000000000..86dee069026cb --- /dev/null +++ b/docs/layouts/highlights/single.html @@ -0,0 +1,27 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +
+
+
+ {{ partial "hero.html" . }} +
+ +
+ {{ partial "content.html" . }} +
+
+ + +
+{{ end }} + +{{ define "below" }} +{{ partial "highlights/pagination.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/home.html b/docs/layouts/home.html new file mode 100644 index 0000000000000..31940438faa0d --- /dev/null +++ b/docs/layouts/home.html @@ -0,0 +1,19 @@ +{{ define "main" }} +{{ partial "home/hero.html" . }} +
+{{ partial "home/what.html" . }} +
+{{ partial "home/why-vector.html" . }} +
+{{ partial "home/platform.html" . }} +{{/* +
+{{ partial "home/configure.html" . }} +*/}} +
+{{ partial "home/installation.html" . }} +
+{{ partial "home/components.html" . }} +
+{{ partial "home/community.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/admonition.html b/docs/layouts/partials/admonition.html new file mode 100644 index 0000000000000..031c8e4d5d6f1 --- /dev/null +++ b/docs/layouts/partials/admonition.html @@ -0,0 +1,57 @@ +{{ $info := "blue-400" }} +{{ $success := "green-400" }} +{{ $danger := "red-400" }} +{{ $warning := "yellow-400" }} +{{ $requirement := "violet-400" }} +{{ $quote := "gray-400" }} +{{ $types := dict "info" $info "success" $success "danger" $danger "warning" $warning "requirement" $requirement "quote" $quote }} +{{ $color := index $types .type }} +{{ $dimension := 6 }} +{{ $viewBox := cond (eq .type "requirement") 24 20 }} +
+
+
+ +
+
+ {{ with .title }} + + {{ . }} + + {{ end }} + +
+ {{ .content | markdownify }} +
+
+
+
diff --git a/docs/layouts/partials/badge.html b/docs/layouts/partials/badge.html new file mode 100644 index 0000000000000..2860c5a4d49fe --- /dev/null +++ b/docs/layouts/partials/badge.html @@ -0,0 +1,18 @@ +{{ $red := "text-red-700 bg-red-100 dark:text-white dark:bg-red-600" }} +{{ $blue := "text-blue-800 bg-blue-100 dark:text-blue-100 dark:bg-blue-600" }} +{{ $yellow := "text-yellow-800 bg-yellow-100 dark:text-black dark:bg-yellow-400" }} +{{ $gray := "text-gray-800 bg-gray-100 dark:text-dark dark:bg-gray-400" }} +{{ $green := "text-green-800 bg-green-100 dark:text-lime-50 dark:bg-lime-600" }} +{{ $indigo := "text-indigo-800 bg-indigo-100 dark:text-indigo-100 dark:bg-indigo-800" }} +{{ $violet := "text-violet-800 bg-violet-100 dark:text-violet-100 dark:bg-violet-800" }} +{{ $styles := dict "red" $red "blue" $blue "yellow" $yellow "gray" $gray "green" $green "indigo" $indigo "violet" $violet }} +{{ $color := index $styles .color }} +{{ with .href }}{{ end }} + + {{ if .prefix }} + {{ .prefix }}: {{- .word -}} + {{ else }} + {{ .word }} + {{ end }} + +{{ if .href }}{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/banner.html b/docs/layouts/partials/banner.html new file mode 100644 index 0000000000000..9909e679b9b3e --- /dev/null +++ b/docs/layouts/partials/banner.html @@ -0,0 +1,31 @@ +
+
+
+

+ + Vector is joining Datadog! + + + Learn more + +

+
+
+ +
+
+
diff --git a/docs/layouts/partials/blog/authors.html b/docs/layouts/partials/blog/authors.html new file mode 100644 index 0000000000000..04dc2fb4badd6 --- /dev/null +++ b/docs/layouts/partials/blog/authors.html @@ -0,0 +1,22 @@ +
+
+
+ {{ range .Params.authors }} + {{ $img := printf "https://github.com/%s.png" . }} + {{ $name := (index (where site.Data.docs.authors ".handle" "eq" .) 0).name }} + Author photo for {{ $name }} + {{ end }} +
+
+ + +
+ {{ range .Params.authors }} + {{ $name := (index (where site.Data.docs.authors ".handle" "eq" .) 0).name }} + {{ $link := printf "https://github.com/%s" . }} + + {{ $name }} + + {{ end }} +
+
\ No newline at end of file diff --git a/docs/layouts/partials/blog/hero.html b/docs/layouts/partials/blog/hero.html new file mode 100644 index 0000000000000..fdfd9659941cf --- /dev/null +++ b/docs/layouts/partials/blog/hero.html @@ -0,0 +1,34 @@ +{{ $date := .Date | dateFormat "January 2, 2006" }} +
+
+
+ {{ partial "breadcrumb.html" . }} +
+ +

+ {{ .Title | markdownify }} +

+ + {{ with .Description }} +

+ {{ . | markdownify }} +

+ {{ end }} + +
+ + + + {{ .ReadingTime }} min read + +
+ +
+ {{ partial "blog/authors.html" . }} +
+
+
\ No newline at end of file diff --git a/docs/layouts/partials/blog/pagination.html b/docs/layouts/partials/blog/pagination.html new file mode 100644 index 0000000000000..af28c6af0f0c8 --- /dev/null +++ b/docs/layouts/partials/blog/pagination.html @@ -0,0 +1,5 @@ +{{ if or (ne nil .NextInSection) (ne nil .PrevInSection) }} +
+ {{ partial "pagination.html" . }} +
+{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/breadcrumb.html b/docs/layouts/partials/breadcrumb.html new file mode 100644 index 0000000000000..25a506639b81b --- /dev/null +++ b/docs/layouts/partials/breadcrumb.html @@ -0,0 +1,27 @@ +{{ define "breadcrumb" }} +{{ if .p1.Parent }} +{{ template "breadcrumb" (dict "p1" .p1.Parent "p2" .p2) }} +{{ else if not .p1.IsHome }} +{{ template "breadcrumb" (dict "p1" .p1.Site.Home "p2" .p2) }} +{{ end }} +{{ $isHere := eq .p1 .p2 }} +{{ $title := .p1.Params.breadcrumb | default .p1.Params.short | default .p1.Title }} +
  • +
    + {{ if not .p1.IsHome }} + + {{ end }} + + {{ $title | markdownify }} + +
    +
  • +{{ end }} + + \ No newline at end of file diff --git a/docs/layouts/partials/community/hero.html b/docs/layouts/partials/community/hero.html new file mode 100644 index 0000000000000..8742386df54c6 --- /dev/null +++ b/docs/layouts/partials/community/hero.html @@ -0,0 +1,44 @@ +{{ $buttons := .Params.buttons }} +{{ $desc := .Description }} + +
    +
    +
    +

    + {{ .Title }} +

    + + {{ with $desc }} +

    + {{ . | markdownify }} +

    + {{ end }} + + +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/content.html b/docs/layouts/partials/content.html new file mode 100644 index 0000000000000..b075e841378b1 --- /dev/null +++ b/docs/layouts/partials/content.html @@ -0,0 +1,3 @@ +
    + {{ .Content }} +
    \ No newline at end of file diff --git a/docs/layouts/partials/css.html b/docs/layouts/partials/css.html new file mode 100644 index 0000000000000..ebf9fe8764a7d --- /dev/null +++ b/docs/layouts/partials/css.html @@ -0,0 +1,34 @@ +{{ $serverMode := site.IsServer }} +{{ $isHome := .IsHome }} +{{ $cssInputs := site.Params.css }} +{{ $includePaths := slice "node_modules" }} +{{ $devOpts := dict "includePaths" $includePaths "enableSourceMap" true }} +{{ $prodOpts := dict "includePaths" $includePaths "outputStyle" "compressed" }} +{{ $cssOpts := cond $serverMode $devOpts $prodOpts }} +{{ $postCssOpts := dict "inlineImports" true }} +{{ $ctx := . }} + +{{ range $cssInputs }} +{{ $opts := merge $cssOpts (dict "targetPath" .output) }} + +{{ $postProcess := .post_process }} +{{ $css := resources.Get .input | resources.ExecuteAsTemplate .input $ctx | toCSS $opts }} + +{{ if .postcss }} +{{ $css = $css | postCSS $postCssOpts }} +{{ end }} + +{{ if not (and (not $isHome) .home_page_only) }} +{{ if $serverMode }} + +{{ else }} +{{ $css = $css | fingerprint }} + +{{ if $postProcess }} +{{ $css = $css | resources.PostProcess }} +{{ end }} + + +{{ end }} +{{ end }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/data.html b/docs/layouts/partials/data.html new file mode 100644 index 0000000000000..cec3ceded9267 --- /dev/null +++ b/docs/layouts/partials/data.html @@ -0,0 +1,1709 @@ +{{/* This partial is for pretty much all structured data (VRL stuff, CLI, API, component configs/output/telemetry, etc.) */}} +{{ $ctx := . }} +
    + {{/* Source/transform/sink config */}} + {{ with .component_config }} +
    + {{ range $k, $v := . }} + {{ if ne $k "type" }} + {{ $name := $k }} +
    + + {{/* Config name */}} + + {{ partial "heading.html" (dict "text" $name "level" 3 "anchor" true "icon" false) }} + + + {{/* Config labels */}} + + {{ if $v.common }} + {{ partial "badge.html" (dict "word" "common" "color" "blue") }} + {{ end }} + + {{ if $v.required }} + {{ partial "badge.html" (dict "word" "required" "color" "red") }} + {{ else }} + {{ partial "badge.html" (dict "word" "optional" "color" "gray") }} + {{ end }} + + {{ range $k, $v := $v.type }} + {{ $isArray := eq $k "array" }} + {{ if $isArray }} + {{ range $k, $v := $v.items.type }} + {{ $name := printf "[%s]" $k }} + {{ partial "badge.html" (dict "word" $name "color" "gray") }} + {{ end }} + {{ else }} + {{ partial "badge.html" (dict "word" $k "color" "gray") }} + {{ end }} + + {{ if $v.enum }} + {{ partial "badge.html" (dict "word" "enum" "color" "yellow") }} + {{ end }} + {{ end }} + + + +
    + {{ $v.description | markdownify }} +
    + + {{ range $k, $v := $v.type }} + {{ if eq $k "object" }} {{/* Object (with sub-configs) */}} +
    + {{ range $k, $v := $v.options }} +
    + + + {{ $text := printf "%s.%s" $name $k }} + {{ partial "heading.html" (dict "text" $text "level" 4 "anchor" true "icon" false "id" $text) }} + + + + {{ if $v.required }} + {{ partial "badge.html" (dict "word" "required" "color" "red") }} + {{ else }} + {{ partial "badge.html" (dict "word" "optional" "color" "blue") }} + {{ end }} + + {{ range $k, $v := $v.type }} + {{ partial "badge.html" (dict "word" $k "color" "gray") }} + + {{ with $v.syntax }} + {{ partial "badge.html" (dict "word" $v.syntax "color" "gray") }} + {{ end }} + {{ end }} + + + +
    + {{ $v.description | markdownify }} +
    + + {{/* "Relevant when" conditions */}} + {{ with .relevant_when }} +
    + + Relevant when: {{ . }} + +
    + {{ end }} + + {{/* Default value */}} + {{ range $k, $v := $v.type }} + {{ if or $v.default (eq $v.default false) }} +
    + {{ template "default" . }} +
    + {{ end }} + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* Enum */}} + {{ with $v.enum }} +
    + + + Enum options + + + + {{ partial "badge.html" (dict "word" $k "color" "gray") }} + {{ partial "badge.html" (dict "word" $v.syntax "color" "gray") }} + + + +
    + {{ template "enum-options-table" . }} +
    +
    + {{ end }} + + {{/* Array */}} + {{ if eq $k "array" }} + {{ with $v.items }} +
    + {{ range $k, $v := . }} + {{ range $k, $v := . }} + + + Array + + + + {{ partial "badge.html" (dict "word" $k "color" "gray") }} + {{ partial "badge.html" (dict "word" $v.syntax "color" "gray") }} + + + + {{ with $v.examples }} + {{ $json := . | jsonify (dict "indent" " ") }} +
    + + + Examples + + + {{ template "config-toggler" (dict "size" 4) }} + + +
    + {{ highlight $json "json" "" }} +
    +
    + {{ end }} + {{ end }} + {{ end }} +
    + {{ end }} + {{ end }} + {{ end }} + + {{/* Default value */}} + {{ range $k, $v := $v.type }} + {{ if or $v.default (eq $v.default false) }} +
    + {{ template "default" . }} +
    + {{ end }} + {{ end }} +
    + {{ end }} + {{ end }} +
    + {{ end }} + + {{/* Source/transform/sink requirements */}} + {{ with .component_requirements }} +
    +
    + {{/* Heroicon: outline/exclamation */}} + + + +
    +
    + {{ range . }} +
    + {{ . | markdownify }} +
    + {{ end }} +
    +
    + {{ end }} + + {{/* Source/transform/sink output */}} + {{ with .component_output }} +
    + {{ with .metrics }} + + {{ partial "heading.html" (dict "text" "Metrics" "level" 3 "id" "output-metrics" "href" "#output-metrics") }} + + + {{/* Heroicon: solid/question-mark-circle */}} + + + + + + +
    + {{ template "telemetry" . }} +
    + {{ end }} + + {{ with .logs }} + + {{ partial "heading.html" (dict "text" "Logs" "level" 3 "id" "output-logs" "href" "#output-logs") }} + + + {{/* Heroicon: solid/question-mark-circle */}} + + + + + + +
    + {{ template "telemetry" . }} +
    + {{ end }} +
    + {{ end }} + + {{/* Source/transform/sink examples */}} + {{ with .component_examples }} + {{ $multiple := gt (len . ) 1 }} +
    + {{ if $multiple }} + {{ $first := index . 0 }} +
    + + +
    + {{ range . }} +
    + {{ template "example" . }} +
    + {{ end }} +
    +
    + {{ else }} + {{ $example := index . 0 }} +
    + {{ template "example" $example }} +
    + {{ end }} +
    + {{ end }} + + {{/* Source/transform/sink output */}} + {{ with .component_telemetry }} +
    + {{ with .metrics }} + + {{ partial "heading.html" (dict "text" "Metrics" "level" 3 "id" "telemetry-metrics" "href" "#telemetry-metrics") }} + + + link + + + +
    + {{ template "telemetry" . }} +
    + {{ end }} + + {{ with .logs }} + + {{ partial "heading.html" (dict "text" "Logs" "id" "telemetry-logs" "href" "#telemetry-logs") }} + + + link + + + +
    + {{ template "telemetry" . }} +
    + {{ end }} +
    + {{ end }} + + {{/* Source/transform/sink warnings */}} + {{ with .component_warnings }} +
    +
    + + + +
    +
    + {{ range . }} +
    + {{ . | markdownify }} +
    + {{ end }} +
    +
    + {{ end }} + + {{/* Source/transform/sink environment variables */}} + {{ with .component_env_vars }} +
    + {{ range $k, $v := . }} +
    + + + {{ $href := printf "#%s" $k | urlize }} + {{ partial "heading.html" (dict "text" $k "level" 3 "href" $href) }} + + + + {{ if $v.common }} + {{ partial "badge.html" (dict "word" "common" "color" "blue") }} + {{ end }} + + {{ if $v.required }} + {{ partial "badge.html" (dict "word" "required" "color" "red") }} + {{ else }} + {{ partial "badge.html" (dict "word" "optional" "color" "blue") }} + {{ end }} + + {{ range $k, $v := $v.type }} + {{ partial "badge.html" (dict "word" $k "color" "gray") }} + {{ partial "badge.html" (dict "word" $v.syntax "color" "gray") }} + {{ end }} + + + +
    + {{ $v.description | markdownify }} +
    + + {{ range $k, $v := $v.type }} + {{ with $v.default }} + + Default: {{ . }} + + {{ end }} + {{ end }} + + {{ range $k, $v := $v.type }} + {{ with $v.examples }} +
    + + + Examples + + + {{ template "config-toggler" (dict "size" 4) }} + + +
    + {{ range . }} +
    + + {{ . }} + +
    + {{ end }} +
    +
    + {{ end }} + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* Data schemas (logs and metrics) */}} + {{ with .data_schema }} +
    +
    + {{ .description | markdownify }} +
    + + {{/* Options */}} +
    + + {{ partial "heading.html" (dict "text" "Options" "level" 3) }} + + +
    + {{ range $k, $v := .type.object.options }} + {{ $name := $k }} + {{ $id := cond (eq $name "*") "star" $name }} +
    + + +

    + + {{ $name }} + +

    +
    + + + {{ if $v.common }} + {{ partial "badge.html" (dict "word" "common" "color" "indigo") }} + {{ end }} + + {{ if $v.required }} + {{ partial "badge.html" (dict "word" "required" "color" "red") }} + {{ else }} + {{ partial "badge.html" (dict "word" "optional" "color" "gray") }} + {{ end }} + + {{ range $k, $v := $v.type }} + {{ $type := cond (eq $k "object") "table" $k }} + {{ partial "badge.html" (dict "word" $type "color" "green") }} + {{ end }} + +
    + + {{ with $v.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + +
    + {{ range $k, $v := $v.type }} + {{ if eq $k "object" }} +
    +
    + {{ range $k, $v := $v.options }} + {{ $id := printf "%s-%s" $name $k }} +
    + + +

    + + {{ $k }} + +

    +
    + + + {{ if $v.required }} + {{ partial "badge.html" (dict "word" "required" "color" "red") }} + {{ else }} + {{ partial "badge.html" (dict "word" "optional" "color" "gray") }} + {{ end }} + + {{ range $k, $v := $v.type }} + {{ partial "badge.html" (dict "word" $k "color" "green") }} + + {{ with $v.syntax }} + {{ partial "badge.html" (dict "word" . "color" "gray") }} + {{ end }} + + {{ if $v.enum }} + {{ partial "badge.html" (dict "word" "enum" "color" "yellow") }} + {{ end }} + {{ end }} + +
    + +
    + {{ $v.description | markdownify }} +
    + + {{ range $k, $v := $v.type }} + {{ with $v.examples }} +
    + + Examples + + + + {{ range . }} + + {{ . }} + + {{ end }} + +
    + {{ end }} + {{ end }} +
    + {{ end }} +
    +
    + {{ end }} + {{ end }} +
    +
    + {{ end }} +
    +
    + + {{/* Examples */}} + {{ with .type.object.examples }} +
    + + {{ partial "heading.html" (dict "text" "Examples" "level" 3) }} + + +
    + {{ range . }} + {{ template "code" . }} + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + + {{/* VRL function info (/vrl/functions) */}} + {{ with .vrl_functions }} +
    + {{ range . }} + {{ $name := .name }} + {{ $func := index site.Data.docs.remap.functions .name }} + {{ $infallible := not $func.internal_failure_reasons }} + {{ $args := $func.arguments }} + {{ $lastArg := sub (len $args) 1 }} + {{ $return := $func.return }} +
    + {{/* Function title */}} + + + {{ $href := printf "#%s" $name }} + {{ partial "heading.html" (dict "text" $name "level" 3 "href" $href "icon" false) }} + + + {{/* Badges */}} + + {{ if $infallible }} + {{ partial "badge.html" (dict "word" "infallible" "color" "blue") }} + {{ else }} + {{ partial "badge.html" (dict "word" "fallible" "color" "red") }} + {{ end }} + + + + {{/* Function description */}} +
    + {{ $func.description | markdownify }} +
    + + {{/* Function spec, etc. */}} +
    + + Function spec + + +
    + {{ $name }}( + {{- range $idx, $arg := $args -}} + {{ $isLast := eq $idx $lastArg -}} + + {{- .name -}} + : + <{{ delimit .type ` | ` }}>{{ if not $isLast }}, {{ end -}} + {{ end -}} + ) + {{- with $return -}} +
    + :: <{{ delimit .types " | " }}> +
    + {{- end -}} +
    + + {{/* Function arguments */}} + {{ with $args }} +
    + {{ template "vrl-function-args" . }} +
    + {{ end }} + +
    + {{ template "vrl-function-legend" }} +
    + + {{ with $func.examples }} +
    + + + Examples + + + {{ template "config-toggler" (dict "size" 4) }} + + +
    + {{ range . }} + {{ template "vrl-function-example" . }} + {{ end }} +
    +
    + {{ end }} + + {{ with $func.notices }} +
    + + Notices + + + + This function has special behavior that you should be aware of. + + +
    + {{ range . }} +
    +
    + {{/* Heroicon: outline/exclamation */}} + + + +
    + +
    + {{ . | markdownify }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + + {{/* Real-world examples */}} + {{ with .vrl_real_world_examples }} +
    + {{ range . }} + {{ $input := dict "message" .input.log.message | jsonify (dict "indent" " ") }} + {{ $vrlSourceCode := highlight .source "toml" "" }} + {{ $output := .output | jsonify (dict "indent" " ") }} + {{ $outputCode := highlight $output "json" "" }} +
    + + {{ $href := printf "#%s" (.title | urlize) }} + {{ partial "heading.html" (dict "text" .title "level" 3 "href" $href "icon" false) }} + + +
    + {{ with .input.log }} + {{ $json := . | jsonify (dict "indent" " ") }} + {{ $code := highlight $json "json" "" }} + + Given this Vector log event... + + {{ $code }} + {{ end }} + + {{ with .input.metric }} + {{ $json := . | jsonify (dict "indent" " ") }} + {{ $code := highlight $json "json" "" }} + + Given this Vector metric event... + + {{ $code }} + {{ end }} + + + ...and this VRL program... + + + {{ $vrlSourceCode }} + + {{ if .raises }} + {{ $errorCode := highlight .raises.compiletime "ruby" "" }} + + ...you should see this error: + + + {{ $errorCode }} + {{ else }} + {{ with .input.log }} + ...the following log event is output: + {{ end }} + + {{ with .input.metric }} + ...the following metric event is output: + {{ end }} + + {{ $outputCode }} + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + + {{/* Compile-time errors */}} + {{ with .vrl_compile_time_errors }} +
    + {{ range $code, $error := . }} + {{ $id := printf "%s %s" $code $error.title | urlize }} +
    + +

    + + {{ $code }} + + + + {{ $error.title }} + +

    +
    + +
    + {{ with $error.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with $error.rationale }} +
    + + {{/* Heroicon: outline/zoom-in */}} + + + + + + Rationale + + + +
    + {{ . | markdownify }} +
    +
    + {{ end }} + + {{ with $error.resolution }} +
    + + {{/* Heroicon: outline/trending-up */}} + + + + + + Resolution + + + +
    + {{ . | markdownify }} +
    +
    + {{ end }} + + {{ with $error.examples }} +
    + + + {{/* Heroicon: outline/code */}} + + + + + + Examples + + + + {{ template "vrl-toggler" }} + + +
    + {{ range . }} +
    + + {{ .title }} + + + {{/* Example event (log or metric) */}} + {{ with .input }} + {{ with .log }} {{/* Log event */}} + {{ $json := . | jsonify (dict "indent" " ") }} +
    + + Log event + + + {{ highlight $json "json" "" }} +
    + {{ end }} + + {{ with .metric }} {{/* Metric event */}} + {{ $json := . | jsonify (dict "indent" " ") }} +
    + + Metric event + + + {{ highlight $json "json" "" }} +
    + {{ end }} + {{ end }} + + {{ with .source }} +
    + + VRL program + + + {{ highlight . "ruby" "" }} +
    + {{ end }} + + {{/* Example diff */}} + {{ with .diff }} +
    + + How to fix it + + + {{ highlight . "diff" "" }} +
    + {{ end }} +
    + {{ end }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + + {{/* VRL expressions */}} + {{ with .vrl_expressions }} +
    + {{ range $k, $v := . }} + {{ $id := $v.title | urlize }} +
    + + {{ partial "heading.html" (dict "text" $v.title "level" 3 "anchor" true "icon" false) }} + + +
    + {{ $v.description | markdownify }} +
    + + {{ with $v.grammar }} + {{ $id := printf "%s-grammar" $k }} +
    + + {{ partial "heading.html" (dict "text" "Grammar" "level" 4 "anchor" true "icon" false) }} + +
    + +
    +
    + {{ highlight .source "ruby" "" }} +
    + + {{ with .definitions }} +
    + + + + + + + + + {{ range $k, $v := . }} + + + + + {{ end }} + +
    + Argument + + Meaning +
    + + {{ $k }} + + + {{ $v.description | markdownify }} +
    +
    + {{ end }} +
    + {{ end }} + + {{ with $v.examples }} + {{ $id := printf "%s-examples" $k }} +
    + + {{ partial "heading.html" (dict "text" "Examples" "level" 4 "anchor" true "icon" false) }} + + +
    + {{ range . }} + {{ template "vrl-data-example" . }} + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* VRL examples */}} + {{ with .vrl_examples }} +
    + {{ range . }} + {{ $name := .name }} + {{ $link := printf "docs/reference/vrl/functions/#%s" $name | relURL }} +
    + + {{ partial "heading.html" (dict "text" $name "level" 3) }} + + +
    + {{ .description | markdownify }} +
    + +
    + {{ range .examples }} +
    + + {{ partial "heading.html" (dict "text" .title "level" 4) }} + + +
    + + Source + + +
    + {{ highlight .source "ruby" "" }} +
    +
    + + {{ with .return }} +
    + + Return + + +
    + {{ template "code" . }} +
    +
    + {{ end }} + +
    + + {{/* Heroicon: outline/light-bulb */}} + + + + + + + Learn more about the {{ $name }} function + +
    +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + + {{/* VRL syntax */}} + {{ with .vrl_syntax }} +
    + {{ range . }} +
    + {{ partial "heading.html" (dict "text" .title "level" 3) }} + + {{ with .description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with .examples }} +
    + + {{ partial "heading.html" (dict "text" "Examples" "level" 4) }} + + +
    + {{ range . }} + {{ highlight . "text" "" }} + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* VRL literals */}} + {{ with .vrl_literals }} +
    + {{ range $k, $v := . }} + {{ $href := printf "#%s" ($v.title | urlize) }} +
    + + {{ partial "heading.html" (dict "text" $v.title "level" 3 "href" $href "icon" false) }} + + + {{ with $v.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with $v.examples }} +
    + + {{ partial "heading.html" (dict "text" "Examples" "level" 4 "icon" false) }} + + +
    + {{ range . }} + {{ highlight . "ruby" "" }} + {{ end }} +
    +
    + {{ end }} + + {{ with $v.characteristics }} +
    + + {{ partial "heading.html" (dict "text" "Characteristics" "level" 4 "icon" false) }} + + +
    + {{ range . }} +
    + {{ partial "heading.html" (dict "text" .title "level" 5 "icon" false) }} + + {{ with .description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with .enum }} +
    + + Enum options + + +
    + {{ template "enum-options-table" . }} +
    +
    + {{ end }} +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* VRL concepts */}} + {{ with .vrl_concepts }} +
    + {{ range $k, $v := . }} + {{ $id := .anchor }} +
    + + {{ partial "heading.html" (dict "text" $v.title "level" 3) }} + + +
    + {{ $v.description | markdownify }} +
    + + {{ with $v.characteristics }} + {{ $id := printf "%s-characteristics" $id }} +
    + + {{ partial "heading.html" (dict "text" "Characteristics" "level" 4 "id" $id) }} + + +
    + {{ range . }} +
    + + {{ partial "heading.html" (dict "text" .title "level" 5) }} + + +
    + {{ .description | markdownify }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* VRL features */}} + {{ with .vrl_features }} +
    + {{ range . }} + {{ $id := .anchor }} +
    + + {{ partial "heading.html" (dict "text" .title "level" 3) }} + + +
    + {{ .description | markdownify }} +
    + + {{ with .characteristics }} + {{ $id := printf "%s-characteristics" $id }} +
    + + {{ partial "heading.html" (dict "text" "Characteristics" "level" 4) }} + + +
    + {{ range . }} +
    + {{ partial "heading.html" (dict "text" .title "level" 5) }} + +
    + {{ .description | markdownify }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} + + {{/* VRL principles */}} + {{ with .vrl_principles }} +
    + {{ range . }} +
    + + {{ partial "heading.html" (dict "text" .title "level" 3) }} + + +
    + {{ .description | markdownify }} +
    +
    + {{ end }} +
    + {{ end }} + + {{/* Vector process */}} + {{ with .process }} +
    + {{/* Signals */}} +
    + + {{ partial "heading.html" (dict "text" "Signals" "level" 3 "anchor" true) }} + + +
    + {{ .process_signals.description | markdownify }} +
    + +
    + + + + + + + + + {{ range .process_signals.signals }} + + + + + {{ end }} + +
    + Signal + + Description +
    + {{ .name }} + + {{ .description | markdownify }} +
    +
    +
    + + {{/* Exit codes */}} +
    + + {{ partial "heading.html" (dict "text" "Exit codes" "level" 3 "anchor" true) }} + + +
    + {{ .exit_codes.description | markdownify }} +
    + +
    + + + + + + + + + {{ range .exit_codes.codes }} + + + + + {{ end }} + +
    + Code + + Description +
    + {{ .code }} + + {{ .description | markdownify }} +
    +
    +
    +
    + {{ end }} + + {{ with .component_permissions }} +
    + {{ range . }} {{/* TODO: remove the need for this double loop in the CUE sources */}} + {{ range . }} +
    + + Platform: + + + {{ .platform_title }} + + + + +
    + + Relevant policies + + +
    + + + + + + + + + + {{ range .policies }} + + + + + + {{ end }} + +
    + Policy + + Required for + + Required when +
    + + + {{ .action }} + + + + {{ range .required_for }}{{ . }}{{ end }} + + {{ .required_when | markdownify }} +
    +
    +
    +
    + {{ end }} + {{ end }} +
    + {{ end }} +
    + +{{ define "enum-options-table" }} + + + + + + + + + {{ range $k, $v := . }} + + + + + {{ end }} + +
    + Option + + Description +
    + {{ $k }} + + {{ $v | markdownify }} +
    +{{ end }} + +{{ define "example" }} + + Given this event... + + +
    + {{ if or (reflect.IsMap .input) (reflect.IsSlice .input) }} + {{ $event := .input | jsonify (dict "indent" " ") | safeJS }} + {{ highlight $event "json" "" }} + {{ else }} + {{ .input | markdownify }} + {{ end }} +
    + + + ...and this Vector configuration... + + +
    + {{ if or (reflect.IsMap .configuration) (reflect.IsSlice .configuration) }} + {{ $json := .configuration | jsonify (dict "indent" " ") }} + {{ highlight $json "json" "" }} + {{ else }} + {{ highlight .configuration "toml" "" }} + {{ end }} +
    + +
    + {{ if reflect.IsSlice .output }} + {{ $multiple := gt (len .output) 1 }} + {{ if $multiple }} + {{ $kind := "" }} + {{ $event := slice }} + {{ range .output }} + {{ if .log }} + {{ $kind = "log" }} + {{ $event = $event | append .log }} + {{ end }} + {{ if .metric }} + {{ $kind = "metric" }} + {{ $event = $event | append .metric }} + {{ end }} + {{ end }} +
    + +{{ if eq $kind "log" }} + + ...this Vector log event is produced: + +{{ end }} + +{{ if eq $kind "metric" }} + + ...this Vector metric event is produced: + +{{ end }} + +{{ $json := $event | jsonify (dict "indent" " ") }} +
    + {{ highlight $json "json" "" }} +
    +{{ else }} +{{ $out := index .output 0 }} +{{ with $out.metric }} +{{ $json := . | jsonify (dict "indent" " ") }} + + ...this Vector metric event is produced: + + +
    + {{ highlight $json "json" "" }} +
    +{{ end }} + +{{ with $out.log }} +{{ $json := . | jsonify (dict "indent" " ") }} + + ...this Vector log event is produced: + + +
    + {{ highlight $json "json" "" }} +
    +{{ end }} +{{ end }} +{{ end }} + +{{ if reflect.IsMap .output }} +{{ with .output.log }} +{{ $json := . | jsonify (dict "indent" " ") }} + + ...this Vector log event is produced: + + +
    + {{ highlight $json "json" "" }} +
    +{{ end }} + +{{ with .output.metric }} +{{ $json := . | jsonify (dict "indent" " ") }} + + ...this Vector metric event is produced: + + +
    + {{ highlight $json "json" "" }} +
    +{{ end }} +{{ end }} +{{ end }} + +{{ define "config-toggler" }} +{{ $size := .size | default 4 }} + + {{/* Heroicon: outline/chevron-down */}} + + + + + {{/* Heroicon: outline/chevron-up */}} + + + + +{{ end }} + +{{ define "default" }} +
    + + default: + {{ .default }}{{ with .unit }} ({{ . }}){{ end }} + +
    +{{ end }} + +{{ define "vrl-function-example" }} +
    + + {{ .title }} + + +
    +
    + + Source + + +
    + {{ template "code" .source }} +
    +
    + + {{ with .return }} +
    + + Return + + +
    + {{ template "code" . }} +
    +
    + {{ end }} +
    +
    +{{ end }} + +{{ define "telemetry" }} +{{ range $k, $v := . }} +
    + + + {{ partial "heading.html" (dict "text" $k "level" 4) }} + + + {{ partial "badge.html" (dict "word" $v.type "color" "gray") }} + + + {{ with $v.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with $v.tags }} +
    +
    + {{ range $k, $v := . }} +
    + + + {{ $k }} + + + + {{ if $v.required }} + {{ partial "badge.html" (dict "word" "required" "color" "red") }} + {{ else }} + {{ partial "badge.html" (dict "word" "optional" "color" "blue") }} + {{ end }} + + + +
    + {{ $v.description }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    +{{ end }} +{{ end }} + +{{ define "vrl-function-legend" }} +{{/* Heroicon: outline/map */}} +
    + + + + + + required + + + + optional + + + + <types | ...> + +
    +{{ end }} + +{{ define "vrl-function-args" }} + + + + + + + + + + {{ range . }} + {{ $color := cond .required "text-secondary dark:text-primary" "text-indigo-500 dark:text-indigo-300" }} + + + + + + {{ end }} + +
    + Argument + + Type + + Description +
    + + {{ .name }} + + + + {{ range .type }} + {{ . }}
    + {{ end }} +
    +
    + {{ .description | markdownify }} +
    +{{ end }} + +{{ define "vrl-toggler" }} + +{{ end }} + +{{ define "vrl-data-example" }} +
    + {{ with .title }} + + {{ . }} + + {{ end }} + +
    + {{ with .input }} +
    + + Vector event + + +
    + {{ template "code" . }} +
    +
    + {{ end }} + + {{ with .source }} +
    + + VRL program + + +
    + {{ template "code" . }} +
    +
    + {{ end }} + + {{ with .return }} +
    + + Resulting event + + +
    + {{ template "code" . }} +
    +
    + {{ end }} +
    +
    +{{ end }} + +{{ define "code" }} +{{ if or (reflect.IsMap .) (reflect.IsSlice .) }} +{{ $json := . | jsonify (dict "indent" " ") }} +{{ highlight $json "json" "" }} +{{ else }} +{{ highlight . "ruby" "" }} +{{ end }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/docs/component-under-hero.html b/docs/layouts/partials/docs/component-under-hero.html new file mode 100644 index 0000000000000..352472c8242c1 --- /dev/null +++ b/docs/layouts/partials/docs/component-under-hero.html @@ -0,0 +1,58 @@ +{{ $tag := .File.BaseFileName }} +{{ $type := .CurrentSection.Params.component_type }} +{{ $config := index (index site.Data.docs.components $type) $tag }} +{{ $classes := $config.classes }} +{{ $output := $config.output }} +{{ $alias := $config.alias }} + +
    + {{ if eq $classes.development "beta" }} + {{ partial "badge.html" (dict "prefix" "status" "word" "beta" "color" "red" "inline" true) }} + {{ end }} + + {{ if eq $classes.development "stable" }} + {{ partial "badge.html" (dict "prefix" "status" "word" "stable" "color" "green" "inline" true) }} + {{ end }} + + {{ range $classes.deployment_roles }} + {{ partial "badge.html" (dict "prefix" "role" "word" . "color" "gray" "inline" true) }} + {{ end }} + + {{ if eq $classes.delivery "best_effort" }} + {{ partial "badge.html" (dict "prefix" "delivery" "word" "best effort" "color" "blue" "inline" true) }} + {{ end }} + + {{ if eq $classes.delivery "at_least_once" }} + {{ partial "badge.html" (dict "prefix" "delivery" "word" "at-least-once" "color" "blue" "inline" true) }} + {{ end }} + + {{ with $classes.egress_method }} + {{ partial "badge.html" (dict "prefix" "egress" "word" . "color" "indigo" "inline" true) }} + {{ end }} + + {{ if eq $classes.stateful false }} + {{ partial "badge.html" (dict "prefix" "state" "word" "stateless" "color" "indigo" "inline" true) }} + {{ else }} + {{ partial "badge.html" (dict "prefix" "state" "word" "stateful" "color" "indigo" "inline" true) }} + {{ end }} + + {{ range $k, $v := $output }} + {{ if eq $k "logs" }} + {{ partial "badge.html" (dict "prefix" "output" "word" "log" "color" "yellow" "inline" true) }} + {{ end }} + + {{ if eq $k "metrics" }} + {{ partial "badge.html" (dict "prefix" "output" "word" "metrics" "color" "yellow" "inline" true) }} + {{ end }} + {{ end }} + + {{ with $alias }} + {{ partial "badge.html" (dict "prefix" "previously known as" "word" . "color" "yellow" "inline" true) }} + {{ end }} +
    + +{{ if .Params.deprecated }} +
    + {{ partial "badge.html" (dict "prefix" "status" "word" "deprecated" "color" "red" "inline" true) }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/docs/dashboard.html b/docs/layouts/partials/docs/dashboard.html new file mode 100644 index 0000000000000..1278a7cd5fb15 --- /dev/null +++ b/docs/layouts/partials/docs/dashboard.html @@ -0,0 +1,42 @@ +{{/* The main documentation page content (three columns) */}} + +{{ $here := .RelPermalink }} +{{ $hasToc := not .Params.no_toc }} +
    +
    + + + {{ if $hasToc }} +
    +
    +
    + {{ partial "hero.html" . }} +
    + +
    + {{ partial "content.html" . }} +
    +
    +
    + + + {{ else }} +
    + {{ partial "hero.html" . }} +
    + {{ partial "content.html" . }} +
    +
    + {{ end }} +
    + + {{ partial "docs/slideover.html" . }} +
    \ No newline at end of file diff --git a/docs/layouts/partials/docs/edit.html b/docs/layouts/partials/docs/edit.html new file mode 100644 index 0000000000000..f383459332ab4 --- /dev/null +++ b/docs/layouts/partials/docs/edit.html @@ -0,0 +1,15 @@ +{{ $url := printf "https://github.com/timberio/vector/edit/master/website/content/%s/%s" .Lang .File }} +
    + +
    \ No newline at end of file diff --git a/docs/layouts/partials/docs/mobile-nav.html b/docs/layouts/partials/docs/mobile-nav.html new file mode 100644 index 0000000000000..aafecbcb889d5 --- /dev/null +++ b/docs/layouts/partials/docs/mobile-nav.html @@ -0,0 +1,24 @@ +{{/* The bottom navbar that appears on mobile in the docs */}} + diff --git a/docs/layouts/partials/docs/pagination.html b/docs/layouts/partials/docs/pagination.html new file mode 100644 index 0000000000000..4f1dce6346faa --- /dev/null +++ b/docs/layouts/partials/docs/pagination.html @@ -0,0 +1,5 @@ +{{ if or (ne nil .NextInSection) (ne nil .PrevInSection) }} +
    + {{ partial "pagination.html" . }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/docs/section-pages-list.html b/docs/layouts/partials/docs/section-pages-list.html new file mode 100644 index 0000000000000..f16fe58f1d9ee --- /dev/null +++ b/docs/layouts/partials/docs/section-pages-list.html @@ -0,0 +1,31 @@ +{{ $shouldRender := or .Sections .RegularPages }} +{{ $hasSections := .Sections }} + +{{ if $shouldRender }} + +
    + {{ with .Sections }} +

    + Subsections +

    + +
    + {{ range . }} + {{ .Render "section-card" }} + {{ end }} +
    + {{ end }} + + {{ with .RegularPages }} +

    + Pages in this section +

    + +
    + {{ range . }} + {{ .Render "section-card" }} + {{ end }} +
    + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/docs/sidebar.html b/docs/layouts/partials/docs/sidebar.html new file mode 100644 index 0000000000000..b7142219a2221 --- /dev/null +++ b/docs/layouts/partials/docs/sidebar.html @@ -0,0 +1,144 @@ +{{ $sections := where site.Sections "Section" "docs" }} +{{ $here := .RelPermalink }} +{{ $section := .CurrentSection }} +{{ $metaLinks := site.Menus.meta }} + +{{/* Iterate through all docs sections, including the root */}} +{{ range $sections }} +
    + {{ template "heading" (dict "here" $here "url" .RelPermalink "title" (.Params.short | default .Title )) }} + + {{ with .Sections }} + {{ range . }} + {{ template "section" (dict "ctx" . "here" $here "section" $section) }} + {{ end }} + {{ end }} + {{ end }} + + {{/* Extra "meta" links specified in config.toml (external links outside our doc tree) */}} +
    + {{ template "heading" (dict "title" "Meta" "hover" false) }} + +
    + {{ template "meta-menu" $metaLinks }} +
    +
    +
    + +{{ define "section" }} +{{ $here := .here }} +{{ $section := .section }} +
    + {{ template "heading" (dict "here" $here "url" .ctx.RelPermalink "title" (.ctx.Params.short | default .ctx.Title )) }} + +
    + {{ with .ctx.Sections }} + {{ range . }} + {{ $open := .IsAncestor $section }} +
    + + {{ template "link" (dict "here" $here "url" .RelPermalink "title" (.Params.short | default .Title )) }} + {{ template "chevron-icon" }} + + + {{ with .Pages }} +
    +
    + {{ range . }} + {{ if .IsSection }} + {{ template "subsection-group" (dict "ctx" . "here" $here "section" $section) }} + {{ end }} + + {{ if .IsPage }} + {{ template "link" (dict "here" $here "url" .RelPermalink "title" (.Params.short | default .Title)) }} + {{ end }} + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + {{ end }} + + {{ with .ctx.RegularPages }} + {{ range . }} + {{ template "link" (dict "here" $here "url" .RelPermalink "title" (.Params.short | default .Title )) }} + {{ end }} + {{ end }} +
    +
    +{{ end }} + +{{ define "subsection-group" }} +{{ $here := .here }} +{{ $section := .section }} +{{ $open := .ctx.IsAncestor $section }} +
    + + {{ template "link" (dict "here" $here "url" .ctx.RelPermalink "title" (.ctx.Params.short | default .ctx.Title)) }} + {{ template "chevron-icon" }} + + +
    + {{ with .ctx.Sections }} + {{ range . }} + {{ template "subsection-group" (dict "ctx" . "here" $here "section" $section) }} + {{ end }} + {{ end }} + + {{ with .ctx.RegularPages }} + {{ range . }} + {{ template "link" (dict "here" $here "url" .RelPermalink "title" (.Params.short | default .Title )) }} + {{ end }} + {{ end }} +
    +
    +{{ end }} + +{{ define "heading" }} +{{ $isActive := eq .here .url }} +{{ if .url }} + + {{ .title }} + +{{ else }} +

    + {{ .title }} +

    +{{ end }} +{{ end }} + +{{ define "link" }} +{{ $isActive := eq .here .url }} + + {{ .title }} + +{{ end }} + +{{ define "chevron-icon" }} + + {{/* Heroicon: outline/chevron-right */}} + + + + +{{ end }} + +{{ define "meta-menu" }} +{{ range . }} +

    + + + + {{ .Name }} + + + {{/* Heroicon: outline/external-link */}} + + + + + +

    +{{ end }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/docs/slideover.html b/docs/layouts/partials/docs/slideover.html new file mode 100644 index 0000000000000..ac2267ea65770 --- /dev/null +++ b/docs/layouts/partials/docs/slideover.html @@ -0,0 +1,42 @@ + + \ No newline at end of file diff --git a/docs/layouts/partials/download/download-matrix.html b/docs/layouts/partials/download/download-matrix.html new file mode 100644 index 0000000000000..7581038a95b65 --- /dev/null +++ b/docs/layouts/partials/download/download-matrix.html @@ -0,0 +1,60 @@ +{{ $version := .version }} +{{ $v1 := cond (eq $version "nightly") "nightly/latest" $version }} +{{ $host := site.Data.matrix.host }} +{{ $matrix := site.Data.docs.administration.downloads }} +
    + {{ range $matrix }} + {{ $file := .file }} + {{ $prefix := .prefix }} +
    +
    + {{/* Platform */}} + + {{ .title }} + +
    + +
    + {{/* File type */}} + + {{ .file_type }} + +
    + +
    + {{/* Targets (ARM, x86_64, etc.) */}} +
    + {{ range .options }} + {{ $vector := cond (eq $version "nightly") "vector/nightly" "vector" }} + {{ $url := .download_url | replaceRE "{v1}" $v1 | replaceRE "{v2}" $version }} + + + + {{/* Heroicon: outline/download */}} + + + + + + + {{ .arch }} + + + {{ end }} +
    +
    +
    + {{ end }} +
    + +{{ $version = cond (eq $version "nightly") "nightly/latest" $version }} +{{ $link := printf "https://packages.timber.io/vector/%s" $version }} + \ No newline at end of file diff --git a/docs/layouts/partials/download/links.html b/docs/layouts/partials/download/links.html new file mode 100644 index 0000000000000..c1fcf7c5f6c20 --- /dev/null +++ b/docs/layouts/partials/download/links.html @@ -0,0 +1,25 @@ +{{ $platforms := where site.RegularPages ".CurrentSection.Title" "eq" "Platforms" }} +{{ $packageManagers := where site.RegularPages ".CurrentSection.Params.short" "eq" "Package managers" }} +{{ $systems := where site.RegularPages ".CurrentSection.Params.short" "eq" "Operating systems" }} +{{ $manual := where site.RegularPages ".CurrentSection.Params.short" "eq" "Manual" }} +{{ $links := dict "Platforms" $platforms "Package managers" $packageManagers "Operating systems" $systems "Manual" $manual }} +
    + {{ range $k, $v := $links }} +
    +

    + {{ $k }} +

    + +
      + {{ range $v }} + {{ $title := .Params.short | default .Title }} +
    • + + {{ $title }} + +
    • + {{ end }} +
    +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/partials/download/release-toggle.html b/docs/layouts/partials/download/release-toggle.html new file mode 100644 index 0000000000000..4aab7291536e9 --- /dev/null +++ b/docs/layouts/partials/download/release-toggle.html @@ -0,0 +1,25 @@ +
    + + + + + {{/* Heroicon: outline/shield-check */}} + + + + + {{/* Heroicon: outline/moon */}} + + + +
    \ No newline at end of file diff --git a/docs/layouts/partials/download/version-selector.html b/docs/layouts/partials/download/version-selector.html new file mode 100644 index 0000000000000..daf46a674a538 --- /dev/null +++ b/docs/layouts/partials/download/version-selector.html @@ -0,0 +1,67 @@ +{{/* Dropdown version selector */}} +{{ $versions := site.Data.docs.versions }} +{{ $latest := index $versions 0 }} +
    +
    + +
    + + +
    \ No newline at end of file diff --git a/docs/layouts/partials/footer.html b/docs/layouts/partials/footer.html new file mode 100644 index 0000000000000..1bc2d55d8d683 --- /dev/null +++ b/docs/layouts/partials/footer.html @@ -0,0 +1,43 @@ +{{ $menu := site.Menus.footer }} +
    + +
    +
    + {{ range $menu }} +
    +

    + {{ if .URL }} + + {{ .Name }} + + {{ else }} + {{ .Name }} + {{ end }} +

    + + +
    + {{ end }} +
    + +
    +
    + {{ partial "social-buttons.html" (dict "color" false) }} +
    + +

    + © {{ now.Year }} {{ site.Copyright }}. All rights reserved. +

    +
    +
    +
    diff --git a/docs/layouts/partials/guides/badges.html b/docs/layouts/partials/guides/badges.html new file mode 100644 index 0000000000000..1488453d2c5d1 --- /dev/null +++ b/docs/layouts/partials/guides/badges.html @@ -0,0 +1,25 @@ +{{ $type := cond (eq .CurrentSection.Parent.Title "Integrate") "tutorial" "guide" }} +{{ partial "badge.html" (dict "prefix" "type" "word" $type "color" "red" "inline" true) }} + +{{ with .Params.domain }} +{{ partial "badge.html" (dict "prefix" "domain" "word" . "color" "green" "inline" true) }} +{{ end }} + +{{ range .Params.transforms }} +{{ $href := printf "/docs/reference/configuration/transforms/%s" . | relURL }} +{{ partial "badge.html" (dict "prefix" "transform" "word" . "color" "blue" "inline" true "href" $href) }} +{{ end }} + +{{ range .Params.sources }} +{{ $href := printf "/docs/reference/configuration/sources/%s" . | relURL }} +{{ partial "badge.html" (dict "prefix" "source" "word" . "color" "blue" "inline" true "href" $href) }} +{{ end }} + +{{ range .Params.sinks }} +{{ $href := printf "/docs/reference/configuration/sinks/%s" . | relURL }} +{{ partial "badge.html" (dict "prefix" "sink" "word" . "color" "blue" "inline" true "href" $href) }} +{{ end }} + +{{ with .Params.platform }} +{{ partial "badge.html" (dict "prefix" "platform" "word" . "color" "indigo" "inline" true) }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/guides/integrate/hero.html b/docs/layouts/partials/guides/integrate/hero.html new file mode 100644 index 0000000000000..5970722ee2ecd --- /dev/null +++ b/docs/layouts/partials/guides/integrate/hero.html @@ -0,0 +1,19 @@ +
    +
    + {{ partial "breadcrumb.html" . }} +
    + +

    + Send {{ .Params.data }}{{ with .Params.from }} from {{ .name }}{{ end }}{{ with .Params.to }} to {{ .name }}{{ end }} +

    + + {{ with .Description }} +

    + {{ . | markdownify }} +

    + {{ end }} + +
    + {{ partial "guides/badges.html" . }} +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/guides/pagination.html b/docs/layouts/partials/guides/pagination.html new file mode 100644 index 0000000000000..af28c6af0f0c8 --- /dev/null +++ b/docs/layouts/partials/guides/pagination.html @@ -0,0 +1,5 @@ +{{ if or (ne nil .NextInSection) (ne nil .PrevInSection) }} +
    + {{ partial "pagination.html" . }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/guides/tutorial.html b/docs/layouts/partials/guides/tutorial.html new file mode 100644 index 0000000000000..254cbd99d022a --- /dev/null +++ b/docs/layouts/partials/guides/tutorial.html @@ -0,0 +1,3 @@ +{{ range $k, $v := site.Data.docs.installation }} +{{ $k }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/heading.html b/docs/layouts/partials/heading.html new file mode 100644 index 0000000000000..99aa8cb0f4297 --- /dev/null +++ b/docs/layouts/partials/heading.html @@ -0,0 +1,28 @@ +{{ $id := (.id | default .text) | urlize }} +{{ $text := .text | markdownify }} +{{ $level := .level | default 2 }} +{{ $iconSizes := dict "1" "7" "2" "6" "3" "5" "4" "4" "5" "3" "6" "3" }} +{{ $n := index $iconSizes ($level | string) }} + + {{ if .href }} + + {{ $text }} + + {{ else if .anchor }} + + {{ $text }} + + {{ else }} + + {{ $text }} + + {{ end }} + + {{ if ne .icon false }} + + + + + + {{ end }} + \ No newline at end of file diff --git a/docs/layouts/partials/hero.html b/docs/layouts/partials/hero.html new file mode 100644 index 0000000000000..4fc7b1dbdb62b --- /dev/null +++ b/docs/layouts/partials/hero.html @@ -0,0 +1,18 @@ +
    + {{ partial "breadcrumb.html" . }} +
    + +

    + {{ .Title | markdownify }} +

    + +{{ with .Description }} +

    + {{ . | markdownify }} +

    +{{ end }} + +{{/* Component under-hero */}} +{{ if .Params.kind }} +{{ partial "docs/component-under-hero.html" . }} +{{ end }} diff --git a/docs/layouts/partials/highlights/authors.html b/docs/layouts/partials/highlights/authors.html new file mode 100644 index 0000000000000..4841cffbe487a --- /dev/null +++ b/docs/layouts/partials/highlights/authors.html @@ -0,0 +1,22 @@ +
    +
    +
    + {{ range .Params.authors }} + {{ $img := printf "https://github.com/%s.png" . }} + {{ $name := (index (where site.Data.docs.authors ".handle" "eq" .) 0).name }} + Author photo for {{ $name }} + {{ end }} +
    +
    + + +
    + {{ range .Params.authors }} + {{ $name := (index (where site.Data.docs.authors ".handle" "eq" .) 0).name }} + {{ $link := printf "https://github.com/%s" . }} + + {{ $name }} + + {{ end }} +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/highlights/pagination.html b/docs/layouts/partials/highlights/pagination.html new file mode 100644 index 0000000000000..3b8ab5acea883 --- /dev/null +++ b/docs/layouts/partials/highlights/pagination.html @@ -0,0 +1,5 @@ +{{ if or (ne nil .NextInSection) (ne nil .PrevInSection) }} +
    + {{ partial "pagination.html" . }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/home/community.html b/docs/layouts/partials/home/community.html new file mode 100644 index 0000000000000..7163aeeeb586c --- /dev/null +++ b/docs/layouts/partials/home/community.html @@ -0,0 +1,47 @@ +{{ $comm := .Params.community }} +{{ $social := site.Menus.community }} +
    +
    + {{ partial "home/heading.html" (dict "title" $comm.title) }} + + {{/* Project stats */}} +
    + {{ range $comm.stats }} +
    + + {{ .figure }} + + + {{ .title }} + +
    + {{ end }} +
    + + {{/* Social links */}} +
    +
    + {{ range $social }} + {{ template "community-button" . }} + {{ end }} +
    +
    +
    + + {{/* Spinning globe (see assets/js/home.tsx) */}} +
    +
    +
    +
    +
    +
    + +{{ define "community-button" }} + +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/home/components.html b/docs/layouts/partials/home/components.html new file mode 100644 index 0000000000000..a98cfb5008bf5 --- /dev/null +++ b/docs/layouts/partials/home/components.html @@ -0,0 +1,48 @@ +{{ $text := .Params.components }} +{{ $types := slice "Sources" "Transforms" "Sinks" }} +
    +
    + {{ partial "home/heading.html" (dict "title" $text.title) }} + +

    + {{ $text.description }} +

    +
    + +
    + {{ range $types }} + {{ $moreHref := printf "/docs/reference/configuration/%s" (. | lower) }} + {{ $type := . }} + {{ $components := where site.RegularPages ".CurrentSection.Params.short" . }} + {{ $num := len $components }} +
    + + + {{ $num }} + + {{ $type | lower }} + + +
    + {{ range first 10 $components }} + {{ $title := .Params.short | default .Title }} + {{ template "component-chip" (dict "title" $title "href" .RelPermalink) }} + {{ end }} +
    + + + {{/* Heroicons: outline/dots-horizontal */}} + + + + +
    + {{ end }} +
    +
    + +{{ define "component-chip" }} + + {{ .title }} + +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/home/configure.html b/docs/layouts/partials/home/configure.html new file mode 100644 index 0000000000000..4e48422dd116d --- /dev/null +++ b/docs/layouts/partials/home/configure.html @@ -0,0 +1,59 @@ +{{ $configure := .Params.configure }} +{{ $configs := $configure.example_configs }} +{{ $defaultConfig := (index $configs 0).title }} +
    +
    + {{ partial "home/heading.html" (dict "title" $configure.title) }} + +

    + {{ $configure.description }} +

    +
    + +
    +
    + {{ range $configs }} + + {{ end }} +
    + +
    +
    +
    + {{ template "dot" "red-500" }} + {{ template "dot" "yellow-500" }} + {{ template "dot" "green-500" }} +
    + +
    + + {{ $configure.filename }} + +
    +
    + +
    + {{ range $configs }} + {{ $code := highlight .config "toml" "" }} +
    + {{ $code }} +
    + {{ end }} +
    +
    +
    + +
    + + {{ $configure.below | markdownify }} + +
    +
    + +{{ define "dot" }} + +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/home/heading.html b/docs/layouts/partials/home/heading.html new file mode 100644 index 0000000000000..3416345721a6c --- /dev/null +++ b/docs/layouts/partials/home/heading.html @@ -0,0 +1,7 @@ +
    +

    + {{ .title }} +

    + +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/home/hero.html b/docs/layouts/partials/home/hero.html new file mode 100644 index 0000000000000..9da7e353f90f7 --- /dev/null +++ b/docs/layouts/partials/home/hero.html @@ -0,0 +1,51 @@ +{{ $tagline := site.Params.tagline }} +{{ $undertagline := site.Params.undertagline }} +{{ $subtagline := site.Params.subtagline }} +{{ $latest := index site.Data.docs.versions 0 }} +{{ $link := printf "releases/%s" $latest | relURL }} +{{ $links := site.Menus.doc_quick_links }} +{{ $modes := slice "Light" "Dark" }} + +
    +
    + + + New + + + Vector version {{ $latest }} + + {{/* Heroicon name: solid/chevron-right */}} + + + + + +
    + {{ range $modes }} + {{ $src := printf "/img/logos/vector-logo-%s.svg" (. | lower) }} +
    + {{ partial "svg.html" (dict "src" $src "class" "mx-auto w-3/4 md:w-7/12") }} +
    + {{ end }} +
    + +

    + {{ site.Params.description }} +

    + +
    + {{ range $links }} + +
    + + + + {{ .Name }} + +
    +
    + {{ end }} +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/home/installation.html b/docs/layouts/partials/home/installation.html new file mode 100644 index 0000000000000..d4e1066cbc7ef --- /dev/null +++ b/docs/layouts/partials/home/installation.html @@ -0,0 +1,74 @@ +{{ $install := .Params.installation }} +{{ $features := .Params.installation_features }} +{{ $methods := .Params.methods }} +{{ $commands := site.Data.docs.administration.install_commands }} +{{ $defaultCommand := (index $commands 0).title }} +
    +
    + {{ partial "home/heading.html" (dict "title" $install.title) }} + +

    + {{ $install.description }} +

    + +
    + {{ range $install.logos }} + {{ $logo := printf "/img/logos/%s" .logo }} + + {{ end }} +
    +
    + +
    +
    + {{ range $install.features }} +
    + + + + {{ .title }} + +
    + {{ end }} +
    +
    + +
    +
    +

    + Install with a one-liner: +

    + + {{ partial "one-liner.html" . }} +
    + +
    +

    + Or choose your preferred method: +

    + + +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/home/platform.html b/docs/layouts/partials/home/platform.html new file mode 100644 index 0000000000000..75ab419dc14b2 --- /dev/null +++ b/docs/layouts/partials/home/platform.html @@ -0,0 +1,39 @@ +{{ $platform := .Params.platform }} +
    + {{ partial "home/heading.html" (dict "title" $platform.title) }} + +

    + {{ $platform.description | safeHTML }} +

    + +
    + {{/* Selector */}} +
    + {{ range $platform.tabs }} + + {{ end }} +
    + + {{/* Selectable images */}} +
    + {{ range $platform.tabs }} + {{ $name := . | lower | urlize }} + {{ $svg := printf "/img/topologies/%s.svg" (. | urlize) }} + {{ $url := printf "/docs/setup/deployment/topologies/#%s" $name | relURL }} +
    +
    + {{ partial "svg.html" (dict "src" $svg) }} +
    + +
    +

    + Learn more about the {{ $name }} deployment topology for Vector +

    +
    +
    + {{ end }} +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/home/what.html b/docs/layouts/partials/home/what.html new file mode 100644 index 0000000000000..ca8ff5d778797 --- /dev/null +++ b/docs/layouts/partials/home/what.html @@ -0,0 +1,16 @@ +{{ $what := .Params.what }} +
    +
    + {{ partial "home/heading.html" (dict "title" $what.title) }} + +

    + {{ $what.description | markdownify }} +

    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/home/why-vector.html b/docs/layouts/partials/home/why-vector.html new file mode 100644 index 0000000000000..dc868bc856496 --- /dev/null +++ b/docs/layouts/partials/home/why-vector.html @@ -0,0 +1,37 @@ +{{ $why := .Params.why }} +
    +
    + {{ partial "home/heading.html" (dict "title" "Why Vector?") }} +
    + +
    +
    + {{ range $why }} +
    + {{ with .icon }} +
    + {{ $path := printf "img/icons/%s" . }} + {{ $config := dict "class" "fill-current h-6 w-6"}} + {{ $icon := resources.Get $path }} +
    +
    + {{ $icon.Content | safeHTML }} +
    +
    +
    + {{ end }} + +
    + + {{ .title }} + + +
    + {{ .description | markdownify }} +
    +
    +
    + {{ end }} +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/icon.html b/docs/layouts/partials/icon.html new file mode 100644 index 0000000000000..7c59fa912eee4 --- /dev/null +++ b/docs/layouts/partials/icon.html @@ -0,0 +1,2 @@ +{{ $file := printf "static/%s" .src }} +{{ $file | readFile | safeHTML }} \ No newline at end of file diff --git a/docs/layouts/partials/javascript/below.html b/docs/layouts/partials/javascript/below.html new file mode 100644 index 0000000000000..8c2df604545da --- /dev/null +++ b/docs/layouts/partials/javascript/below.html @@ -0,0 +1,4 @@ +{{ $js := "js/below.js"}} +{{ $jsOpts := dict "targetPath" $js "minify" true }} +{{ $builtJs := resources.Get $js | resources.ExecuteAsTemplate $js . | js.Build $jsOpts }} + diff --git a/docs/layouts/partials/javascript/head.html b/docs/layouts/partials/javascript/head.html new file mode 100644 index 0000000000000..600d00df8212b --- /dev/null +++ b/docs/layouts/partials/javascript/head.html @@ -0,0 +1,9 @@ +{{ $appJs := "js/app.js"}} +{{ $appJsOpts := dict "targetPath" $appJs "minify" true }} +{{ $app := resources.Get $appJs | resources.ExecuteAsTemplate $appJs . | js.Build $appJsOpts }} + + +{{/* We have a few Ionicons icons scattered throughout */}} +{{ $version := site.Params.ionicons_version }} + + diff --git a/docs/layouts/partials/javascript/home.html b/docs/layouts/partials/javascript/home.html new file mode 100644 index 0000000000000..88f9ce54f606d --- /dev/null +++ b/docs/layouts/partials/javascript/home.html @@ -0,0 +1,5 @@ +{{ $homeJs := "js/home.tsx" }} +{{ $jsOpts := dict "defines" (dict "process.env.NODE_ENV" "\"development\"") }} +{{ $babelOpts := dict "noComments" true }} +{{ $compiled := resources.Get $homeJs | js.Build $jsOpts | babel $babelOpts }} + \ No newline at end of file diff --git a/docs/layouts/partials/meta.html b/docs/layouts/partials/meta.html new file mode 100644 index 0000000000000..ae14842ee4f4a --- /dev/null +++ b/docs/layouts/partials/meta.html @@ -0,0 +1,36 @@ +{{ $url := .Permalink }} +{{ $desc := (cond .IsHome site.Params.description .Description) | markdownify | plainify }} +{{ $author := site.Author }} +{{ $favicon := site.Params.favicon | absURL }} +{{ $img := site.Params.site_logo | absURL }} +{{ $imgAlt := printf "Logo for %s" site.Title }} +{{ $twitter := printf "@%s" site.Params.social.twitter_handle }} + + + +{{ with $desc }} + +{{ end }} +{{ with $author }} + +{{ end }} + +{{ hugo.Generator }} + + + + +{{/* Twitter Card metadata */}} + + + + + + +{{/* OpenGraph metadata */}} + + + +{{ with $desc }} + +{{ end }} diff --git a/docs/layouts/partials/navbar.html b/docs/layouts/partials/navbar.html new file mode 100644 index 0000000000000..109f605fab0da --- /dev/null +++ b/docs/layouts/partials/navbar.html @@ -0,0 +1,120 @@ +{{ $here := .RelPermalink }} +{{ $menu := site.Menus.navbar }} +{{ $modes := slice "Light" "Dark" }} + \ No newline at end of file diff --git a/docs/layouts/partials/navbar/flyout-menu.html b/docs/layouts/partials/navbar/flyout-menu.html new file mode 100644 index 0000000000000..3bb66d0b41688 --- /dev/null +++ b/docs/layouts/partials/navbar/flyout-menu.html @@ -0,0 +1,40 @@ +{{ $menu := site.Menus.flyout }} +
    + +
    +
    + {{ range $menu }} +
    +

    + {{ if .URL }} + + {{ .Name }} + + {{ else }} + {{ .Name }} + {{ end }} +

    + + {{ with .Children }} +
    + {{ range . }} + + {{ .Name }} + + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    +
    +
    diff --git a/docs/layouts/partials/navbar/search-bar.html b/docs/layouts/partials/navbar/search-bar.html new file mode 100644 index 0000000000000..7a7fe0df400d9 --- /dev/null +++ b/docs/layouts/partials/navbar/search-bar.html @@ -0,0 +1,16 @@ +
    + +
    +
    + {{/* Heroicon name: solid/search */}} + +
    + + {{/* This div is populated by the logic in assets/js/below.js */}} + +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/navbar/search-results.html b/docs/layouts/partials/navbar/search-results.html new file mode 100644 index 0000000000000..2867f28d8e87b --- /dev/null +++ b/docs/layouts/partials/navbar/search-results.html @@ -0,0 +1,20 @@ +
    + +
    +
    + {{/* Results inserted by the the JS logic in assets/js/below.js */}} +
    +
    +
    +
    \ No newline at end of file diff --git a/docs/layouts/partials/navbar/toggler.html b/docs/layouts/partials/navbar/toggler.html new file mode 100644 index 0000000000000..202debe94a643 --- /dev/null +++ b/docs/layouts/partials/navbar/toggler.html @@ -0,0 +1,23 @@ +
    + +
    \ No newline at end of file diff --git a/docs/layouts/partials/one-liner.html b/docs/layouts/partials/one-liner.html new file mode 100644 index 0000000000000..5bae9b951842a --- /dev/null +++ b/docs/layouts/partials/one-liner.html @@ -0,0 +1,19 @@ +{{ $commands := site.Data.docs.administration.install_commands }} +{{ $defaultCommand := (index $commands 0).title }} +
    +
      + {{ range $commands }} + + {{ end }} +
    + + {{ range $commands }} +
    +
    + {{ highlight .command "bash" "" }} +
    +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/partials/pagination.html b/docs/layouts/partials/pagination.html new file mode 100644 index 0000000000000..8e045565fb788 --- /dev/null +++ b/docs/layouts/partials/pagination.html @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/docs/layouts/partials/releases/pagination.html b/docs/layouts/partials/releases/pagination.html new file mode 100644 index 0000000000000..af28c6af0f0c8 --- /dev/null +++ b/docs/layouts/partials/releases/pagination.html @@ -0,0 +1,5 @@ +{{ if or (ne nil .NextInSection) (ne nil .PrevInSection) }} +
    + {{ partial "pagination.html" . }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/social-buttons.html b/docs/layouts/partials/social-buttons.html new file mode 100644 index 0000000000000..dfeee4427af10 --- /dev/null +++ b/docs/layouts/partials/social-buttons.html @@ -0,0 +1,14 @@ +{{ $colored := .color }} +{{ range site.Menus.comms }} +{{ $color := .Params.color }} +{{ $iconColor := cond $colored $color "gray-300" }} +{{ $hoverColor := cond $colored "gray-500" $color }} + + + {{ .Name }} icon and link + + + + + +{{ end }} \ No newline at end of file diff --git a/docs/layouts/partials/svg.html b/docs/layouts/partials/svg.html new file mode 100644 index 0000000000000..8ee57e5fc9cc2 --- /dev/null +++ b/docs/layouts/partials/svg.html @@ -0,0 +1,4 @@ +{{ $file := printf "static/%s" .src }} +
    + {{ $file | readFile | safeHTML }} +
    \ No newline at end of file diff --git a/docs/layouts/partials/toc.html b/docs/layouts/partials/toc.html new file mode 100644 index 0000000000000..110ad680300b4 --- /dev/null +++ b/docs/layouts/partials/toc.html @@ -0,0 +1,14 @@ +{{/* A hack to check for the presence of a TOC */}} +{{ $hasToc := gt (len .TableOfContents) 32 }} +{{ $isComponent := in (slice "component" "integrate") .Layout }} +{{ $showToc := .Params.show_toc }} +{{ if or $hasToc $isComponent $showToc }} +
    +

    + On this page +

    + + {{/* This div is auto-populated by Tocbot */}} +
    +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/releases/li.html b/docs/layouts/releases/li.html new file mode 100644 index 0000000000000..ef4716d8b7e41 --- /dev/null +++ b/docs/layouts/releases/li.html @@ -0,0 +1,26 @@ +{{ $version := .File.BaseFileName }} +{{ $latest := index site.Data.docs.versions 0 }} +{{ $isLatest := eq $version $latest }} +{{ $release := index site.Data.docs.releases $version }} + +
    + + + + Version {{ .File.BaseFileName }} + + + {{ if $isLatest }} + {{ partial "badge.html" (dict "word" "latest" "color" "green") }} + {{ end }} + + + {{ with $release.date }} + {{ $date := $release.date | dateFormat "January 2, 2006" }} + + {{ end }} + +
    +
    \ No newline at end of file diff --git a/docs/layouts/releases/section.html b/docs/layouts/releases/section.html new file mode 100644 index 0000000000000..5ab5b62d1ced3 --- /dev/null +++ b/docs/layouts/releases/section.html @@ -0,0 +1,18 @@ +{{ define "title" }} +{{ site.Title }} releases +{{ end }} + +{{ define "main" }} +{{ $releases := .RegularPages }} +
    +
    + {{ partial "hero.html" . }} + +
    + {{ range $releases.Reverse }} + {{ .Render "li" }} + {{ end }} +
    +
    +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/releases/single.html b/docs/layouts/releases/single.html new file mode 100644 index 0000000000000..bfad4e15e40ea --- /dev/null +++ b/docs/layouts/releases/single.html @@ -0,0 +1,136 @@ +{{ define "title" }} +{{ .Title }} | {{ site.Title }} +{{ end }} + +{{ define "main" }} +{{ $version := .File.BaseFileName }} +{{ $release := index site.Data.docs.releases $version }} +{{ $highlights := where (where site.RegularPages "Section" "highlights") ".Params.release" "eq" $version }} +{{ $groups := dict "enhancement" "enhancements" "feat" "new features" "fix" "bug fixes"}} +
    +
    +
    + {{ partial "hero.html" . }} +
    + +
    + {{ with $release.codename }} +

    + + Code name + + + + {{ . }} + +

    + {{ end }} + + {{ with $release.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with $release.whats_next }} +
    + {{ partial "heading.html" (dict "text" "What's next" "level" 2) }} + +
    + {{ range . }} +
    + + {{ .title }} + + +
    + {{ .description | markdownify }} +
    +
    + {{ end }} +
    +
    + {{ end }} + + {{ with $highlights }} +
    +
    + {{ partial "heading.html" (dict "text" "Highlights" "level" 2) }} +
    + +
    + {{ range . }} + {{ .Render "li" }} + {{ end }} +
    +
    + {{ end }} + + {{ with $release.commits }} + {{ if gt (len $release.commits) 0 }} +
    +
    + {{ partial "heading.html" (dict "text" "Changelog" "level" 2) }} +
    + +
    + {{ range $k, $v := $groups }} + {{ $commits := where $release.commits ".type" "eq" $k }} + {{ if $commits }} + {{ $numCommits := len $commits }} + {{ $heading := printf "%d %s" $numCommits $v }} +
    +
    + {{ partial "heading.html" (dict "text" $heading "level" 3 "icon" false) }} +
    + +
    + {{ range $commits }} + {{ template "commit" . }} + {{ end }} +
    +
    + {{ end }} + {{ end }} +
    +
    + {{ end }} + {{ end }} +
    +
    +
    +{{ end }} + +{{ define "commit" }} + + + {{/* Scopes */}} + + {{ range .scopes }} + {{ partial "badge.html" (dict "word" . "color" "blue") }} + {{ end }} + + + {{/* Description */}} + + {{ .description | markdownify }} + + + + {{/* Pull request chip */}} + {{ with .pr_number }} + {{ $link := printf "https://github.com/timberio/vector/pull/%v" . }} + + + + + {{ . }} + + + {{ end }} + +{{ end }} + +{{ define "below" }} +{{ partial "releases/pagination.html" . }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/administration/logs.html b/docs/layouts/shortcodes/administration/logs.html new file mode 100644 index 0000000000000..b5bc0711ea0eb --- /dev/null +++ b/docs/layouts/shortcodes/administration/logs.html @@ -0,0 +1,90 @@ +{{ $ui := site.Data.docs.administration.ui.management }} +{{ $latest := index site.Data.docs.versions 0 }} +
    + {{ partial "ui/selector.html" (dict "name" "Platform" "items" $ui.family_names "var" "platform") }} + + {{ range $ui.families }} + {{ $var := printf "%s_interface" .name }} +
    + {{ partial "ui/selector.html" (dict "name" "Interface" "items" .interface_names "var" $var) }} +
    + {{ end }} +
    + +
    + {{ range $ui.families }} + {{ $highlighter := .highlighter }} +
    + {{ $var := printf "%s_interface" .name }} + {{ range .interfaces }} + {{ $cmds := .manage }} +
    +
    + + Installer: {{ .title }} + +
    + +
    + + Variables + + + {{ with .variables.variants }} + + + variant + + + + {{ range . }} + {{ partial "badge.html" (dict "word" . "color" "gray") }} + {{ end }} + + + {{ end }} + + + + config_format + + + {{ range .variables.config_formats }} + {{ partial "badge.html" (dict "word" . "color" "gray") }} + {{ end }} + + +
    + + + {{ with .manage }} +
    + {{ range slice "start" "stop" "reload" "restart" }} + {{ $cmd := index $cmds . }} + + {{ with $cmd.info }} +
    + {{ . | $.Page.RenderString }} +
    + {{ end }} + + {{ if $cmd.command }} + {{ $cmd = $cmd.command | replaceRE "{version}" $latest }} +
    + + {{ . | title }} + + +
    + {{ highlight $cmd $highlighter "" }} +
    +
    + {{ end }} + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/administration/manage.html b/docs/layouts/shortcodes/administration/manage.html new file mode 100644 index 0000000000000..f73b0804d297a --- /dev/null +++ b/docs/layouts/shortcodes/administration/manage.html @@ -0,0 +1,85 @@ +{{ $ui := site.Data.docs.administration.ui.management }} +{{ $latest := index site.Data.docs.versions 0 }} +
    + {{ partial "ui/selector.html" (dict "name" "Platform" "items" $ui.family_names "var" "platform") }} + + {{ range $ui.families }} + {{ $var := printf "%s_interface" .name }} +
    + {{ partial "ui/selector.html" (dict "name" "Interface" "items" .interface_names "var" $var) }} +
    + {{ end }} +
    + +
    + {{ range $ui.families }} + {{ $highlighter := .highlighter }} +
    + {{ $var := printf "%s_interface" .name }} + {{ range .interfaces }} + {{ $cmds := .manage }} +
    +
    + + Installer: {{ .title }} + +
    + +
    + + Variables + + + {{ with .variables.variants }} + + + variant + + + + {{ range . }} + {{ partial "badge.html" (dict "word" . "color" "gray") }} + {{ end }} + + + {{ end }} + + + + config_format + + + {{ range .variables.config_formats }} + {{ partial "badge.html" (dict "word" . "color" "gray") }} + {{ end }} + + +
    + + + {{ with .manage }} +
    + {{ range slice "start" "stop" "reload" "restart" }} + {{ $cmd := index $cmds . }} + + {{ if $cmd.command }} + {{ $cmd = $cmd.command | replaceRE "{version}" $latest }} + +
    + + {{ . | title }} + + +
    + {{ highlight $cmd $highlighter "" }} +
    +
    + {{ end }} + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/administration/process.html b/docs/layouts/shortcodes/administration/process.html new file mode 100644 index 0000000000000..3d614cf4490d1 --- /dev/null +++ b/docs/layouts/shortcodes/administration/process.html @@ -0,0 +1,2 @@ +{{ $process := site.Data.docs.process }} +{{ partial "data.html" (dict "process" $process) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/administration/upgrading.html b/docs/layouts/shortcodes/administration/upgrading.html new file mode 100644 index 0000000000000..d38b348941c7d --- /dev/null +++ b/docs/layouts/shortcodes/administration/upgrading.html @@ -0,0 +1,55 @@ +{{ $ui := site.Data.docs.administration.ui.management }} +{{ $latest := index site.Data.docs.versions 0 }} +
    + {{ partial "ui/selector.html" (dict "name" "Platform" "items" $ui.family_names "var" "platform") }} + + {{ range $ui.families }} + {{ $var := printf "%s_interface" .name }} +
    + {{ partial "ui/selector.html" (dict "name" "Interface" "items" .interface_names "var" $var) }} +
    + {{ end }} +
    + +
    + {{ range $ui.families }} + {{ $highlighter := .highlighter }} +
    + {{ $var := printf "%s_interface" .name }} + {{ range .interfaces }} + {{ $cmds := .manage }} +
    +
    + + Installer: {{ .title }} + +
    + + {{ with .manage }} +
    + {{ range slice "upgrade" }} + {{ $cmd := index $cmds . }} + + {{ if $cmd.command }} + {{ $cmd = $cmd.command | replaceRE "{version}" $latest }} + +
    + + {{ . | title }} + + +
    + {{ highlight $cmd $highlighter "" }} +
    +
    + {{ else }} + No upgrade command specified. + {{ end }} + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/api/config.html b/docs/layouts/shortcodes/api/config.html new file mode 100644 index 0000000000000..36a232a82de21 --- /dev/null +++ b/docs/layouts/shortcodes/api/config.html @@ -0,0 +1,2 @@ +{{ $config := site.Data.docs.api.configuration }} +{{ partial "data.html" (dict "component_config" $config) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/api/endpoints.html b/docs/layouts/shortcodes/api/endpoints.html new file mode 100644 index 0000000000000..dfc10c9592065 --- /dev/null +++ b/docs/layouts/shortcodes/api/endpoints.html @@ -0,0 +1,62 @@ +{{ $api := site.Data.docs.api }} +{{ $endpoints := $api.endpoints }} +{{ $colors := dict "GET" "text-green-500" "POST" "text-indigo-400" }} +
    + {{ range $path, $info := $endpoints }} + {{ range $method, $v := $info }} + {{ $color := index $colors $method }} +
    +
    + + {{ $method }} + + + + {{ $path }} + +
    + + {{ with $v.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with $v.responses }} +
    + + Responses + + +
    +
    + Code +
    + +
    + Description +
    +
    + +
    + {{ range $code, $v := . }} +
    +
    + + {{ $code }} + +
    + +
    + {{ $v.description | markdownify }} +
    +
    + {{ end }} +
    +
    + {{ end }} +
    + {{ end }} + {{ end }} +
    + diff --git a/docs/layouts/shortcodes/cli/commands.html b/docs/layouts/shortcodes/cli/commands.html new file mode 100644 index 0000000000000..346bb31c83469 --- /dev/null +++ b/docs/layouts/shortcodes/cli/commands.html @@ -0,0 +1,170 @@ +{{ $cli := site.Data.docs.cli }} + +
    +
    + +

    + {{ $cli.name }} +

    + + {{ partial "badge.html" (dict "word" "root" "color" "blue") }} +
    + +
    +

    + The root command (no subcommand) starts Vector. +

    + +
    + {{ template "table" (dict "title" "Flags" "items" $cli.flags "cmd" "vector") }} +
    + +
    + {{ template "table" (dict "title" "Options" "items" $cli.options "cmd" "vector") }} +
    +
    +
    + + + {{ range $k, $v := $cli.commands }} +
    + +

    + {{ $k }} +

    +
    + + {{ with $v.description }} +
    + {{ . | markdownify }} +
    + {{ end }} + + {{ with $v.flags }} +
    + {{ template "table" (dict "title" "Flags" "items" . "cmd" $k) }} +
    + {{ end }} + + {{ with $v.options }} +
    + {{ template "table" (dict "title" "Options" "items" . "cmd" $k) }} +
    + {{ end }} +
    + {{ end }} +
    + +{{ define "table" }} +{{ $cmd := .cmd }} + + + + + + + + + + + + {{ range .items }} + + {{ if .flag }} + {{ $id := substr .flag 2 }} + {{ $href := printf "%s-%s" $cmd $id }} + {{ $comma := and .flag .short }} + + {{ end }} + + {{ if .option }} + {{ $id := substr .option 2 }} + {{ $href := printf "%s-%s" $cmd $id }} + {{ $comma := and .option .short }} + + {{ end }} + + + + + + {{ end }} + +
    + {{ .title }} + + Description + + Environment variable + + Default +
    + + {{- .flag -}} + + {{ if $comma }},
    {{ end }} + {{ with .short }} + + {{ . }} + + {{ end }} +
    + + {{- .option -}} + + {{ if $comma }},
    {{ end }} + {{ with .short }} + + {{ . }} + + {{ end }} +
    +
    + {{ .description | markdownify }} +
    + + {{ with .enum }} +
    + + Enum options + + + + + + + + + + + + {{ range $k, $v := . }} + + + + + {{ end }} + +
    + Option + + Description +
    + + {{ $k }} + + + {{ $v }} +
    +
    + {{ end }} +
    + + {{ .env_var }} + + + + {{ .default }} + +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/cli/env-vars.html b/docs/layouts/shortcodes/cli/env-vars.html new file mode 100644 index 0000000000000..c6eaad997cbba --- /dev/null +++ b/docs/layouts/shortcodes/cli/env-vars.html @@ -0,0 +1,5 @@ +{{ $envVars := dict }} +{{ $envVars = $envVars | merge site.Data.docs.components.sinks.aws_cloudwatch_logs.env_vars }} +{{ $envVars = $envVars | merge site.Data.docs.components.sources.docker_logs.env_vars }} +{{ $envVars = $envVars | merge site.Data.docs.components.sinks.gcp_stackdriver_logs.env_vars }} +{{ partial "data.html" (dict "component_env_vars" $envVars) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/cli/interface.html b/docs/layouts/shortcodes/cli/interface.html new file mode 100644 index 0000000000000..74064f93b0c5c --- /dev/null +++ b/docs/layouts/shortcodes/cli/interface.html @@ -0,0 +1,9 @@ +{{ $words := slice "flags" "options" "subcommand" "args" }} +
    + + vector + {{ range $words }} + {{{ . }}} + {{ end }} + +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/components.html b/docs/layouts/shortcodes/components.html new file mode 100644 index 0000000000000..0f6d21e8394aa --- /dev/null +++ b/docs/layouts/shortcodes/components.html @@ -0,0 +1,9 @@ +{{ $kind := .Get 0 }} +{{ $componentsOfType := where site.RegularPages ".Params.kind" $kind }} +
    +
    + {{ range $componentsOfType }} + {{ .Render "component-card" }} + {{ end }} +
    +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/config/global.html b/docs/layouts/shortcodes/config/global.html new file mode 100644 index 0000000000000..200c929a7c92f --- /dev/null +++ b/docs/layouts/shortcodes/config/global.html @@ -0,0 +1,2 @@ +{{ $global := site.Data.docs.configuration.configuration }} +{{ partial "data.html" (dict "component_config" $global) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/config/log-schema.html b/docs/layouts/shortcodes/config/log-schema.html new file mode 100644 index 0000000000000..eeb733ba5971d --- /dev/null +++ b/docs/layouts/shortcodes/config/log-schema.html @@ -0,0 +1,2 @@ +{{ $logSchema := site.Data.docs.data_model.schema.log }} +{{ partial "data.html" (dict "data_schema" $logSchema) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/config/metric-schema.html b/docs/layouts/shortcodes/config/metric-schema.html new file mode 100644 index 0000000000000..f704f4396920c --- /dev/null +++ b/docs/layouts/shortcodes/config/metric-schema.html @@ -0,0 +1,2 @@ +{{ $metricSchema := site.Data.docs.data_model.schema.metric }} +{{ partial "data.html" (dict "data_schema" $metricSchema) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/config/unit-tests.html b/docs/layouts/shortcodes/config/unit-tests.html new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/docs/layouts/shortcodes/danger.html b/docs/layouts/shortcodes/danger.html new file mode 100644 index 0000000000000..48d20b7f6c8d0 --- /dev/null +++ b/docs/layouts/shortcodes/danger.html @@ -0,0 +1 @@ +{{ partial "admonition.html" (dict "type" "danger" "content" .Inner "title" (.Get "title")) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/details.html b/docs/layouts/shortcodes/details.html new file mode 100644 index 0000000000000..387373d687387 --- /dev/null +++ b/docs/layouts/shortcodes/details.html @@ -0,0 +1,14 @@ +
    + + +
    + {{ .Inner | $.Page.RenderString }} +
    +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/easy-install-scripts.html b/docs/layouts/shortcodes/easy-install-scripts.html new file mode 100644 index 0000000000000..ac8f58d43c0e7 --- /dev/null +++ b/docs/layouts/shortcodes/easy-install-scripts.html @@ -0,0 +1,19 @@ +{{ $commands := site.Data.docs.administration.install_commands }} +{{ $defaultCommand := (index $commands 0).title }} +
    +
    + {{ range $commands }} + + {{ end }} +
    + + {{ range $commands }} +
    +
    + {{ highlight .command "bash" "" }} +
    +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/file-issue.html b/docs/layouts/shortcodes/file-issue.html new file mode 100644 index 0000000000000..deafdc7e64ed8 --- /dev/null +++ b/docs/layouts/shortcodes/file-issue.html @@ -0,0 +1,10 @@ +{{ $url := printf "https://github.com/%s/issues/new?assignees=&labels=type%3A+feature&template=feature.md&title=" site.Params.social.github_repo }} + + + + + + + {{ .Get "text" }} + + \ No newline at end of file diff --git a/docs/layouts/shortcodes/glossary.html b/docs/layouts/shortcodes/glossary.html new file mode 100644 index 0000000000000..793464baa5ca2 --- /dev/null +++ b/docs/layouts/shortcodes/glossary.html @@ -0,0 +1,14 @@ +{{ $glossary := site.Data.docs.glossary }} +
    + {{ range $glossary }} +
    + + {{ partial "heading.html" (dict "text" .term) }} + + +
    + {{ .description | markdownify }} +
    +
    + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/info.html b/docs/layouts/shortcodes/info.html new file mode 100644 index 0000000000000..530bb4827d157 --- /dev/null +++ b/docs/layouts/shortcodes/info.html @@ -0,0 +1 @@ +{{ partial "admonition.html" (dict "type" "info" "content" .Inner "title" (.Get "title")) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/internal-metrics-list.html b/docs/layouts/shortcodes/internal-metrics-list.html new file mode 100644 index 0000000000000..dba3620e277a5 --- /dev/null +++ b/docs/layouts/shortcodes/internal-metrics-list.html @@ -0,0 +1,38 @@ +{{ $metrics := site.Data.docs.components.sources.internal_metrics.output.metrics }} +
    + + + + + + + + + + {{ range $metrics }} + + + + + + {{ end }} + +
    + Name + + Description + + Data type +
    + + {{ .name }} + + + {{ .description | markdownify }} + + {{ $href := printf "/docs/about/under-the-hood/architecture/data-model/metric/#%s" .type }} + + {{ .type }} + +
    +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/jump.html b/docs/layouts/shortcodes/jump.html new file mode 100644 index 0000000000000..4f5dfb3b1c572 --- /dev/null +++ b/docs/layouts/shortcodes/jump.html @@ -0,0 +1,27 @@ +{{ $link := .Get 0 }} +{{ if not $link }} +{{ errorf "No page title specified" }} +{{ end }} + +{{ $hash := .Get 1 }} + +{{ $page := site.GetPage $link }} +{{ if not $page }} +{{ errorf "Error in link shortcode at content/%s. No page found at %s." $.Page.File $link }} +{{ end }} + \ No newline at end of file diff --git a/docs/layouts/shortcodes/pages.html b/docs/layouts/shortcodes/pages.html new file mode 100644 index 0000000000000..1216d5c5bef69 --- /dev/null +++ b/docs/layouts/shortcodes/pages.html @@ -0,0 +1,7 @@ +{{ with $.Page.RegularPages }} +
    + {{ range . }} + {{ .Render "li" }} + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/quote.html b/docs/layouts/shortcodes/quote.html new file mode 100644 index 0000000000000..32accbae5414a --- /dev/null +++ b/docs/layouts/shortcodes/quote.html @@ -0,0 +1 @@ +{{ partial "admonition.html" (dict "type" "quote" "icon" "quote-right" "content" .Inner "title" (.Get "title")) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/requirement.html b/docs/layouts/shortcodes/requirement.html new file mode 100644 index 0000000000000..75384bc073319 --- /dev/null +++ b/docs/layouts/shortcodes/requirement.html @@ -0,0 +1 @@ +{{ partial "admonition.html" (dict "type" "requirement" "icon" "wrench" "content" .Inner "title" (.Get "title")) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/roles.html b/docs/layouts/shortcodes/roles.html new file mode 100644 index 0000000000000..c32e66b4c17a6 --- /dev/null +++ b/docs/layouts/shortcodes/roles.html @@ -0,0 +1,27 @@ +{{ $roles := site.Data.docs.administration.roles }} +{{ range $k, $v := $roles }} +{{ partial "heading.html" (dict "text" $v.title "level" 2) }} + +{{ with $v.sub_roles }} +{{ range . }} +{{ partial "heading.html" (dict "text" .title "level" 3) }} +{{ template "role-image" .name }} +{{ template "role-description" .description }} +{{ end }} +{{ else }} +{{ template "role-image" $k }} +{{ end }} +{{ template "role-description" $v.description }} +{{ end }} + + +{{ define "role-image" }} +{{ $svg := printf "img/roles/%s.svg" . }} +{{ partial "svg.html" (dict "src" $svg) }} +{{ end }} + +{{ define "role-description" }} +
    + {{ . | markdownify }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/sections.html b/docs/layouts/shortcodes/sections.html new file mode 100644 index 0000000000000..365b8950f9b53 --- /dev/null +++ b/docs/layouts/shortcodes/sections.html @@ -0,0 +1,7 @@ +{{ with $.Page.Sections }} +
    + {{ range . }} + {{ .Render "li" }} + {{ end }} +
    +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/snippet.html b/docs/layouts/shortcodes/snippet.html new file mode 100644 index 0000000000000..4fbf49d5ad845 --- /dev/null +++ b/docs/layouts/shortcodes/snippet.html @@ -0,0 +1,12 @@ +{{ $snippet := .Get 0 }} + +{{ if eq $snippet "context" }} +{{ $name := $.Page.File.BaseFileName }} +{{ $kind := $.Page.Params.kind }} +

    + By default, the {{ $name }} {{ $kind }} augments events with helpful context keys as shown in the Output section above. +

    +{{ else }} +{{ $file := printf "snippets/%s.md" $snippet }} +{{ readFile $file | $.Page.RenderString (dict "display" "block") }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/success.html b/docs/layouts/shortcodes/success.html new file mode 100644 index 0000000000000..d36ec77488101 --- /dev/null +++ b/docs/layouts/shortcodes/success.html @@ -0,0 +1 @@ +{{ partial "admonition.html" (dict "type" "success" "icon" "check-circle" "content" .Inner "title" (.Get "title")) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/supported-installers.html b/docs/layouts/shortcodes/supported-installers.html new file mode 100644 index 0000000000000..c669974467ee1 --- /dev/null +++ b/docs/layouts/shortcodes/supported-installers.html @@ -0,0 +1,14 @@ +{{ $supported := $.Page.Params.supported_installers }} +
      + {{ range $supported }} + {{ $page := index (where site.RegularPages ".Params.short" "eq" .) 0 }} + {{ if eq $page nil }} + {{ errorf "Error in supported-installers shortcode on %s: No page with a short title of %s found" $.Page.File.Path . }} + {{ end }} +
    • + + {{ $page.Params.short }} + +
    • + {{ end }} +
    \ No newline at end of file diff --git a/docs/layouts/shortcodes/svg.html b/docs/layouts/shortcodes/svg.html new file mode 100644 index 0000000000000..6a842a04fbb53 --- /dev/null +++ b/docs/layouts/shortcodes/svg.html @@ -0,0 +1,2 @@ +{{ $src := .Get 0 }} +{{ partial "svg.html" (dict "src" $src) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/tab.html b/docs/layouts/shortcodes/tab.html new file mode 100644 index 0000000000000..0c6640049fb73 --- /dev/null +++ b/docs/layouts/shortcodes/tab.html @@ -0,0 +1,8 @@ +{{ $title := .Params.title }} +{{ $slug := .Params.title | urlize }} +{{ $.Page.Scratch.SetInMap "tabs" $slug .Inner }} + \ No newline at end of file diff --git a/docs/layouts/shortcodes/tabs.html b/docs/layouts/shortcodes/tabs.html new file mode 100644 index 0000000000000..62ad96b6d46b9 --- /dev/null +++ b/docs/layouts/shortcodes/tabs.html @@ -0,0 +1,19 @@ +{{ if not .Params.default }} +{{ errorf "no default tab specified in tabs shortcode %s" .File }} +{{ end }} + +{{ $default := .Params.default | urlize }} +
    +
    + {{ .Inner }} +
    + + {{ range $k, $v := $.Page.Scratch.Get "tabs" }} +
    + {{ $v | $.Page.RenderString }} +
    + {{ end }} +
    + +{{/* Reset Scratch for the "tabs" key, allowing for more than one tabs shortcode on a page */}} +{{ $.Page.Scratch.Set "tabs" dict }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/topologies.html b/docs/layouts/shortcodes/topologies.html new file mode 100644 index 0000000000000..9244795615219 --- /dev/null +++ b/docs/layouts/shortcodes/topologies.html @@ -0,0 +1,32 @@ +{{ $topologies := sort site.Data.docs.administration.topologies ".order" }} +{{ range $topologies }} +{{ partial "heading.html" (dict "text" .title "level" 2) }} +{{ template "topology-image" .title }} + +
    + {{ .description | markdownify }} +
    + +{{ partial "heading.html" (dict "text" "Pros" "level" 3 "id" (printf "pros-%s" (.title | urlize))) }} +
      + {{ range .pros }} +
    • + {{ .title }}. {{ .description | markdownify }} +
    • + {{ end }} +
    + +{{ partial "heading.html" (dict "text" "Cons" "level" 3 "id" (printf "cons-%s" (.title | urlize))) }} +
      + {{ range .cons }} +
    • + {{ .title }}. {{ .description | markdownify }} +
    • + {{ end }} +
    +{{ end }} + +{{ define "topology-image" }} +{{ $svg := printf "img/topologies/%s.svg" (. | urlize) }} +{{ partial "svg.html" (dict "src" $svg) }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/version.html b/docs/layouts/shortcodes/version.html new file mode 100644 index 0000000000000..197ec0ed2254f --- /dev/null +++ b/docs/layouts/shortcodes/version.html @@ -0,0 +1 @@ +{{- index site.Data.docs.versions 0 -}} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/concepts.html b/docs/layouts/shortcodes/vrl/concepts.html new file mode 100644 index 0000000000000..edaa783ef4ec2 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/concepts.html @@ -0,0 +1,2 @@ +{{ $concepts := site.Data.docs.remap.concepts }} +{{ partial "data.html" (dict "vrl_concepts" $concepts) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/dynamic-expressions.html b/docs/layouts/shortcodes/vrl/dynamic-expressions.html new file mode 100644 index 0000000000000..fa816ba348876 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/dynamic-expressions.html @@ -0,0 +1,2 @@ +{{ $expressions := index site.Data.docs.remap.expressions }} +{{ partial "data.html" (dict "vrl_expressions" $expressions) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/errors/compile-time.html b/docs/layouts/shortcodes/vrl/errors/compile-time.html new file mode 100644 index 0000000000000..d58a86cb0a5e8 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/errors/compile-time.html @@ -0,0 +1,2 @@ +{{ $errors := site.Data.docs.remap.errors }} +{{ partial "data.html" (dict "vrl_compile_time_errors" $errors) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/examples.html b/docs/layouts/shortcodes/vrl/examples.html new file mode 100644 index 0000000000000..ee5af046ccb0f --- /dev/null +++ b/docs/layouts/shortcodes/vrl/examples.html @@ -0,0 +1,9 @@ +{{ $category := .Get 0 }} +{{ $funcs := slice }} +{{ range site.Data.docs.remap.functions }} +{{ if eq .category $category }} +{{ $funcs = $funcs | append . }} +{{ end }} +{{ end }} + +{{ partial "data.html" (dict "vrl_examples" $funcs) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/features.html b/docs/layouts/shortcodes/vrl/features.html new file mode 100644 index 0000000000000..a5449cb288af3 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/features.html @@ -0,0 +1,2 @@ +{{ $features := site.Data.docs.remap.features }} +{{ partial "data.html" (dict "vrl_features" $features) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/functions.html b/docs/layouts/shortcodes/vrl/functions.html new file mode 100644 index 0000000000000..d08c2487ce046 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/functions.html @@ -0,0 +1,16 @@ +{{ $categories := site.Data.docs.remap.function_categories }} + +{{ range $categories }} +{{ $category := . }} +{{ $funcs := slice }} +{{ range $k, $func := site.Data.docs.remap.functions }} +{{ if eq $func.category $category }} +{{ $funcs = $funcs | append $func }} +{{ end }} +{{ end }} + +{{ $text := printf "%s functions" . }} +{{ partial "heading.html" (dict "text" $text "level" 2) }} + +{{ partial "data.html" (dict "vrl_functions" $funcs) }} +{{ end }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/literal-expressions.html b/docs/layouts/shortcodes/vrl/literal-expressions.html new file mode 100644 index 0000000000000..88b4585ec7b70 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/literal-expressions.html @@ -0,0 +1,2 @@ +{{ $literals := site.Data.docs.remap.literals }} +{{ partial "data.html" (dict "vrl_literals" $literals) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/principles.html b/docs/layouts/shortcodes/vrl/principles.html new file mode 100644 index 0000000000000..b3cff3f43d597 --- /dev/null +++ b/docs/layouts/shortcodes/vrl/principles.html @@ -0,0 +1,2 @@ +{{ $principles := site.Data.docs.remap.principles }} +{{ partial "data.html" (dict "vrl_principles" $principles) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/real-world-examples.html b/docs/layouts/shortcodes/vrl/real-world-examples.html new file mode 100644 index 0000000000000..ba206aa3c79ba --- /dev/null +++ b/docs/layouts/shortcodes/vrl/real-world-examples.html @@ -0,0 +1,3 @@ +{{ $key := .Get 0 }} +{{ $examples := site.Data.docs.remap.examples }} +{{ partial "data.html" (dict "vrl_real_world_examples" $examples) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/vrl/syntax.html b/docs/layouts/shortcodes/vrl/syntax.html new file mode 100644 index 0000000000000..a9f2d11c691bf --- /dev/null +++ b/docs/layouts/shortcodes/vrl/syntax.html @@ -0,0 +1,2 @@ +{{ $syntax := site.Data.docs.remap.syntax }} +{{ partial "data.html" (dict "vrl_syntax" $syntax) }} \ No newline at end of file diff --git a/docs/layouts/shortcodes/warning.html b/docs/layouts/shortcodes/warning.html new file mode 100644 index 0000000000000..dc7aaaae63b83 --- /dev/null +++ b/docs/layouts/shortcodes/warning.html @@ -0,0 +1 @@ +{{ partial "admonition.html" (dict "type" "warning" "icon" "exclamation-triangle" "content" .Inner "title" (.Get "title")) }} \ No newline at end of file diff --git a/docs/manual/about.md b/docs/manual/about.md deleted file mode 100644 index b0946ef5ab650..0000000000000 --- a/docs/manual/about.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: About -description: "About Vector, the monitoring and observability data router" -sidebar_label: hidden -hide_pagination: true ---- - -This section will cover Vector's basic concepts and provide a foundation -for the rest of the documentation. - -Concepts -Under the hood -What is vector diff --git a/docs/manual/about/concepts.md b/docs/manual/about/concepts.md deleted file mode 100644 index 8e8519e314dbf..0000000000000 --- a/docs/manual/about/concepts.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Concepts -description: The fundamental Vector concepts. A great place to start learning about Vector. ---- - - - -In order to understand Vector, you must first understand the fundamental -concepts. The following concepts are ordered progressively, starting with the -individual unit of data ([events](#events)) and broadening all the way to -Vector's deployment models ([pipelines](#pipelines)). - -## Events - -"Events" represent the individual units of data in Vector. They must fit into -one of the following types. - -Data model - -### Logs - -A "log" event is a generic key/value representation of an event. - -Log events - -### Metrics - -A "metric" event is a first-class representation of numerical operation -performed on a time series. Vector's metric events are fully interoperable. - -Metric events - -## Components - -"Component" is the generic term we use for [sources](#sources), -[transforms](#transforms), and [sinks](#sinks). Components ingest, transform, -and route events. You compose components to create [topologies](#topology). - -Components - -### Sources - -Vector wouldn't be very useful if it couldn't ingest data. A "source" defines -where Vector should pull data from, or how it should receive data pushed to it. -A [topology](#topology) can have any number of sources, and as they ingest data -they proceed to normalize it into [events](#events) \(see next section\). This sets the stage -for easy and consistent processing of your data. Examples of sources include -[`file`][docs.sources.file], [`syslog`][docs.sources.syslog], -[`StatsD`][docs.sources.statsd], and [`stdin`][docs.sources.stdin]. - -Sources - -### Transforms - -A "transform" is responsible for mutating events as they are transported by -Vector. This might involve parsing, filtering, sampling, or aggregating. You can -have any number of transforms in your pipeline and how they are composed is up -to you. - -Transforms - -### Sinks - -A "sink" is a destination for [events][docs.data-model]. Each sink's -design and transmission method is dictated by the downstream service it is -interacting with. For example, the [`socket` sink][docs.sinks.socket] will -stream individual events, while the [`aws_s3` sink][docs.sinks.aws_s3] will -buffer and flush data. - -Sinks - -## Pipeline - -A "Pipeline" is a directed acyclic graph of [components](#components). Each -component is a node on the graph with directed edges. Data must flow in one -direction, from sources to sinks. Components can produce zero or more events. - -Pipeline model - -## Roles - -A "role" refers to a deployment role that Vector fills in order to create -end-to-end pipelines. - -Deployment roles - -### Agent - -The "agent" role is designed for deploying Vector to the edge, typically for -data collection. - -Agent role - -### Aggregator - -The "aggregator" role is designed to collect and process data from multiple -upstream sources. These upstream sources could be other Vector agents or -non-Vector agents such as Syslog-ng. - -Aggregator role - -## Topology - -A "topology" refers to the end result of deploying Vector into your -infrastructure. A topology may be as simple as deploying -Vector as an agent, or it may be as complex as deploying Vector as an agent -and routing data through multiple Vector aggregators. - -Deployment topologies - -[docs.data-model]: /docs/about/under-the-hood/architecture/data-model/ -[docs.sinks.aws_s3]: /docs/reference/configuration/sinks/aws_s3/ -[docs.sinks.socket]: /docs/reference/configuration/sinks/socket/ -[docs.sources.file]: /docs/reference/configuration/sources/file/ -[docs.sources.statsd]: /docs/reference/configuration/sources/statsd/ -[docs.sources.stdin]: /docs/reference/configuration/sources/stdin/ -[docs.sources.syslog]: /docs/reference/configuration/sources/syslog/ diff --git a/docs/manual/about/under-the-hood.md b/docs/manual/about/under-the-hood.md deleted file mode 100644 index 028c3e82cb6d6..0000000000000 --- a/docs/manual/about/under-the-hood.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Under the hood -description: "The Vector architecture and internals" -sidebar_label: hidden -hide_pagination: true ---- - -Architecture -Guarantees -Networking diff --git a/docs/manual/about/under-the-hood/architecture.md b/docs/manual/about/under-the-hood/architecture.md deleted file mode 100644 index 134c47ff3ea56..0000000000000 --- a/docs/manual/about/under-the-hood/architecture.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Architecture -description: "Vector's architecture" -sidebar_label: hidden -hide_pagination: true ---- - - - -In this section we'll cover the various models that combine to form Vector's -architecture. The following models are ordered progressively, starting with the -[data model][docs.architecture.data-model] and broadening all the way to -Vector's [runtime model][docs.architecture.runtime-model]. - -Data model -Topology model -Concurrency model -Runtime model - -[docs.architecture.data-model]: /docs/about/under-the-hood/architecture/data-model/ -[docs.architecture.runtime-model]: /docs/about/under-the-hood/architecture/runtime-model/ diff --git a/docs/manual/about/under-the-hood/architecture/concurrency-model.md b/docs/manual/about/under-the-hood/architecture/concurrency-model.md deleted file mode 100644 index 0bf2500256ee3..0000000000000 --- a/docs/manual/about/under-the-hood/architecture/concurrency-model.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Concurrency Model -description: Vector's concurrency model enables automatic CPU concurrency. ---- - - - - - -Vector's concurrency model is currently a work in progress. We are expecting -to complete the work in Q2 of 2021. - - - -Vector implements a concurrency model that scales naturally with incoming data -volume as shown above. Each Vector [source][docs.sources] is responsible for -defining the unit of concurrency and implementing it accordingly. This allows -for a natural concurrency model that adapts to however Vector is being used, -avoiding the need for tedious concurrency tuning and configuration. - -For example, the [`file` source][docs.sources.file] implements concurrency -across the number of files it's tailing, and the -[`socket` source][docs.sources.socket] implements concurrency across the number -active open connection it's maintaining. - -## Stateless function transforms - -As covered in the [topology model document](topology-model), Vector's -concurrency relies on stateless function transforms that can be inlined at the -source level. Therefore, task transforms should be defined at the end of -your topology to allow for maximum transform inlining. - -[docs.sources.file]: /docs/reference/configuration/sources/file/ -[docs.sources.socket]: /docs/reference/configuration/sources/socket/ -[docs.sources]: /docs/reference/configuration/sources/ diff --git a/docs/manual/about/under-the-hood/architecture/data-model.md b/docs/manual/about/under-the-hood/architecture/data-model.md deleted file mode 100644 index b113e74fdc7b8..0000000000000 --- a/docs/manual/about/under-the-hood/architecture/data-model.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Data Model -sidebar_label: hidden -description: Vector's internal data model -- event and it's subtypes. ---- - - - -The individual units of data flowing through Vector are known as **events**. -Events must fall into one of Vector's defined observability types. - -## Event Types - -Vector defines subtypes for events. This is necessary to establish domain -specific requirements enabling interoperability with existing monitoring and -observability systems. - -Log -Metric - -## FAQ - -### Why Not _Just_ Events? - -We, _very much_, like the idea of an event-only world, one where every service -is perfectly instrumented with events that contain rich data and context. -Unfortunately, that is not the case; existing services often emit metrics, -traces, and logs of varying quality. By designing Vector to meet services where -they are in their current state, we serve as a bridge to newer standards. This is why -we place "events" at the top of our data model, where logs and metrics are -derived. - -Finally, a sophisticated data model that accounts for the various data types -allows for _correct_ interoperability between observability systems. For -example, a pipeline with a `statsd` source and a `prometheus` sink would not -be possible without the correct internal metrics data types. diff --git a/docs/manual/about/under-the-hood/architecture/data-model/log.md b/docs/manual/about/under-the-hood/architecture/data-model/log.md deleted file mode 100644 index 6a20f1d31bd40..0000000000000 --- a/docs/manual/about/under-the-hood/architecture/data-model/log.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Log Event -description: Vector's internal log data model. ---- - - - -## Description - -A Vector log event is a structured representation of a -point-in-time event. It contains an arbitrary set of -fields that describe the event. - -A key tenet of Vector is to remain schema neutral. This -ensures that Vector can work with any schema, supporting -legacy and future schemas as your needs evolve. Vector -does not require any specific fields, and each component -will document the fields it provides. diff --git a/docs/manual/about/under-the-hood/architecture/data-model/metric.md b/docs/manual/about/under-the-hood/architecture/data-model/metric.md deleted file mode 100644 index 3474940ab9e6b..0000000000000 --- a/docs/manual/about/under-the-hood/architecture/data-model/metric.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Metric Event -description: Vector's internal metric data model. ---- - - - -## Description - -A Vector metric event represents a numerical operation -performed on a time series. Unlike other tools, metrics -in Vector are first class citizens, they are not represented -as structured logs. This makes them interoperable with -various metrics services without the need for any -transformation. - -Vector's metric data model favors accuracy and correctness over -ideological purity. Therefore, Vector's metric types are a -conglomeration of various metric types found in the wild, such as -Prometheus and Statsd. This ensures metric data is _correctly_ -interoperable between systems. diff --git a/docs/manual/about/under-the-hood/architecture/pipeline-model.md b/docs/manual/about/under-the-hood/architecture/pipeline-model.md deleted file mode 100644 index d832971f505a2..0000000000000 --- a/docs/manual/about/under-the-hood/architecture/pipeline-model.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Pipeline Model -description: Vector's pipeline model explains how data is collected and routed within Vector. ---- - - - -Vector's pipeline model is based on a [directed acyclic graph][urls.dag] of -[components][urls.vector_components] that contains independent subgraphs. -[Events][docs.architecture.data-model] must flow in a single direction from sources -to sinks, and cannot create cycles. Each component in the graph can produce zero -or more events. - -## Defining pipelines - -A Vector pipeline is defined through a TOML, YAML, or JSON -[configuration][urls.vector_configuration] file. For maintainability, -many Vector users use data templating languages like [Jsonnet][urls.jsonnet] -or [Cue][urls.cue]. - -Configuration is checked during compile-time (Vector boot) to present simple -mistakes and enforce the DAG properties. - -## In-flight manipulation - -Vector's configured pipeline can be adjusted in real-time without restarting Vector. - -### Reload - -Vector supports hot [reloading][docs.process-management#reloading] to apply -any configuration changes. This is achieved by sending a `SIGHUP` process -signal to Vector's process. - -### API - -Vector also includes an [API][docs.reference.api] that allows for real-time -observation and manipulation of a running Vector instance. - -[docs.architecture.data-model]: /docs/about/under-the-hood/architecture/data-model/ -[docs.process-management#reloading]: /docs/administration/process-management/#reloading -[docs.reference.api]: /docs/reference/api/ -[urls.cue]: https://cuelang.org/ -[urls.dag]: https://en.wikipedia.org/wiki/Directed_acyclic_graph -[urls.jsonnet]: https://jsonnet.org/ -[urls.vector_components]: /components/ -[urls.vector_configuration]: /docs/configuration/ diff --git a/docs/manual/about/under-the-hood/architecture/runtime-model.md b/docs/manual/about/under-the-hood/architecture/runtime-model.md deleted file mode 100644 index 129321c63d55a..0000000000000 --- a/docs/manual/about/under-the-hood/architecture/runtime-model.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Runtime Model -description: Vector's runtime model and how it manages concurrency. ---- - - - -Vector's runtime is a futures-based asynchronous runtime where nodes in Vector's -[DAG topology model][docs.architecture.pipeline-model] roughly map to asynchonous -[tasks](#tasks) that [communicate](#data-model) via channels, all -[scheduled](#scheduled) by the [Tokio][urls.rust_tokio] runtime. - -## Tasks - -Nodes in Vector's [topology][docs.architecture.pipeline-model] roughly map to -asynchronous tasks, with the exception being stateless transforms that are -inlined into the source for [concurrency][docs.architecture.concurrency-model] -reasons. - -### Source tasks - -[Sources][docs.sources] are tasks with an output channel. This -interface is intentionally simple and favors internal composability to allow for -maximum flexibility across Vector's wide array of sources. - -### Transform tasks - -[Transforms][docs.transforms] can both be tasks or stateless functions -depending on their purpose. - -#### Stateless function transforms - -Stateless function transforms are single operation transforms that do not -maintain state across multiple events. For example, the -[`remap` transform][docs.transforms.remap] performs individual -operations on events as they are received and immediately returns. This -function-like simplificity allows them to be inlined at the source level to -achieve our [conccurency model](concurrency-model). - -#### Task transforms - -Task transforms can optionally maintain state across multiple events. Therefore, -they run as separate tasks and cannot be inlined at the source level for -concurrency. An example of task transform is the -[`dedupe` transform][docs.transforms.dedupe], which maintains state to -drop duplicate events. - -### Sink tasks - -[Sinks][docs.sinks] are tasks with an input channel. This interface is -intentionally simple and favors internal composability to allow for maximum -flexibility. Sinks share a lot of infrastructure that make them easy and -flexible to build. Such as streaming, batching, partitioning, networking, -retries, and buffers. - -## Scheduler - -Vectur leverages the [Tokio][urls.rust_tokio] runtime for task scheduling. - -## Data plane - -Nodes in Vector's [DAG topology][docs.architecture.pipeline-model] communicate -via channels. Edge nodes are customized channels with dynamic output control -where back pressure is the default, but can be customized on a per-sink basis to -shed load or persist to disk. - -[docs.architecture.concurrency-model]: /docs/about/under-the-hood/architecture/concurrency-model/ -[docs.architecture.pipeline-model]: /docs/about/under-the-hood/architecture/pipeline-model/ -[docs.sinks]: /docs/reference/configuration/sinks/ -[docs.sources]: /docs/reference/configuration/sources/ -[docs.transforms.dedupe]: /docs/reference/configuration/transforms/dedupe/ -[docs.transforms.remap]: /docs/reference/configuration/transforms/remap/ -[docs.transforms]: /docs/reference/configuration/transforms/ -[urls.rust_tokio]: https://github.com/tokio-rs/tokio diff --git a/docs/manual/about/under-the-hood/guarantees.md b/docs/manual/about/under-the-hood/guarantees.md deleted file mode 100644 index 42f2d6075a3dc..0000000000000 --- a/docs/manual/about/under-the-hood/guarantees.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Guarantees -description: Vector's gaurantees. Covering delivery and stability guarantees for each Vector component. ---- - -Vector attempts to make it clear which guarantees you can expect from it. We -categorize all components by their targeted delivery guarantee and also by -their general stability. This helps you make the appropriate trade-offs for your -use case. - -Here you can find an overview of delivery guarantee types and their meaning as -well as how we label the stability of our components. Next, you can head over to -the [components page][pages.components] and use filters to see which components -support specific guarantees. - -## Delivery Guarantees - -
      -
    • - -### At-Least-Once - -The `at-least-once` delivery guarantee ensures that an [event][docs.data-model] -received by a Vector component will be delivered at least once. While rare, it -is possible for an event to be delivered more than once. See the -[Does Vector support exactly once delivery](#does-vector-support-exactly-once-delivery) -FAQ below). - - - -In order to achieve at least once delivery between restarts your source must -be configured to use `disk` based buffers: - -```toml title="vector.toml" -[sinks.my_sink_id] - # ... - - [sinks.my_sink_id.buffer] - type = "disk" - when_full = "block" - max_size = 104900000 # 100MiB -``` - -Refer to each [sink's][docs.sinks] documentation for further guidance on its -buffer options. - - - -View all at-least-once components - -
    • -
    • - -### Best-Effort - -A `best-effort` delivery guarantee means that a Vector component will make a -best effort to deliver each event, but cannot _guarantee_ delivery. This is -usually due to limitations of the underlying protocol; which are outside the -control of Vector. - -Note that this is _not_ the same as `at-most-once` delivery, as it is still -possible for Vector to introduce duplicates under extreme circumstances. - -
    • -
    - -## Stability Guarantees - -
      -
    • - -### Stable - -The `stable` status is a _subjective_ status defined by the Vector team. It is -intended to give you a general idea of a feature's stability for production -environments. A feature is `stable` if it meets the following criteria: - -1. A meaningful amount of users (generally >50) have been using the feature in - a production environment for sustained periods without issue. -2. The feature has had sufficient time (generally >4 months) to be community - tested. -3. The feature API is stable and unlikely to change. -4. There are no major [open bugs][urls.vector_bug_issues] for the feature. - -View all stable components - -
    • -
    • - -### Beta - -The `beta` status means that a feature has not met the criteria outlined in -the [stable](#stable) section and therefore should be used with caution -in production environments. - -
    • -
    • - -### Deprecated - -The `deprecated` status means that a feature will be removed in the next major -version of Vector. We will provide ample time to transition and, when possible, -we will strive to retain backward compatibility. - -
    • -
    - -## FAQs - -### Do I need at least once delivery? - -One of the unique advantages of the metrics and logging use cases is that data is usually -used for diagnostic purposes only. Therefore, losing the occasional event -has little impact on your business. This affords you the opportunity to -provision your pipeline towards performance, simplicity, and cost reduction. -On the other hand, if you're using your data to perform business critical -functions, then data loss is not acceptable and therefore requires "at least -once" delivery. - -To clarify, even though a source or sink is marked as "best effort" it does -not mean Vector takes delivery lightly. In fact, once data is within the -boundary of Vector it will not be lost if you've configured on-disk buffers. -Data loss for "best effort" sources and sinks are almost always due to the -limitations of the underlying protocol. - -### Does Vector support exactly once delivery? - -No, Vector does not support exactly once delivery. There are future plans to -partially support this for sources and sinks that support it, for example Kafka, -but it remains unclear if Vector will ever be able to achieve this. -We recommend [subscribing to our mailing list](/community), -which will keep you in the loop if this ever changes. - -### How can I find components that meet these guarantees? - -Head over to the [components section][pages.components] and use the guarantee -filters. - -[docs.data-model]: /docs/about/under-the-hood/architecture/data-model/ -[docs.sinks]: /docs/reference/configuration/sinks/ -[pages.components]: /components/ -[urls.vector_bug_issues]: https://github.com/timberio/vector/issues?q=is%3Aopen+is%3Aissue+label%3A%22type%3A+bug%22 diff --git a/docs/manual/about/under-the-hood/networking.md b/docs/manual/about/under-the-hood/networking.md deleted file mode 100644 index d5f4e6bc3cd33..0000000000000 --- a/docs/manual/about/under-the-hood/networking.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Networking -description: "Vector's networking internals" -sidebar_label: hidden -hide_pagination: true ---- - - - -This section is currently a work in progress. - - - -ARC diff --git a/docs/manual/about/under-the-hood/networking/adaptive-request-concurrency.md b/docs/manual/about/under-the-hood/networking/adaptive-request-concurrency.md deleted file mode 100644 index f2eb280bf51ec..0000000000000 --- a/docs/manual/about/under-the-hood/networking/adaptive-request-concurrency.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Adaptive Request Concurrency (ARC) -sidebar_label: ARC -description: The fundamental Vector concepts. A great place to start learning about Vector. ---- - -![The Adaptive Request Concurrency decision chart](/img/adaptive-concurrency.png) - -ARC (Adaptive Request Concurrency) is a Vector networking feature that does away -with static rate limits and automatically optimizes HTTP concurrency limits -based on downstream service responses. The underlying [mechanism](#how-it-works) -is a feedback loop inspired by TCP congestion control algorithms. - -The end result is improved performance and reliability across your entire -observability infrastructure. - -Read the feature announcement diff --git a/docs/manual/about/what-is-vector.md b/docs/manual/about/what-is-vector.md deleted file mode 100644 index d476564ebb3d5..0000000000000 --- a/docs/manual/about/what-is-vector.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "What is Vector?" -description: "High-level overview of the Vector observability data pipeline" ---- - - - -Vector is a high-performance observability data pipeline that puts organizations -in control of their observability data. [Collect][docs.sources], -[transform][docs.transforms], and [route][docs.sinks] all your logs, metrics, -and traces to any vendors you want today and any other vendors you may want -tomorrow. Vector enables dramatic cost reduction, novel data enrichment, and -data security where you need it, not where is most convenient for your vendors. -Open source and up to 10x faster than every alternative. - -Vector is downloaded millions of times per month and relied on by companies -like T-Mobile, Comcast, Zendesk, and Discord to own their observability data. - -Get started - -[docs.sinks]: /docs/reference/configuration/sinks/ -[docs.sources]: /docs/reference/configuration/sources/ -[docs.transforms]: /docs/reference/configuration/transforms/ diff --git a/docs/manual/administration.md b/docs/manual/administration.md deleted file mode 100644 index 495218731dce7..0000000000000 --- a/docs/manual/administration.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Administration -description: "How to administer and operate Vector." -sidebar_label: hidden -hide_pagination: true ---- - -This section will cover administrating and operating Vector. - ---- - -Monitoring -Process management -Tuning -Updating -Validating diff --git a/docs/manual/administration/monitoring.md b/docs/manual/administration/monitoring.md deleted file mode 100644 index 7482cef8ace4c..0000000000000 --- a/docs/manual/administration/monitoring.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: Monitoring -description: How to monitor and observe Vector with logs, metrics, and more. ---- - -This document will cover monitoring Vector. - -## Logs - -### Accessing - - - - -The Vector package from the APT repository installs Vector as a Systemd service. Logs can be -accessed through the `journalctl` utility: - -```bash -sudo journalctl -fu vector -``` - - - - -The Vector DEB package installs Vector as a Systemd service. Logs can be -accessed through the `journalctl` utility: - -```bash -sudo journalctl -fu vector -``` - - - - -If you've started Vector through the `docker` CLI you can access Vector's logs -via the `docker logs` command. First, find the Vector container ID: - -```bash -docker ps | grep vector -``` - -Copy Vector's container ID and use it to tail the logs: - -```bash -docker logs -f -``` - - - - -If you started Vector through Docker compose you can use the following command -to access Vector's logs: - -```bash -docker-compose logs -f vector -``` - -Replace `vector` with the name of Vector's service if it is not called `vector`. - - - - -When Vector is started through Homebrew the logs are automatically routed to -`/usr/local/var/log/vector.log`. You can tail them with the `tail` utility: - -```bash -tail -f /usr/local/var/log/vector.log -``` - - - - -The Vector MSI package does not install Vector into a proces manager. Therefore, -Vector must be started by executing the Vector binary directly. Vector's logs -are written to `STDOUT`. You are in charge of routing `STDOUT`, and this -determines how you access Vector's logs. - - - - -The Vector Nix package does not install Vector into a proces manager. Therefore, -Vector must be started by executing the Vector binary directly. Vector's logs -are written to `STDOUT`. You are in charge of routing `STDOUT`, and this -determines how you access Vector's logs. - - - - -The Vector RPM package installs Vector as a Systemd service. Logs can be -accessed through the `journalctl` utility: - -```bash -sudo journalctl -fu vector -``` - - - - -If you are starting Vector directly from the Vector CLI then all logs will be -written to `STDOUT`. You are in charge of routing `STDOUT`, and this determines -how you access Vector's logs. - - - - -The Vector package from the Yum repository installs Vector as a Systemd service. Logs can be -accessed through the `journalctl` utility: - -```bash -sudo journalctl -fu vector -``` - - - - -### Levels - -By default, Vector logs on the `info` level, you can change the level through -a variety of methods: - -| Method | Description | -| :------------------------------------------- | :---------------------------------------------------------------------------------- | -| [`-v` flag][docs.process-management#flags] | Drops the log level to `debug`. | -| [`-vv` flag][docs.process-management#flags] | Drops the log level to `trace`. | -| [`-q` flag][docs.process-management#flags] | Raises the log level to `warn`. | -| [`-qq` flag][docs.process-management#flags] | Raises the log level to `error`. | -| [`-qqq` flag][docs.process-management#flags] | Turns logging off. | -| `LOG=` env var | Set the log level. Must be one of `trace`, `debug`, `info`, `warn`, `error`, `off`. | - -### Full Backtraces - -You can enable full error backtraces by setting the `RUST_BACKTRACE=full` environment -variable. More on this in the [Troubleshooting guide][guides.advanced.troubleshooting]. - -### Rate Limiting - -Vector rate limits log events in the hot path. This is to your benefit as -it allows you to get granular insight without the risk of saturating IO -and disrupting the service. The trade-off is that repetitive logs will not be -logged. - -## Metrics - -Currently, Vector does not expose metrics. [Issue #230][urls.issue_230] -represents work to run internal Vector metrics through Vector's pipeline. -Allowing you to define internal metrics as a [source][docs.sources] and -then define one of many metrics [sinks][docs.sinks] to collect those metrics, -just as you would metrics from any other source. - -## Troubleshooting - -Please refer to our troubleshooting guide: - -Troubleshooting Guide - -[docs.process-management#flags]: /docs/administration/process-management/#flags -[docs.sinks]: /docs/reference/sinks/ -[docs.sources]: /docs/reference/sources/ -[guides.advanced.troubleshooting]: /guides/advanced/troubleshooting/ -[urls.issue_230]: https://github.com/timberio/vector/issues/230 diff --git a/docs/manual/administration/process-management.md b/docs/manual/administration/process-management.md deleted file mode 100644 index e33aebaad2ee0..0000000000000 --- a/docs/manual/administration/process-management.md +++ /dev/null @@ -1,345 +0,0 @@ ---- -title: Process Management -description: "How to manage the Vector process: starting, stopping, and reloading." ---- - -This document covers how to manage the Vector process using various interfaces. -How you manage the Vector process is largely dependent on how you installed -Vector. - -## Starting - -### Command - - - - -```bash -sudo systemctl start vector -``` - - - - -```bash -sudo systemctl start vector -``` - - - - -```bash -docker run \ - -v $PWD/vector.toml:/etc/vector/vector.toml:ro \ - timberio/vector:latest-alpine -``` - - - -- The `-v $PWD/vector.to...` flag passes your custom configuration to Vector. -- The `timberio/vector:latest-alpine` is the default image we've chosen, you are welcome to use [other image variants][docs.platforms.docker#variants]. - - - - - - - - - -```bash -brew services start vector -``` - - - - -```bat -.\bin\vector --config config\vector.toml -``` - - - - -```bash -vector --config /etc/vector/vector.toml -``` - - - -- `vector` is placed in your `$PATH`. -- You must create a [Vector configuration file][docs.setup.configuration] to - successfully start Vector. - - - - - - -```bash -sudo systemctl start vector -``` - - - - -```bash -vector --config vector.toml -``` - - - - -```bash -sudo systemctl start vector -``` - - - - -### Flags - -| Flag | Description | | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------ | :-- | -| **Required** | | | -| `-c, --config ` | Path the Vector [configuration file][docs.setup.configuration]. | | -| **Optional** | | | -| `-q, --quiet` | Raises the log level to `warn`. | | -| `-qq` | Raises the log level to `error`. | | -| `-qqq` | Turns logging off. | | -| `-r, --require-healthy` | Causes vector to immediately exit if any sinks fail their healthchecks. | | -| `-t, --threads` | Limits the number of internal threads Vector can spawn. | | -| `-v, --verbose` | Drops the log level to `debug`. | | -| `-vv` | Drops the log level to `trace`, the lowest level possible. | | -| `-w, --watch-config` | Vector will watch for changes in [configuration file][docs.setup.configuration], and reload accordingly. (Mac/Linux only) | | - -### Daemonizing - -Vector does not _directly_ offer a way to daemonize the Vector process. We -highly recommend that you use a utility like [Systemd][urls.systemd] to -daemonize and manage your processes. Vector provides a -[`vector.service` file][urls.vector_systemd_file] for Systemd. - -## Stopping - -The Vector process can be stopped by sending it a `SIGTERM` process signal. - -### Command - - - - -```bash -sudo systemctl stop vector -``` - - - - -```bash -sudo systemctl stop vector -``` - - - - -```bash -docker stop timberio/vector -``` - - - - - - - -```bash -brew services stop vector -``` - - - - -The Vector MSI package does not install Vector into a process manager. -Therefore, you are responsible for stopping Vector based on how you started it. - - - - -The Vector Nix package does not install Vector into a process manager. -Therefore, you are responsible for stopping Vector based on how you started it. - - - - -```bash -sudo systemctl stop vector -``` - - - - -If you are starting Vector directly from the Vector CLI then you are responsible -for stopping Vector depending on how you are managing the process. If you're -in the terminal, hitting `ctrl+c` will exit the process. - - - - -```bash -sudo systemctl stop vector -``` - - - - -### Graceful Shutdown - -Vector is designed to gracefully shutdown within 20 seconds when a `SIGTERM` -process signal is received. The shutdown process is as follows: - -1. Stop accepting new data for all [sources][docs.sources]. -2. Gracefully close any open connections with a 20 second timeout. -3. Flush any sink buffers with a 20 second timeout. -4. Exit the process with a `1` exit code. - -### Force Killing - -If Vector is forcefully killed there is the potential to lose in-flight -data. To mitigate this we recommend enabling on-disk buffers and avoiding -forceful shutdowns whenever possible. - -### Exit Codes - -If Vector fails to start it will exit with one of the preferred exit codes -as defined by `sysexits.h`. A full list of exit codes can be found in the -[`exitcodes` Rust crate][urls.exit_codes]. The relevant codes that Vector uses -are: - -| Code | Description | -| :--- | :--------------------------------------- | -| `0` | No error. | -| `78` | Bad [configuration][docs.setup.configuration]. | - -## Reloading - -Vector can be reloaded, on the fly, to recognize any configuration changes by -sending the Vector process a `SIGHUP` signal. - -### Command - - - - -```bash -sudo systemctl stop vector -``` - - - - -```bash -sudo systemctl stop vector -``` - - - - -```bash -docker stop timberio/vector -``` - - - - - - - -```bash -brew services stop vector -``` - - - - -The Vector MSI package does not install Vector into a process manager. -Therefore, you are responsible for stopping Vector based on how you started it. - - - - -The Vector Nix package does not install Vector into a process manager. -Therefore, you are responsible for stopping Vector based on how you started it. - - - - -```bash -sudo systemctl stop vector -``` - - - - -If you are starting Vector directly from the Vector CLI then you are responsible -for stopping Vector depending on how you are managing the process. If you're -in the terminal, hitting `ctrl+c` will exit the process. - - - - -```bash -sudo systemctl stop vector -``` - - - - -### Automatic Reload On Changes - -You can automatically reload Vector's configuration file when it changes by using -the `-w` or `--watch-config` flag when [starting](#starting) Vector. This is -particularly helpful in scenarios where configuration is managed for you, such -as Kubernetes. - -### Configuration Errors - -When Vector is reloaded it proceeds to read the new configuration file from -disk. If the file has errors it will be logged to `STDOUT` and ignored, -preserving any previous configuration that was set. If the process exits you -will not be able to restart the process since it will try to use the -new, invalid, configuration file. - -### Graceful Pipeline Transitioning - -Vector will perform a diff between the new and old configuration, determining -which sinks and sources should be started and shutdown and ensures the -transition from the old to new pipeline is graceful. - -[docs.setup.configuration]: /docs/setup/configuration/ -[docs.platforms.docker#variants]: /docs/setup/installation/platforms/docker/#variants -[docs.sources]: /docs/reference/sources/ -[urls.exit_codes]: https://docs.rs/exitcode/1.1.2/exitcode/#constants -[urls.systemd]: https://systemd.io/ -[urls.vector_systemd_file]: https://github.com/timberio/vector/blob/master/distribution/systemd/vector.service diff --git a/docs/manual/administration/tuning.md b/docs/manual/administration/tuning.md deleted file mode 100644 index 797436ef8d68a..0000000000000 --- a/docs/manual/administration/tuning.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Tuning -description: How to tune Vector. ---- - - - -Vector is written in [Rust][urls.rust] and therefore does not include a runtime -or VM. There are no special service level steps you need to do to improve -performance. By default, Vector will take full advantage of all system -resources without any adjustments. Welcome to Rust! - -[urls.rust]: https://www.rust-lang.org/ diff --git a/docs/manual/administration/updating.md b/docs/manual/administration/updating.md deleted file mode 100644 index 9855d80e6633c..0000000000000 --- a/docs/manual/administration/updating.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Updating -description: How to update Vector to a newer version. ---- - -Updating Vector depends largely on your [installation][docs.installation] -method. Each installation guide provides its own "Updating" section: - -## Installation Method - -### Package managers - -APT -DPKG -Homebrew -MSI -Nix -RPM -YUM - -### Manual - -Updating from archives -Updating from source - -## Working Upstream - -Depending on your [topology][docs.topologies], you'll want update your Vector -instances in a specific order. You should _always_ start downstream and work -your way upstream. This allows for incremental updating across your topology, -ensuring downstream Vector instances do not receive data in formats that are -unrecognized. Vector always makes a best effort to successfully process data, -but there is no guarantee of this if a Vector instance is handling a data -format defined by a future unknown Vector version. - -## Capacity Planning - -When updating, you'll be taking Vector instances off-line for a short period of time, -and upstream data will accumulate and buffer. To avoid overloading your instances, -you'll want to make sure you have enough capacity to handle the surplus of -data. We recommend provisioning at least 20% of head room, on all resources, -to account for spikes and updating. - -[docs.installation]: /docs/setup/installation/ -[docs.topologies]: /docs/setup/deployment/topologies/ diff --git a/docs/manual/administration/validating.md b/docs/manual/administration/validating.md deleted file mode 100644 index 4de1551eef981..0000000000000 --- a/docs/manual/administration/validating.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Validating -description: How to validation Vector's configuration to ensure it is error-free before applying it. ---- - -Vector provides a subcommand, `validate`, which checks the validity of any number -of configuration files and then exits: - - - - -```bash -vector validate /etc/vector/vector.toml -``` - - - - -```bash -vector validate --no-environment /etc/vector/*.toml -``` - - - - -The validate subcommand checks the correctness of fields for components defined -within a configuration file, including: - -1. That [sources][docs.sources], [transforms][docs.transforms], and - [sinks][docs.sinks] include all non-optional fields. -2. All fields are of the proper [type][docs.setup.configuration#types]. - -The following group of checks verifies that the configuration file contains a valid topology -expanding the above checks with the following: - -3. At least one [source][docs.sources] is defined. -4. At least one [sink][docs.sinks] is defined. -5. All `inputs` values contain at least one value (cannot be empty). -6. All `inputs` values reference valid and upstream [source][docs.sources] or - [transform][docs.transforms] components. - -The following group of checks require the runtime environment to pass successfully, -and can be disabled with flags such as `--no-environment`, expanding the above checks with the following: - -7. All components are capable of running, for example that data directories exist and are writable, etc. -8. All [sinks][docs.sinks] are able to connect to their targets. - -If validation fails, Vector will exit with an exit code of `78`, and if validation succeeds -Vector will exit with an exit code of `0`. - -To see other customization options for the `validate` subcommand run -`vector validate --help`. - -[docs.setup.configuration#types]: /docs/setup/configuration/#types -[docs.sinks]: /docs/reference/sinks/ -[docs.sources]: /docs/reference/sources/ -[docs.transforms]: /docs/reference/transforms/ diff --git a/docs/manual/meta/glossary.md b/docs/manual/meta/glossary.md deleted file mode 100644 index 0e6191aab1bc0..0000000000000 --- a/docs/manual/meta/glossary.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Glossary -description: "Vector glossary of terms" ---- - -The glossary contains common terms and their definitions. - - - -## Batch - -"Batch" refers to a [batched payload][docs.data-model.log] within a sink. It is a batch of events encoded into a payload that the downstream service understands. - -## Benchmark - -"Benchmark" refers to a test designed to measure performance and resource usage. You can learn more about Vector's benchmarks in the [Benchmarks][pages.index#performance] section. - -## Binary - -"Binary" refers to the static binary that Vector compiles to. - -## Buffer - -"Buffer" refers to an ordered queue of events that is coupled with a sink. - -## Configuration - -"Configuration" refers to the settings and options used to control Vector's behavior. You can learn more about Vector's configuration in the [Configuration][docs.setup.configuration] section. - -## Durability - -"Durability" refers to the ability to retain data across exceptional events. In the context of Vector, this typically refers to the ability to retain data across restarts. - -## Event - -"Event" refers to a single unit of data that flows through Vector. You can learn more about events in the [Data Model][docs.data_model] section. - -## Filter - -"Filter" refers to a type of [transform][docs.transforms] that filters events or fields on an event. - -## Flush - -"flush" refers to the act of sending a batched payload to a downstream service. It is commonly used in conjunction with "buffer". - -## Github - -"[Github](https://github.com/)"" refers to the service used to host Vector's source code. - -## Guide - -"Guide" is a tutorial or walk through on a specific subject. You can see Vector's guides in the [Guides][guides.index] section. - -## Log - -"Log" refers to an individual log event. This is a type of [Vector event][docs.data-model.metric]. - -## Lucio - -A sporty Italian that bleeds Rust, is a core member of the Vector team, and who does not approve of New York pizza. - -## Metric - -"Metric" refers to an individual data unit used to represent a point in time -measurement. This is a type of [Vector event][docs.data-model.metric]. - -## Parser - -"Parser" refers to a [transform][docs.transforms] that parses event data. - -## Pipeline - -"Pipeline" refers to the end result of combining [sources][docs.sources], -[transforms][docs.transforms], and [sinks][docs.sinks]. - -## Reducer - -"Reducer" refers to a [transform][docs.transforms] that reduces data into -a metric. - -## Repo - -"Repo" refers to a Git repository, usually the [Vector Git repository][urls.vector_repo]. - -## Router - -"Router" refers is something that accepts and routes data to many destinations, -this is commonly used to describe Vector. - -## Rust - -"Rust" refers to the [Rust programming language][urls.rust] that Vector is -written in. - -## Sample - -"Sample" refers to a [transform][docs.transforms] that samples data. - -## Sink - -"Sink" refers to the Vector [sink concept][docs.sinks]. - -## Source - -"Source" refers to the Vector [source concept][docs.sources]. - -## Strategy - -"Strategy" refers to a [deployment strategy][docs.strategies] under which Vector is -deployed. - -## Structured Log - -"Structured log" refers to a log represented in a structured form, such as -a map. This is different from a text log, which is represented as a single -text string. - -## Table - -"Table" refers to the [TOML table type][urls.toml_table]. - -## TOML - -"TOML" refers to [Tom's Obvious Markup Language][urls.toml] and it is the syntax -used to represent the Vector configuration. - -## Topology - -"Topology" refers to a [deploy topology][docs.topologies] that Vector is -deployed under. - -## Transform - -"Transform" refers to the Vector [transform concept][docs.transforms]. - -## Use Case - -"Use case" refers to a way in which Vector is used, such logs, metrics, -reducing cost, etc. - -## Vector - -"Vector" is the name of this project. - -[docs.setup.configuration]: /docs/setup/configuration/ -[docs.data-model.log]: /docs/about/data-model/log/ -[docs.data-model.metric]: /docs/about/data-model/metric/ -[docs.data_model]: /docs/about/data-model/ -[docs.sinks]: /docs/reference/sinks/ -[docs.sources]: /docs/reference/sources/ -[docs.strategies]: /docs/setup/deployment/strategies/ -[docs.topologies]: /docs/setup/deployment/topologies/ -[docs.transforms]: /docs/reference/transforms/ -[guides.index]: /guides/ -[pages.index#performance]: /#performance -[urls.rust]: https://www.rust-lang.org/ -[urls.toml]: https://github.com/toml-lang/toml -[urls.toml_table]: https://github.com/toml-lang/toml#table -[urls.vector_repo]: https://github.com/timberio/vector diff --git a/docs/manual/setup.md b/docs/manual/setup.md deleted file mode 100644 index 8fdff13585828..0000000000000 --- a/docs/manual/setup.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Setup -description: "Everything you need to know to setup Vector" -sidebar_label: hidden -hide_pagination: true ---- - -This section will cover everything you need to know to setup Vector. From -installation to deployment: - -Configuration -Deployment -Installation diff --git a/docs/manual/setup/configuration.md b/docs/manual/setup/configuration.md deleted file mode 100644 index ea063b4a19ded..0000000000000 --- a/docs/manual/setup/configuration.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Configuration -description: Configuring Vector ---- - -This section covers configuring Vector and creating pipelines like the -[example below](#example). Vector's configuration uses the [TOML][urls.toml] -syntax, and the configuration file must be passed via the -[`--config` flag][docs.process-management#flags] when -[starting][docs.process-management#starting] Vector: - -```bash -vector --config /etc/vector/vector.toml -``` - -## Example - -```toml title="vector.toml" -# Set global options -data_dir = "/var/lib/vector" - -# Ingest data by tailing one or more files -[sources.apache_logs] - type = "file" - include = ["/var/log/apache2/*.log"] # supports globbing - ignore_older = 86400 # 1 day - -# Structure and parse the data -[transforms.apache_parser] - inputs = ["apache_logs"] - type = "regex_parser" # fast/powerful regex - patterns = ['^(?P[w.]+) - (?P[w]+) (?P[d]+) [(?P.*)] "(?P[w]+) (?P.*)" (?P[d]+) (?P[d]+)$'] - -# Sample the data to save on cost -[transforms.apache_sample] - inputs = ["apache_parser"] - type = "sample" - rate = 50 # only keep 50% - -# Send structured data to a short-term storage -[sinks.es_cluster] - inputs = ["apache_sample"] # only take sampled data - type = "elasticsearch" - host = "http://79.12.221.222:9200" # local or external host - index = "vector-%Y-%m-%d" # daily indices - -# Send structured data to a cost-effective long-term storage -[sinks.s3_archives] - inputs = ["apache_parser"] # don't sample for S3 - type = "aws_s3" - region = "us-east-1" - bucket = "my-log-archives" - key_prefix = "date=%Y-%m-%d" # daily partitions, hive friendly format - compression = "gzip" # compress final objects - encoding = "ndjson" # new line delimited JSON - [sinks.s3_archives.batch] - max_size = 10000000 # 10mb uncompressed - -``` - -The key thing to note above is the use of the `inputs` option. This connects -Vector's component to create a pipeline. For a simple introduction, please -refer to the: - -Getting Started Guide - -## Reference - -Vector provides a [full reference][docs.reference] that you can use to build -your configuration files. - -Sources -Transforms -Sinks - -And for more advanced techniques: - -Env Vars -Global options -Template syntax -Tests - -## How It Works - -### Configuration File Location - -The location of your Vector configuration file depends on your [installation -method][docs.installation]. For most Linux based systems, the file can be -found at `/etc/vector/vector.toml`. - -### Environment Variables - -Vector will interpolate environment variables within your configuration file -with the following syntax: - -```toml title="vector.toml" -[transforms.add_host] - type = "add_fields" - - [transforms.add_host.fields] - host = "${HOSTNAME}" - environment = "${ENV:-development}" # default value when not present -``` - - - -Interpolation is done before parsing the configuration file. As such, the -entire `${ENV_VAR}` variable will be replaced, hence the requirement of -quotes around the definition. - - - -Please refer to the [environment variables reference][docs.reference.env-vars] -for more info. - -### Multiple Configuration Files - -You can pass multiple configuration files when starting Vector: - -```bash -vector --config vector1.toml --config vector2.toml -``` - -Or use a [globbing syntax][urls.globbing]: - -```bash -vector --config /etc/vector/*.toml -``` - -### Syntax - -The Vector configuration file follows the [TOML][urls.toml] syntax for its -simplicity, explicitness, and relaxed white-space parsing. For more information, -please refer to the [TOML documentation][urls.toml]. - -### Template Syntax - -Select configuration options support Vector's -[template syntax][docs.reference.templates] to produce dynamic values derived -from the event's data. Two syntaxes are supported for fields that support field -interpolation: - -1. [Strptime specifiers][urls.strptime_specifiers]. Ex: `date=%Y/%m/%d` -2. [Log fields][docs.data-model.log]. Ex: `{{ field_name }}` -3. [Metric name, namespace, or tags][docs.data-model.metric]. Ex: `{{ name }} {{ namespace }} {{ tags.tag_name }}` - -For example: - -```toml title="vector.toml" -[sinks.es_cluster] - type = "elasticsearch" - index = "user-{{ user_id }}-%Y-%m-%d" -``` - -The above `index` value will be calculated for _each_ event. For example, given -the following event: - -```json -{ - "timestamp": "2019-05-02T00:23:22Z", - "message": "message", - "user_id": 2 -} -``` - -The `index` value will result in: - -```toml -index = "user-2-2019-05-02" -``` - -Learn more in the [template reference][docs.reference.templates]. - -### Types - -All TOML values types are supported. For convenience this includes: - -- [Strings](https://github.com/toml-lang/toml#string) -- [Integers](https://github.com/toml-lang/toml#integer) -- [Floats](https://github.com/toml-lang/toml#float) -- [Booleans](https://github.com/toml-lang/toml#boolean) -- [Offset Date-Times](https://github.com/toml-lang/toml#offset-date-time) -- [Local Date-Times](https://github.com/toml-lang/toml#local-date-time) -- [Local Dates](https://github.com/toml-lang/toml#local-date) -- [Local Times](https://github.com/toml-lang/toml#local-time) -- [Arrays](https://github.com/toml-lang/toml#array) -- [Tables](https://github.com/toml-lang/toml#table) - -[docs.data-model]: /docs/about/data-model/ -[docs.installation]: /docs/setup/installation/ -[docs.process-management#flags]: /docs/administration/process-management/#flags -[docs.process-management#starting]: /docs/administration/process-management/#starting -[docs.reference.env-vars]: /docs/reference/env-vars/ -[docs.reference.templates]: /docs/reference/templates/ -[docs.reference]: /docs/reference/ -[urls.globbing]: https://en.wikipedia.org/wiki/Glob_(programming) -[urls.strptime_specifiers]: https://docs.rs/chrono/0.4.11/chrono/format/strftime/index.html#specifiers -[urls.toml]: https://github.com/toml-lang/toml diff --git a/docs/manual/setup/deployment.md b/docs/manual/setup/deployment.md deleted file mode 100644 index bc9f6afa110c7..0000000000000 --- a/docs/manual/setup/deployment.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Deployment -sidebar_label: hidden -description: How to deploy Vector into your own infrastructure -hide_pagination: true ---- - -This section will cover deploying Vector. Vector is designed to be the single -and only tool needed to get data from A to B, serving as a -[daemon][docs.strategies#daemon], [sidecar][docs.strategies#sidecar], or -[service][docs.strategies#service]. You combine these strategies to form -[topologies][docs.topologies]. - -Start by becoming familiar with the [deployment strategies][docs.strategies] -and then take a closer look at the [topologies][docs.topologies] you can create. - ---- - -Strategies -Topologies - -[docs.strategies#daemon]: /docs/setup/deployment/strategies/#daemon -[docs.strategies#service]: /docs/setup/deployment/strategies/#service -[docs.strategies#sidecar]: /docs/setup/deployment/strategies/#sidecar -[docs.strategies]: /docs/setup/deployment/strategies/ -[docs.topologies]: /docs/setup/deployment/topologies/ diff --git a/docs/manual/setup/deployment/strategies.md b/docs/manual/setup/deployment/strategies.md deleted file mode 100644 index a9786c49f8126..0000000000000 --- a/docs/manual/setup/deployment/strategies.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Deployment Strategies -description: The various strategies used to deploy Vector across your infrastructure. -sidebar_label: Strategies ---- - -Vector is designed to be the single and only tool needed to get data from A to -B. This means Vector can be deployed as a [daemon](#daemon), -[sidecar](#sidecar), or a [service](#service). You combine these strategies to -form [topologies][docs.topologies] which are covered in the -[next section][docs.topologies]. In this section we'll cover each strategy in -detail and help you understand when to use each. - -## Daemon - -The [daemon deployment strategy][docs.strategies#daemon] is designed for data -collection on a single host. Vector runs in the background, in its own process, -collecting _all_ data for that host. -Typically data is collected from a process manager, such as Journald via -Vector's [`journald` source][docs.sources.journald], but can be collected -through any of Vector's [sources][docs.sources]. -The following diagram demonstrates how it works. - - - -### When to use - -- You are responsible for the host machine and have the ability to install - Vector directly on the host. -- You are operationally proficient and understand how to reliably install, - manage, and configure software. -- You want a single robust solution for collecting and shipping your - observability data on each host. - -### When NOT to use - -- You do not control the host machine or environment. -- You do not feel comfortable installing, managing, and configuring host-level - software. -- You want to shift responsibility of collecting and shipping observability data - to each service owner. - -## Sidecar - -The [sidecar deployment strategy][docs.strategies#sidecar] is designed to -collect data from a _single_ service. Vector has a tight 1 to 1 coupling with -each service. Typically data is collected by tailing local files via Vector's -[`file` source][docs.sources.file], but can be collected through any of Vector's -[sources][docs.sources]. The following diagram demonstrates how it works. - - - -### When to use - -- You are not responsible for the host machine and do not have the ability to - install Vector directly on the host. -- You want to couple data collection with each service, shifting responsibility - to the service owner. -- You find it simpler for each service to have it own specific Vector - instance and configuration file. - -### When NOT to use - -- You do not like the idea of having multiple Vector instances on a - single host. - -## Service - -The [service deployment strategy][docs.strategies#service] treats Vector like a -separate service. It is designed to receive data from an upstream source and -fan-out to one or more destinations. -Typically, upstream sources are other Vector instances sending data via the -[`vector` sink][docs.sinks.vector], but can be collected through any of Vector's -[sources][docs.sources]. -The following diagram demonstrates how it works. - - - -### When to use - -- You need to batch data to optimize throughput and reduce the downstream - request rate. -- You want to perform operations across multiple hosts, such as aggregating - data in a global context. -- Vector is a stream consumer, continually pulling data from services like - Kafka, Kinesis, or SQS. -- You are receiving data from other upstream Vector instances via the - [`vector` sink][docs.sinks.vector]. - -### When NOT to use - -- Your downstream services support streaming where each individual host can - write data directly to the services. -- You do not need to perform operations across multiple hosts. - -[docs.sinks.vector]: /docs/reference/sinks/vector/ -[docs.sources.file]: /docs/reference/sources/file/ -[docs.sources.journald]: /docs/reference/sources/journald/ -[docs.sources]: /docs/reference/sources/ -[docs.strategies#daemon]: /docs/setup/deployment/strategies/#daemon -[docs.strategies#service]: /docs/setup/deployment/strategies/#service -[docs.strategies#sidecar]: /docs/setup/deployment/strategies/#sidecar -[docs.topologies]: /docs/setup/deployment/topologies/ diff --git a/docs/manual/setup/deployment/topologies.md b/docs/manual/setup/deployment/topologies.md deleted file mode 100644 index 775af720b198c..0000000000000 --- a/docs/manual/setup/deployment/topologies.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Deployment Topologies -description: The various topologies that Vector can accomplish and when to use each. -sidebar_label: Topologies ---- - -import SVG from 'react-inlinesvg'; - -In the previous section we covered the various [deployment -strategies][docs.strategies] used to collect and forward data. You combine these -strategies to form topologies. This section showcases common topologies and the -pros and cons of each. Use these as _guidelines_ to build your own. - -## Distributed - - - -The simplest topology. This topology offers direct communication with your -downstream services from your client nodes. - -### Pros - -- **Simple.** Less moving parts. -- **Elastic.** Easily scales with your app. Resources grow as you scale. - -### Cons - -- **Less efficient.** Depending on the complexity of your pipelines, this will - use more local resources, which could disrupt the performance of other - applications on the same host. -- **Less durable.** Because data is buffered on the host it is more likely - you'll lose buffered data in the event of an unrecoverable crash. Often times - this is the most important and useful data. -- **More downstream stress.** Downstream services will receive more requests - with smaller payloads that could potentially disrupt stability of these - services. -- **Reduced downstream stability.** You risk overloading downstream services - if you need to scale up quickly or exceed the capacity a downstream service - can handle. -- **Lacks multi-host context.** Lacks awareness of other hosts and eliminates - the ability to perform operations across hosts, such as reducing logs to - global metrics. This is typically a concern for very large deployments where - individual host metrics are less useful. - -## Centralized - - - -A good balance of simplicity, stability, and control. For most, this topology -is a good compromise between the [distributed](#distributed) and -[stream-based](#stream-based) topologies. It offers many of the advantages of -the stream-based topology without the management overhead and cost of running a -Kafka cluster. - -### Pros - -- **More efficient.** More efficient for client nodes and downstream services. - Vector agents are doing less which means they're using less resources. In - addition, the centralized Vector service will buffer more data, achieve - better compression, and send optimized requests downstream. -- **More reliable.** Vector will protect downstream services from volume spikes, - buffering and flushing data at smoothed out intervals. -- **Has multi-host context.** Because your data is centralized, you'll be able - to perform operations across hosts, such as reducing logs to global metrics. - This is advantageous for large deployments where individual host metrics are - not interesting. - -### Cons - -- **More complex.** There are more moving parts. -- **Less durable.** Agent nodes are designed to get data off of the machine as - quickly as possible, and this offers higher potential for data loss since the - central Vector service could die and lose buffered data. If this type of - outage is unacceptable, then we recommend the - [stream-based topology](#stream-based) below. - -## Stream-Based - - - -The most durable and elastic topology. This topology is typically adopted for -very large streams with teams that are familiar with running a stream-based -service such as Kafka. - -### Pros - -- **Most durable & reliable.** Stream services, like Kafka, are designed for - high durability and reliability, replicating data across multiple nodes. -- **Most efficient.** Vector agents are doing less, making them more efficient, - and Vector services do not have to worry about durability, which can be tuned - towards performance. -- **Ability to re-stream.** Re-stream your data depending on your stream's - retention period. -- **Cleaner separation of responsibilities.** Vector is used solely as a routing - layer and is not responsible for durability. Durability is delegated to a - purpose-built service that you can switch and evolve over time. - -### Cons - -- **Increased management overhead.** Managing a stream service, such as Kafka, - is a complex endeavor and generally requires an experienced team to setup and - manage properly. -- **More complex.** This topology is complex and requires a deeper understand of - managing production-grade streams. -- **More expensive.** In addition the management cost, the added stream cluster - will require more resources which will increase operational cost. - -[assets.centralized-diagram]: ../../assets/centralized-diagram.svg -[assets.distributed]: ../../assets/distributed.svg -[assets.stream-based]: ../../assets/stream-based.svg -[docs.strategies]: /docs/setup/deployment/strategies/ diff --git a/docs/manual/setup/getting-started.md b/docs/manual/setup/getting-started.md deleted file mode 100644 index a795b5d810777..0000000000000 --- a/docs/manual/setup/getting-started.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Getting Started with Vector -description: Getting Started with Vector, the "Hello World" of Vector tutorials. ---- - -Welcome to Vector! - -Vector is a high-performance observability data pipeline that allows you to collect, transform, -and route all your logs and metrics. - -In this getting started guide, we'll walk you through using Vector for the first time. We'll install Vector -and create our first observability data pipeline so you can begin to see what Vector can do. - -## Install Vector - -Installing Vector is quick and easy. We can use this handy installation script: - -```shell -curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh -``` - -Or you can [choose your preferred installation method][docs.installation]. - -Once we have Vector installed, let's check to make sure that it's working correctly: - -```shell -vector --version -``` - -## Configure Vector - -Vector topologies are defined with a [configuration file][docs.setup.configuration] that tells it what -[components][pages.components] to run and how they should interact. Vector topologies are made up of three -types of components: - -* [**Sources**][docs.sources] collect or receive data from observability data sources into Vector -* [**Transforms**][docs.transforms] can manipulate or change that observability data inside Vector -* [**Sinks**][docs.sinks] send data onwards from Vector to external services or destinations - -Let's create a configuration file: - -```toml title="vector.toml" -[sources.in] - type = "stdin" - -[sinks.out] - inputs = ["in"] - type = "console" - encoding.codec = "text" -``` - -Each component has a unique identifier and is prefixed with the type of component, for example, `sources` for a -source. Our first component, `sources.in`, uses the [`stdin` source][docs.sources.stdin] which tells Vector to receive -data over stdin and is identified as `in`. - -Our second component, `sinks.out`, uses the [`console` source][docs.sinks.console] which tells Vector to simply print -the data to stdout. The `encoding.codec` option tells Vector to print the data as plain text (unencoded). - -The `inputs` option in our `sinks.out` component tells Vector where this sink's events are -coming from. In our case, events are received from our other component, the source identified as `in`. - -## Hello World! - -That's it for our first config. Now let's pipe an event through it: - -```bash -echo 'Hello World!' | vector --config ./vector.toml -``` - -The `echo` statement sends a single log to Vector via stdin. The `vector...` command starts Vector with our -previously created config file. - -The event we've just sent will be received by our `sources.in` component, then sent onto the `sinks.out` component, -which will, in turn, echo it back to the console: - -```text -... some logs ... -Hello World! -``` - -> If you want to see something cool, try setting `encoding.codec = "json"` in the sink config. - -## Hello World Mark II - -The echoing of events isn't very exciting. Let's see what we can do with some real observability data. -Let's take a classic problem, collecting and processing Syslog events, and see how Vector handles it. - -To do this, we're going to add two new components to our configuration file. Let's look at our updated -configuration now: - -```toml title="vector.toml" -[sources.generate_syslog] - type = "generator" - format = "syslog" - count = 100 - -[transforms.remap_syslog] - inputs = [ "generate_syslog"] - type = "remap" - source = ''' - structured = parse_syslog!(.message) - . = merge(., structured) - ''' - -[sinks.emit_syslog] - inputs = ["remap_syslog"] - type = "console" - encoding.codec = "json" -``` - -The first component uses the [`generator` source][docs.sources.generator]. The `generator` source creates sample -log data that can allow you to simulate different types of events in various formats. - -> But, but you said "real" observability data? We choose generated data because it's hard for us to know what -> platform you're trying Vector on. That means it's also hard to document a single way for everyone to get -> data into Vector. - -The second component is a transform called [`remap`][docs.transforms.remap]. The `remap` transform is at the heart -of what makes Vector so powerful for processing observability data. The transform exposes -a simple language called [Vector Remap Language][docs.vrl] that allows you to parse, manipulate, and -decorate your event data as it passes through Vector. Using `remap`, you can turn static events into informational -data that can help you ask and answer questions about your environment's state. - -You can see we've added the `sources.generated_syslog` component. The `format` option tells the generator what -type of logs to emit, here `syslog`, and the `count` option tells the generator how many lines to emit, here 100. - -In our second component, `transforms.remap_syslog`, we've specified an `inputs` option of `generate_syslog`, which -means it will receive events from our `generate_syslog` source. We've also specified the type of transform: `remap`. - -Inside the `source` option of the `remap_syslog` component is where we start to see Vector's power. -The `source` contains the list of remapping transformations to apply to each event Vector receives. We're only -performing one operation: [`parse_syslog`][docs.vrl.parse_syslog]. We're passing this function a single field called -`message`, which contains the Syslog event we're generating. This all-in-one function takes a Syslog-formatted -message, parses its contents, and emits it as a structured event. Wait, I can hear you saying? What have you -done with my many lines of Syslog parsing regular expressions? Remap removes the need for this and allows you -to focus on the event's value, not on how to extract that value. - -> We support parsing a variety of logging formats. Of course, if you have an event format that we don't support, -> you can also specify your own custom regular expression using `remap` too! The `!` after the `parse_syslog` function -> tells Vector to emit an error if the message fails to parse, meaning you'll know if some non-standard Syslog is -> received, and you can adjust your remapping to accommodate it! - -Lastly, we've renamed our sink component to `emit_syslog`, updated the `inputs` option to process events generated -by the `remap_syslog` transform, and specified that we want to emit events in JSON-format. - -Let's rerun Vector. This time we don't need to echo any data to it; just run in on the command line. It'll process -100 lines of generated Syslog data, emit the processed data as JSON, and exit: - -```shell -vector --config ./vector.toml -``` - -Now you should have a series of JSON-formatted events, something like this: - -```json -{"appname":"benefritz","facility":"authpriv","hostname":"some.de","message":"We're gonna need a bigger boat","msgid":"ID191","procid":9473,"severity":"crit","timestamp":"2021-01-20T19:38:55.329Z"} -{"appname":"meln1ks","facility":"local1","hostname":"for.com","message":"Take a breath, let it go, walk away","msgid":"ID451","procid":484,"severity":"debug","timestamp":"2021-01-20T19:38:55.329Z"} -{"appname":"shaneIxD","facility":"uucp","hostname":"random.com","message":"A bug was encountered but not in Vector, which doesn't have bugs","msgid":"ID428","procid":3093,"severity":"alert","timestamp":"2021-01-20T19:38:55.329Z"} -``` - -We can see that Vector has parsed the Syslog message and created a structured event containing all of the Syslog -fields. All with one line of Vector's remap language. This example is just the beginning of Vector's capabilities. -You can receive logs and events from dozens of sources. You can use Vector and remap to change data, add fields -to decorate data, convert logs into metrics, drop fields, and dozens of other tasks you use daily to process your -observability data. You can then route and output your events to dozens of destinations. - -## What's next? - -We're just scatching the surface in this post. To get your hands dirty with Vector -check out: - -* All of Vector's [sources][docs.sources], [transforms][docs.transforms], and [sinks][docs.sinks]. -* The [Vector Remap Language][docs.vrl], the heart of data processing in Vector. -* Finally, [deploying Vector][docs.deployment] to launch Vector in your production environment. - -[docs.deployment]: /docs/setup/deployment/ -[docs.installation]: /docs/manual/installation/ -[docs.setup.configuration]: /docs/setup/configuration/ -[docs.sinks]: /docs/reference/components/sinks/ -[docs.sinks.console]: /docs/reference/components/sinks/console/ -[docs.sources]: /docs/reference/components/sources/ -[docs.sources.generator]: /docs/reference/components/sources/generator/ -[docs.sources.stdin]: /docs/reference/components/sources/stdin/ -[docs.transforms.remap]: /docs/reference/components/transforms/remap/ -[docs.transforms]: /docs/reference/components/transforms/ -[docs.vrl]: /docs/reference/vrl/ -[docs.vrl.parse_syslog]: /docs/reference/vrl/functions/#parse_syslog -[pages.components]: /components/ diff --git a/docs/manual/setup/installation.md b/docs/manual/setup/installation.md deleted file mode 100644 index 10e470ee3e731..0000000000000 --- a/docs/manual/setup/installation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Install Vector -sidebar_label: hidden -description: Install Vector on your platform -hide_pagination: true ---- - -Vector compiles to a single `musl` static binary with no dependencies, making it -simple to install. - -## Install script - -This light-weight script will perform platform detection and determine the best -method to install Vector: - - - -## Other methods - -Manual -Operating systems -Package managers -Platforms diff --git a/docs/manual/setup/installation/manual.md b/docs/manual/setup/installation/manual.md deleted file mode 100644 index 483f5c091ffcb..0000000000000 --- a/docs/manual/setup/installation/manual.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Install Vector Manually -sidebar_label: hidden -hide_pagination: true ---- - -Installing Vector manually should be a last resort if Vector cannot be -installed through a supported [platform][docs.platforms] or -[operating system][docs.operating_systems]. - -From Archives -From Source - -[docs.operating_systems]: /docs/setup/installation/operating-systems/ -[docs.platforms]: /docs/setup/installation/platforms/ diff --git a/docs/manual/setup/installation/manual/from-archives.md b/docs/manual/setup/installation/manual/from-archives.md deleted file mode 100644 index a9a43f66ba0c2..0000000000000 --- a/docs/manual/setup/installation/manual/from-archives.md +++ /dev/null @@ -1,311 +0,0 @@ ---- -title: Install Vector From Archives -sidebar_label: From Archives -description: Install Vector from pre-compiled archives ---- - -This page covers installing Vector from a pre-built archive. These archives -contain the `vector` binary as well as supporting configuration files. - - - -We recommend installing Vector through a supported [platform][docs.platforms] -or [package manager][docs.package_managers], if possible. These handle -permissions, directory creation, and other intricacies covered in the -[Next Steps](#next-steps) section. - - - -## Installation - - - - - - -1. ### Download & unpack the archive - - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/0.10.X/vector-aarch64-unknown-linux-musl.tar.gz | \ - tar xzf - -C vector --strip-components=2 - ``` - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-aarch64-unknown-linux-musl.tar.gz | \ - tar xzf - -C vector --strip-components=2 - ``` - - - - -2. ### Change into the `vector` directory - - ```bash - cd vector - ``` - -3. ### Move `vector` into your \$PATH - - ```bash - echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile - source $HOME/.profile - ``` - -4. ### Start Vector - - That's it! You can start vector with: - - ```bash - vector --config config/vector.toml - ``` - - - - - - - -1. ### Download & unpack the archive - - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/0.10.X/vector-x86_64-apple-darwin.tar.gz | \ - tar xzf - -C vector --strip-components=2 - ``` - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-x86_64-apple-darwin.tar.gz | \ - tar xzf - -C vector --strip-components=2 - ``` - - - - -2. ### Change into the `vector` directory - - ```bash - cd vector - ``` - -3. ### Move `vector` into your \$PATH - - ```bash - echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile - source $HOME/.profile - ``` - -4. ### Start Vector - - That's it! You can start vector with: - - ```bash - vector --config config/vector.toml - ``` - - - - - - - -1. ### Download Vector release archive (latest) - - - - - - ```bat - powershell Invoke-WebRequest https://packages.timber.io/vector/0.10.X/vector-x86_64-pc-windows-msvc.zip -OutFile vector-x86_64-pc-windows-msvc.zip - ``` - - - - - ```bat - powershell Invoke-WebRequest https://packages.timber.io/vector/nightly/latest/vector-x86_64-pc-windows-msvc.zip -OutFile vector-x86_64-pc-windows-msvc.zip - ``` - - - - -2. ### Extract files from the archive - - ```bat - powershell Expand-Archive vector-x86_64-pc-windows-msvc.zip . - ``` - -3. ### Navigate to the Vector directory - - ```bat - cd vector-x86_64-pc-windows-msvc - ``` - -4. ### Start Vector - - ```bat - .\bin\vector --config config\vector.toml - ``` - - - - - - - -1. ### Download & unpack the archive - - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/0.10.X/vector-x86_64-unknown-linux-musl.tar.gz | \ - tar xzf - -C vector --strip-components=2 - ``` - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://packages.timber.io/vector/nightly/latest/vector-x86_64-unknown-linux-musl.tar.gz | \ - tar xzf - -C vector --strip-components=2 - ``` - - - - -2. ### Change into the `vector` directory - - ```bash - cd vector - ``` - -3. ### Move `vector` into your \$PATH - - ```bash - echo "export PATH=\"$(pwd)/vector/bin:\$PATH\"" >> $HOME/.profile - source $HOME/.profile - ``` - -4. ### Start Vector - - That's it! You can start vector with: - - ```bash - vector --config config/vector.toml - ``` - - - - - -## Next Steps - -### Configuring - -The Vector configuration file is located at: - -```text -config/vector.toml -``` - -Example configurations are located in `config/vector/examples/*`. You can learn more about configuring -Vector in the [Configuration][docs.setup.configuration] section. - -### Data Directory - -We highly recommend creating a [data directory][docs.global-options#data_dir] -that Vector can use: - -```bash -mkdir /var/lib/vector -``` - - - -Make sure that this directory is writable by the `vector` process. - - - -Vector offers a global [`data_dir` option][docs.global-options#data_dir] that -you can use to specify the path of your directory. - -```toml title="vector.toml" -data_dir = "/var/lib/vector" # default -``` - -### Service Managers - -Vector archives ship with service files in case you need them: - -#### Init.d - -To install Vector into Init.d run: - -```bash -cp -av etc/init.d/vector /etc/init.d -``` - -#### Systemd - -To install Vector into Systemd run: - -```bash -cp -av etc/systemd/vector.service /etc/systemd/system -``` - -### Updating - -Simply follow the same [installation instructions above](#installation). - -[docs.setup.configuration]: /docs/setup/configuration/ -[docs.global-options#data_dir]: /docs/reference/global-options/#data_dir -[docs.package_managers]: /docs/setup/installation/package-managers/ -[docs.platforms]: /docs/setup/installation/platforms/ diff --git a/docs/manual/setup/installation/manual/from-source.md b/docs/manual/setup/installation/manual/from-source.md deleted file mode 100644 index 806703f7cedb3..0000000000000 --- a/docs/manual/setup/installation/manual/from-source.md +++ /dev/null @@ -1,565 +0,0 @@ ---- -title: Install Vector From Source -sidebar_label: From Source -description: Install Vector from the Vector source code ---- - -This page covers installing Vector from source using the native toolchain for -the host. - -Vector can also be compiled to a static binary for Linux for `x86_64`, `ARM64`, -and `ARMv7` architectures. See [compiling using Docker](#compiling-using-docker) -for details. - - - -We recommend installing Vector through a supported [platform][docs.platforms], -[package manager][docs.package_managers], or pre-built -[archive][docs.from_archives], if possible. These handle permissions, directory -creation, and other intricacies covered in the [Next Steps](#next-steps) -section. - - - -## Installation - - - - - -The following steps should be used to compile Vector directly on Linux based systems. - - - -1. ### Install Rust - - ```bash - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable - ``` - -2. ### Install compilation dependencies - - Install C and C++ compilers (GCC or Clang) and GNU `make` if they are not - pre-installed on your system. - -3. ### Download Vector's Source - - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://api.github.com/repos/timberio/vector/tarball/v0.10 | \ - tar xzf - -C vector --strip-components=1 - ``` - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://github.com/timberio/vector/archive/master.tar.gz | \ - tar xzf - -C vector --strip-components=1 - ``` - - - - -4. ### Change into the `vector` directory - - ```bash - cd vector - ``` - -5. ### Compile Vector - - ```bash - [FEATURES=",,..."] make build - ``` - - The `FEATURES` environment variable is optional. You can override the - default features with this variable. See [feature flags](#feature-flags) - for more info. - - When finished, the vector binary will be placed in - `target//release/vector`. For example, if you are building Vector - on your Mac, your target triple is `x86_64-apple-darwin`, and the Vector - binary will be located at `target/x86_64-apple-darwin/release/vector`. - -6. ### Start Vector - - Finally, start vector: - - ```bash - target//release/vector --config config/vector.toml - ``` - - - - - -The steps to compile Vector on Windows are different from the ones for other -operating systems. - - - -1. ### Install Rust - - Install Rust using [`rustup`][urls.rustup]. If you don't have VC++ build - tools, the installer would prompt you to install them. - -2. ### Install Perl - - Install [Perl for Windows][urls.perl_windows]. - -3. ### Add Perl to your `PATH` - - In a Rust/MSVC environment (for example, using - `x64 Native Tools Command Prompt`) add the binary directory of Perl - installed on the previous step to `PATH`. For example, for default - installation of Strawberry Perl it is - - ```bat - set PATH=%PATH%;C:\Strawberry\perl\bin - ``` - -4. ### Get Vector's source using `git` - - - - - - ```bat - git clone https://github.com/timberio/vector - git checkout v0.10.0 - cd vector - ``` - - - - - ```bat - git clone https://github.com/timberio/vector - cd vector - ``` - - - - -5. ### Build Vector in release mode - - ```bat - set RUSTFLAGS=-Ctarget-feature=+crt-static - cargo build --no-default-features --features default-msvc --release - ``` - -6. ### Start Vector - - After these steps a binary `vector.exe` in `target\release` would be - created. It can be started by running - - ```bat - .\target\release\vector --config config\vector.toml - ``` - - - - - -It is possible to build statically linked binaries of Vector for Linux using -Docker. - -In this case the dependencies listed in the previous section are not -needed, as all of them would be automatically pulled by Docker. - -Building steps: - - - -1. ### Download Vector's Source - - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://api.github.com/repos/timberio/vector/tarball/v0.10.X | \ - tar xzf - -C vector --strip-components=1 - ``` - - - - - ```bash - mkdir -p vector && \ - curl -sSfL --proto '=https' --tlsv1.2 https://github.com/timberio/vector/archive/master.tar.gz | \ - tar xzf - -C vector --strip-components=1 - ``` - - - - -2. ### Build Vector using Docker - - - - - - ```bash - PASS_FEATURES=default-cmake ./scripts/docker-run.sh builder-x86_64-unknown-linux-musl make build - ``` - - - - - - ```bash - PASS_FEATURES=default-cmake ./scripts/docker-run.sh builder-aarch64-unknown-linux-musl make build - ``` - - - - - - ```bash - PASS_FEATURES=default-cmake ./scripts/docker-run.sh builder-armv7-unknown-linux-musleabihf make build - ``` - - - - - The command above builds a Docker image with Rust toolchain for a Linux - target for the corresponding architecture using `musl` as the C library, - then starts a container from this image, and then builds inside the - Container. The target binary is located in - `target//release/vector` like in the previous case. - - - - - -## Next Steps - -### Configuring - -The Vector configuration file is located at: - -```text -config/vector.toml -``` - -Example configurations are located in `config/vector/examples/*`. You can learn more about configuring -Vector in the [Configuration][docs.setup.configuration] section. - -### Data Directory - -We highly recommend creating a [data directory][docs.global-options#data_dir] -that Vector can use: - -```bash -mkdir /var/lib/vector -``` - - - -Make sure that this directory is writable by the `vector` process. - - - -Vector offers a global [`data_dir` option][docs.global-options#data_dir] that -you can use to specify the path of your directory. - -```toml title="vector.toml" -data_dir = "/var/lib/vector" # default -``` - -### Service Managers - -Vector archives ship with service files in case you need them: - -#### Init.d - -To install Vector into Init.d run: - -```bash -cp -av distribution/init.d/vector /etc/init.d -``` - -#### Systemd - -To install Vector into Systemd run: - -```bash -cp -av distribution/systemd/vector.service /etc/systemd/system -``` - -### Updating - -Simply follow the same [installation instructions above](#installation). - -## How It Works - -### Feature Flags - -The following feature flags are supported via the `FEATURES` env var when -executing `make build`: - -```bash -[FEATURES=",,..."] make build -``` - -There are three meta-features which can be used when compiling for the -corresponding targets. If no features are specified, then the `default` one is -used. - -| Feature | Description | Enabled by default | -| :-------------- | :----------------------------------------------------------------------------------------------------------- | :------------------------------------- | -| `default` | Default set of features for `*-unknown-linux-gnu` and `*-apple-darwin` targets. | | -| `default-cmake` | Default set of features for `*-unknown-linux-*` targets which uses `cmake` and `perl` as build dependencies. | | -| `default-msvc` | Default set of features for `*-pc-windows-msvc` targets. Requires `cmake` and `perl` as build dependencies. | | - -Alternatively, for finer control over dependencies and operating system -features, it is possible to use specific features from the list below: - -| Feature | Description | Included in `default` feature | -| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------- | -| `unix` | Enables features that require `cfg(unix)` to be present on the platform, namely support for Unix domain sockets in [docker][docs.sources.docker] source and [jemalloc][urls.jemalloc] instead of the default memory allocator. | | -| `vendored` | Forces vendoring of [OpenSSL][urls.openssl] and [ZLib][urls.zlib] dependencies instead of using their versions installed in the system. Requires `perl` as a build dependency. | | -| `leveldb-plain` | Enables support for [disk buffers][docs.glossary#buffer] using vendored [LevelDB][urls.leveldb]. | | -| `leveldb-cmake` | The same as `leveldb-plain`, but is more portable. Requires `cmake` as a build dependency. Use it in case of compilation issues with `leveldb-plain`. | | -| `rdkafka-plain` | Enables vendored [librdkafka][urls.librdkafka] dependency, which is required for [`kafka` source][docs.sources.kafka] and [`kafka` sink][docs.sources.kafka]. | | -| `rdkafka-cmake` | The same as `rdkafka-plain`, but is more portable. Requires `cmake` as a build dependency. Use it in case of compilation issues with `rdkafka-plain`. | | - -In addition, it is possible to pick only a subset of Vector's components for -the build using feature flags. In order to do it, it instead of `default` -features one has to pass a comma-separated list of component features. - -
    Click to see all supported component features -

    - -| Name | Description | -| :--------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------- | -| `sources-apache_metrics` | Enables building of [`apache_metrics` source][docs.sources.apache_metrics]. | -| `sources-aws_kinesis_firehose` | Enables building of [`aws_kinesis_firehose` source][docs.sources.aws_kinesis_firehose]. | -| `sources-docker_logs` | Enables building of [`docker_logs` source][docs.sources.docker_logs]. Requires `unix` feature to be also enabled for support of Unix domain sockets. | -| `sources-file` | Enables building of [`file` source][docs.sources.file]. | -| `sources-generator` | Enables building of [`generator` source][docs.sources.generator]. | -| `sources-host_metrics` | Enables building of [`host_metrics` source][docs.sources.host_metrics]. | -| `sources-http` | Enables building of [`http` source][docs.sources.http]. | -| `sources-journald` | Enables building of [`journald` source][docs.sources.journald]. | -| `sources-kafka` | Enables building of [`kafka` source][docs.sources.kafka]. Requires `rdkafka-plain` or `rdkafka-cmake` feature to be also enabled. | -| `sources-kubernetes_logs` | Enables building of [`kubernetes_logs` source][docs.sources.kubernetes_logs]. | -| `sources-heroku_logs` | Enables building of [`heroku_logs` source][docs.sources.heroku_logs]. | -| `sources-prometheus` | Enables building of [`prometheus` source][docs.sources.prometheus]. | -| `sources-socket` | Enables building of [`socket` source][docs.sources.socket]. | -| `sources-splunk_hec` | Enables building of [`splunk_hec` source][docs.sources.splunk_hec]. | -| `sources-statsd` | Enables building of [`statsd` source][docs.sources.statsd]. | -| `sources-stdin` | Enables building of [`stdin` source][docs.sources.stdin]. | -| `sources-syslog` | Enables building of [`syslog` source][docs.sources.syslog]. | -| `sources-vector` | Enables building of [`vector` source][docs.sources.vector]. | -| `transforms-add_fields` | Enables building of [`add_fields` transform][docs.transforms.add_fields]. | -| `transforms-add_tags` | Enables building of [`add_tags` transform][docs.transforms.add_tags]. | -| `transforms-aggregate` | Enables building of [`aggregate` transform][docs.transforms.aggregate]. | -| `transforms-ansi_stripper` | Enables building of [`ansi_stripper` transform][docs.transforms.ansi_stripper]. | -| `transforms-aws_cloudwatch_logs_subscription_parser` | Enables building of [`aws_cloudwatch_logs_subscription_parser` transform][docs.transforms.aws_cloudwatch_logs_subscription_parser]. | -| `transforms-aws_ec2_metadata` | Enables building of [`aws_ec2_metadata` transform][docs.transforms.aws_ec2_metadata]. | -| `transforms-coercer` | Enables building of [`coercer` transform][docs.transforms.coercer]. | -| `transforms-concat` | Enables building of [`concat` transform][docs.transforms.concat]. | -| `transforms-dedupe` | Enables building of [`dedupe` transform][docs.transforms.dedupe]. | -| `transforms-filter` | Enables building of [`filter` transform][docs.transforms.filter]. | -| `transforms-geoip` | Enables building of [`geoip` transform][docs.transforms.geoip]. | -| `transforms-grok_parser` | Enables building of [`grok_parser` transform][docs.transforms.grok_parser]. | -| `transforms-json_parser` | Enables building of [`json_parser` transform][docs.transforms.json_parser]. | -| `transforms-log_to_metric` | Enables building of [`log_to_metric` transform][docs.transforms.log_to_metric]. | -| `transforms-logfmt_parser` | Enables building of [`logfmt_parser` transform][docs.transforms.logfmt_parser]. | -| `transforms-lua` | Enables building of [`lua` transform][docs.transforms.lua]. | -| `transforms-merge` | Enables building of [`merge` transform][docs.transforms.merge]. | -| `transforms-metric_to_log` | Enables building of [`metric_to_log` transform][docs.transforms.metric_to_log]. | -| `transforms-reduce` | Enables building of [`reduce` transform][docs.transforms.reduce]. | -| `transforms-regex_parser` | Enables building of [`regex_parser` transform][docs.transforms.regex_parser]. | -| `transforms-remap` | Enables building of [`remap` transform][docs.transforms.remap]. | -| `transforms-remove_fields` | Enables building of [`remove_fields` transform][docs.transforms.remove_fields]. | -| `transforms-remove_tags` | Enables building of [`remove_tags` transform][docs.transforms.remove_tags]. | -| `transforms-rename_fields` | Enables building of [`rename_fields` transform][docs.transforms.rename_fields]. | -| `transforms-sample` | Enables building of [`sample` transform][docs.transforms.sample]. | -| `transforms-split` | Enables building of [`split` transform][docs.transforms.split]. | -| `transforms-route` | Enables building of [`route` transform][docs.transforms.route]. | -| `transforms-tag_cardinality_limit` | Enables building of [`tag_cardinality_limit` transform][docs.transforms.tag_cardinality_limit]. | -| `transforms-tokenizer` | Enables building of [`tokenizer` transform][docs.transforms.tokenizer]. | -| `transforms-wasm` | Enables building of [`wasm` transform][docs.transforms.wasm]. | -| `sinks-aws_cloudwatch_logs` | Enables building of [`aws_cloudwatch_logs` sink][docs.sinks.aws_cloudwatch_logs]. | -| `sinks-aws_cloudwatch_metrics` | Enables building of [`aws_cloudwatch_metrics` sink][docs.sinks.aws_cloudwatch_metrics]. | -| `sinks-aws_kinesis_firehose` | Enables building of [`aws_kinesis_firehose` sink][docs.sinks.aws_kinesis_firehose]. | -| `sinks-aws_kinesis_streams` | Enables building of [`aws_kinesis_streams` sink][docs.sinks.aws_kinesis_streams]. | -| `sinks-aws_s3` | Enables building of [`aws_s3` sink][docs.sinks.aws_s3]. | -| `sinks-azure_monitor_logs` | Enables building of [`azure_monitor_logs` sink][docs.sinks.azure_monitor_logs]. | -| `sinks-blackhole` | Enables building of [`blackhole` sink][docs.sinks.blackhole]. | -| `sinks-clickhouse` | Enables building of [`clickhouse` sink][docs.sinks.clickhouse]. | -| `sinks-console` | Enables building of [`console` sink][docs.sinks.console]. | -| `sinks-datadog_logs` | Enables building of [`datadog_logs` sink][docs.sinks.datadog_logs]. | -| `sinks-datadog_metrics` | Enables building of [`datadog_metrics` sink][docs.sinks.datadog_metrics]. | -| `sinks-elasticsearch` | Enables building of [`elasticsearch` sink][docs.sinks.elasticsearch]. | -| `sinks-file` | Enables building of [`file` sink][docs.sinks.file]. | -| `sinks-gcp_cloud_storage` | Enables building of [`gcp_cloud_storage` sink][docs.sinks.gcp_cloud_storage]. | -| `sinks-gcp_pubsub` | Enables building of [`gcp_pubsub` sink][docs.sinks.gcp_pubsub]. | -| `sinks-gcp_stackdriver_logs` | Enables building of [`gcp_stackdriver_logs` sink][docs.sinks.gcp_stackdriver_logs]. | -| `sinks-honeycomb` | Enables building of [`honeycomb` sink][docs.sinks.honeycomb]. | -| `sinks-http` | Enables building of [`http` sink][docs.sinks.http]. | -| `sinks-humio_logs` | Enables building of [`humio_logs` sink][docs.sinks.humio_logs]. | -| `sinks-humio_metrics` | Enables building of [`humio_metrics` sink][docs.sinks.humio_metrics]. | -| `sinks-influxdb_logs` | Enables building of [`influxdb_logs` sink][docs.sinks.influxdb_logs]. | -| `sinks-influxdb_metrics` | Enables building of [`influxdb_metrics` sink][docs.sinks.influxdb_metrics]. | -| `sinks-kafka` | Enables building of [`kafka` sink][docs.sinks.kafka]. Requires `rdkafka-plain` or `rdkafka-cmake` feature to be also enabled. | -| `sinks-logdna` | Enables building of [`logdna` sink][docs.sinks.logdna]. | -| `sinks-loki` | Enables building of [`loki` sink][docs.sinks.loki]. | -| `sinks-new_relic_logs` | Enables building of [`new_relic_logs` sink][docs.sinks.new_relic_logs]. | -| `sinks-papertrail` | Enables building of [`papertrail` sink][docs.sinks.papertrail]. | -| `sinks-prometheus` | Enables building of [`prometheus` sink][docs.sinks.prometheus]. | -| `sinks-pulsar` | Enables building of [`pulsar` sink][docs.sinks.pulsar]. | -| `sinks-sematext_logs` | Enables building of [`sematext_logs` sink][docs.sinks.sematext_logs]. | -| `sinks-sematext_metrics` | Enables building of [`sematext_metrics` sink][docs.sinks.sematext_metrics]. | -| `sinks-socket` | Enables building of [`socket` sink][docs.sinks.socket]. | -| `sinks-splunk_hec` | Enables building of [`splunk_hec` sink][docs.sinks.splunk_hec]. | -| `sinks-statsd` | Enables building of [`statsd` sink][docs.sinks.statsd]. | -| `sinks-vector` | Enables building of [`vector` sink][docs.sinks.vector]. | - -

    -
    - -[docs.setup.configuration]: /docs/setup/configuration/ -[docs.from_archives]: /docs/setup/installation/manual/from-archives/ -[docs.global-options#data_dir]: /docs/reference/global-options/#data_dir -[docs.glossary#buffer]: /docs/meta/glossary/#buffer -[docs.package_managers]: /docs/setup/installation/package-managers/ -[docs.platforms]: /docs/setup/installation/platforms/ -[docs.sinks.aws_cloudwatch_logs]: /docs/reference/sinks/aws_cloudwatch_logs/ -[docs.sinks.aws_cloudwatch_metrics]: /docs/reference/sinks/aws_cloudwatch_metrics/ -[docs.sinks.aws_kinesis_firehose]: /docs/reference/sinks/aws_kinesis_firehose/ -[docs.sinks.aws_kinesis_streams]: /docs/reference/sinks/aws_kinesis_streams/ -[docs.sinks.aws_s3]: /docs/reference/sinks/aws_s3/ -[docs.sinks.azure_monitor_logs]: /docs/reference/sinks/azure_monitor_logs/ -[docs.sinks.blackhole]: /docs/reference/sinks/blackhole/ -[docs.sinks.clickhouse]: /docs/reference/sinks/clickhouse/ -[docs.sinks.console]: /docs/reference/sinks/console/ -[docs.sinks.datadog_logs]: /docs/reference/sinks/datadog_logs/ -[docs.sinks.datadog_metrics]: /docs/reference/sinks/datadog_metrics/ -[docs.sinks.elasticsearch]: /docs/reference/sinks/elasticsearch/ -[docs.sinks.file]: /docs/reference/sinks/file/ -[docs.sinks.gcp_cloud_storage]: /docs/reference/sinks/gcp_cloud_storage/ -[docs.sinks.gcp_pubsub]: /docs/reference/sinks/gcp_pubsub/ -[docs.sinks.gcp_stackdriver_logs]: /docs/reference/sinks/gcp_stackdriver_logs/ -[docs.sinks.honeycomb]: /docs/reference/sinks/honeycomb/ -[docs.sinks.http]: /docs/reference/sinks/http/ -[docs.sinks.humio_logs]: /docs/reference/sinks/humio_logs/ -[docs.sinks.humio_metrics]: /docs/reference/sinks/humio_metrics/ -[docs.sinks.influxdb_logs]: /docs/reference/sinks/influxdb_logs/ -[docs.sinks.influxdb_metrics]: /docs/reference/sinks/influxdb_metrics/ -[docs.sinks.kafka]: /docs/reference/sinks/kafka/ -[docs.sinks.logdna]: /docs/reference/sinks/logdna/ -[docs.sinks.loki]: /docs/reference/sinks/loki/ -[docs.sinks.new_relic_logs]: /docs/reference/sinks/new_relic_logs/ -[docs.sinks.papertrail]: /docs/reference/sinks/papertrail/ -[docs.sinks.prometheus]: /docs/reference/sinks/prometheus/ -[docs.sinks.pulsar]: /docs/reference/sinks/pulsar/ -[docs.sinks.sematext_logs]: /docs/reference/sinks/sematext_logs/ -[docs.sinks.sematext_metrics]: /docs/reference/sinks/sematext_metrics/ -[docs.sinks.socket]: /docs/reference/sinks/socket/ -[docs.sinks.splunk_hec]: /docs/reference/sinks/splunk_hec/ -[docs.sinks.statsd]: /docs/reference/sinks/statsd/ -[docs.sinks.vector]: /docs/reference/sinks/vector/ -[docs.sources.apache_metrics]: /docs/reference/sources/apache_metrics/ -[docs.sources.aws_kinesis_firehose]: /docs/reference/sources/aws_kinesis_firehose/ -[docs.sources.docker_logs]: /docs/reference/sources/docker_logs/ -[docs.sources.file]: /docs/reference/sources/file/ -[docs.sources.generator]: /docs/reference/sources/generator/ -[docs.sources.host_metrics]: /docs/reference/sources/host_metrics/ -[docs.sources.http]: /docs/reference/sources/http/ -[docs.sources.journald]: /docs/reference/sources/journald/ -[docs.sources.kafka]: /docs/reference/sources/kafka/ -[docs.sources.kubernetes_logs]: /docs/reference/sources/kubernetes_logs/ -[docs.sources.heroku_logs]: /docs/reference/sources/heroku_logs/ -[docs.sources.prometheus]: /docs/reference/sources/prometheus/ -[docs.sources.socket]: /docs/reference/sources/socket/ -[docs.sources.splunk_hec]: /docs/reference/sources/splunk_hec/ -[docs.sources.statsd]: /docs/reference/sources/statsd/ -[docs.sources.stdin]: /docs/reference/sources/stdin/ -[docs.sources.syslog]: /docs/reference/sources/syslog/ -[docs.sources.vector]: /docs/reference/sources/vector/ -[docs.transforms.add_fields]: /docs/reference/transforms/add_fields/ -[docs.transforms.add_tags]: /docs/reference/transforms/add_tags/ -[docs.transforms.aggregate]: /docs/reference/transforms/aggregate/ -[docs.transforms.ansi_stripper]: /docs/reference/transforms/ansi_stripper/ -[docs.transforms.aws_cloudwatch_logs_subscription_parser]: /docs/reference/transforms/aws_cloudwatch_logs_subscription_parser/ -[docs.transforms.aws_ec2_metadata]: /docs/reference/transforms/aws_ec2_metadata/ -[docs.transforms.coercer]: /docs/reference/transforms/coercer/ -[docs.transforms.concat]: /docs/reference/transforms/concat/ -[docs.transforms.dedupe]: /docs/reference/transforms/dedupe/ -[docs.transforms.filter]: /docs/reference/transforms/filter/ -[docs.transforms.geoip]: /docs/reference/transforms/geoip/ -[docs.transforms.grok_parser]: /docs/reference/transforms/grok_parser/ -[docs.transforms.json_parser]: /docs/reference/transforms/json_parser/ -[docs.transforms.log_to_metric]: /docs/reference/transforms/log_to_metric/ -[docs.transforms.logfmt_parser]: /docs/reference/transforms/logfmt_parser/ -[docs.transforms.lua]: /docs/reference/transforms/lua/ -[docs.transforms.merge]: /docs/reference/transforms/merge/ -[docs.transforms.metric_to_log]: /docs/reference/transforms/metric_to_log/ -[docs.transforms.reduce]: /docs/reference/transforms/reduce/ -[docs.transforms.regex_parser]: /docs/reference/transforms/regex_parser/ -[docs.transforms.remap]: /docs/reference/transforms/remap/ -[docs.transforms.remove_fields]: /docs/reference/transforms/remove_fields/ -[docs.transforms.remove_tags]: /docs/reference/transforms/remove_tags/ -[docs.transforms.rename_fields]: /docs/reference/transforms/rename_fields/ -[docs.transforms.sample]: /docs/reference/transforms/sample/ -[docs.transforms.split]: /docs/reference/transforms/split/ -[docs.transforms.route]: /docs/reference/transforms/route/ -[docs.transforms.tag_cardinality_limit]: /docs/reference/transforms/tag_cardinality_limit/ -[docs.transforms.tokenizer]: /docs/reference/transforms/tokenizer/ -[docs.transforms.wasm]: /docs/reference/transforms/wasm/ -[urls.jemalloc]: https://github.com/jemalloc/jemalloc -[urls.leveldb]: https://github.com/google/leveldb -[urls.librdkafka]: https://github.com/edenhill/librdkafka -[urls.openssl]: https://www.openssl.org/ -[urls.perl_windows]: https://www.perl.org/get.html#win32 -[urls.rustup]: https://rustup.rs -[urls.zlib]: https://www.zlib.net diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000000000..2d59fd0717525 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,42 @@ +{ + "private": true, + "scripts": { + "algolia-config": "algolia setsettings -a $ALGOLIA_APP_ID -k $ALGOLIA_ADMIN_KEY -n $ALGOLIA_INDEX_NAME -s algolia.json", + "algolia-index": "atomic-algolia" + }, + "dependencies": { + "@algolia/cli": "^4.0.8", + "@babel/cli": "^7.14.5", + "@babel/core": "^7.14.6", + "@babel/preset-env": "^7.14.5", + "@babel/preset-typescript": "^7.14.5", + "@emotion/babel-preset-css-prop": "^11.2.0", + "@fullhuman/postcss-purgecss": "^4.0.3", + "@ryangjchandler/spruce": "^2.6.3", + "@tailwindcss/forms": "^0.3.2", + "@tailwindcss/typography": "^0.4.1", + "@types/topojson-specification": "^1.0.1", + "algoliasearch": "^4.10.2", + "alpinejs": "^2.8.2", + "atomic-algolia": "^0.3.19", + "autoprefixer": "^10.2.5", + "babel-preset-next": "^1.4.0", + "classnames": "^2.3.1", + "core-js": "^3.14.0", + "d3-geo": "^3.0.1", + "instantsearch.js": "^4.24.1", + "postcss-cli": "^8.3.1", + "postcss-import": "^14.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-spring": "^9.2.3", + "react-use": "^17.2.4", + "regenerator-runtime": "^0.13.7", + "tailwindcss": "^2.1.4", + "tocbot": "^4.12.2", + "topojson-client": "^3.1.0" + }, + "browserslist": [ + "since 2017-06" + ] +} diff --git a/docs/postcss.config.js b/docs/postcss.config.js new file mode 100644 index 0000000000000..23a935b468af2 --- /dev/null +++ b/docs/postcss.config.js @@ -0,0 +1,37 @@ +const postcssImport = require('postcss-import'); +const tailwindCss = require('tailwindcss'); +const autoprefixer = require('autoprefixer')({ + browsers: ['last 2 versions'] +}); + +// These are classes for things that are applied by JS, and thus missed by Hugo. +// See assets/js/*.js for places where this happens. +const safeClasses = { + standard: [ + "search-input", + "search-results-list", + "search-result", + "code-sample-filename", + /^ais-/, // All Algolia-specific classes + "type" + ] +}; + +const purgecss = require('@fullhuman/postcss-purgecss')({ + content: ['./hugo_stats.json'], + safelist: safeClasses, + defaultExtractor: (content) => { + const broadMatches = content.match(/[^<>"'`\s]*[^<>"'`\s:]/g) || []; + const innerMatches = content.match(/[^<>"'`\s.()]*[^<>"'`\s.():]/g) || []; + return broadMatches.concat(innerMatches); + } +}) + +module.exports = { + plugins: [ + postcssImport, + tailwindCss, + autoprefixer, + ...(process.env.HUGO_ENVIRONMENT === 'production' ? [purgecss] : []) + ] +} diff --git a/docs/reference/installation/_interfaces/role_implementations/file_agent.cue b/docs/reference/installation/_interfaces/role_implementations/file_agent.cue deleted file mode 100644 index d7fb2e68ed019..0000000000000 --- a/docs/reference/installation/_interfaces/role_implementations/file_agent.cue +++ /dev/null @@ -1,27 +0,0 @@ -package metadata - -installation: _interfaces: [string]: role_implementations: _file_agent: { - variables: config: { - sources: { - logs: { - type: components.sources.file.type - include: [string, ...string] | *["/var/log/**/*.log"] - } - host_metrics: type: components.sources.host_metrics.type - internal_metrics: type: components.sources.internal_metrics.type - } - } - description: #""" - The agent role is designed to collect all data on - a single host. Vector runs as a background process - and interfaces with a host-level APIs for data - collection. By default, Vector will collect logs - via Vector's [`file` source](\#(urls.vector_journald_source)) and - metrics via the [`host_metrics` source](\#(urls.vector_host_metrics_source)), - but it is recommended to adjust your pipeline as - necessary using Vector's [sources](\#(urls.vector_sources)), - [transforms](\#(urls.vector_transforms)), and - [sinks](\#(urls.vector_sinks)). - """# - title: "Agent" -} diff --git a/docs/reference/installation/_interfaces/role_implementations/file_sidecar.cue b/docs/reference/installation/_interfaces/role_implementations/file_sidecar.cue deleted file mode 100644 index 5285b2308b058..0000000000000 --- a/docs/reference/installation/_interfaces/role_implementations/file_sidecar.cue +++ /dev/null @@ -1,28 +0,0 @@ -package metadata - -installation: _interfaces: [string]: role_implementations: _file_sidecar: { - variables: config: { - sources: { - logs: { - type: components.sources.file.type - include: [string, ...string] | *["/var/log/my-app*.log"] - } - host_metrics: type: components.sources.host_metrics.type - internal_metrics: type: components.sources.internal_metrics.type - } - } - description: #""" - The sidecar role is designed to collect data from - a single process on the same host. By default, we - recommend using the [`file` source](\#(urls.vector_file_source)) - to tail the logs for that individual process, but - you could use the [`stdin` source](\#(urls.vector_stdin_source)), - [`socket` source](\#(urls.vector_socket_source)), or - [`http` source](\#(urls.vector_http_source)). We recommend - adjusting your pipeline as necessary using Vector's - [sources](\#(urls.vector_sources)), - [transforms](\#(urls.vector_transforms)), and - [sinks](\#(urls.vector_sinks)). - """# - title: "Sidecar" -} diff --git a/docs/reference/installation/_interfaces/role_implementations/journald_agent.cue b/docs/reference/installation/_interfaces/role_implementations/journald_agent.cue deleted file mode 100644 index a17493a348b6f..0000000000000 --- a/docs/reference/installation/_interfaces/role_implementations/journald_agent.cue +++ /dev/null @@ -1,25 +0,0 @@ -package metadata - -installation: _interfaces: [string]: role_implementations: _journald_agent: { - variables: config: { - sources: { - logs: type: components.sources.journald.type - host_metrics: type: components.sources.host_metrics.type - internal_metrics: type: components.sources.internal_metrics.type - } - } - description: #""" - The agent role is designed to collect all data on - a single host. Vector runs as a background process - and interfaces with a host-level APIs for data - collection. By default, Vector will collect logs - from [Journald](\#(urls.journald)) via Vector's - [`journald` source](\#(urls.vector_journald_source)) and - metrics via the [`host_metrics` source](\#(urls.vector_host_metrics_source)), - but it is recommended to adjust your pipeline as - necessary using Vector's [sources](\#(urls.vector_sources)), - [transforms](\#(urls.vector_transforms)), and - [sinks](\#(urls.vector_sinks)). - """# - title: "Agent" -} diff --git a/docs/reference/installation/_interfaces/role_implementations/vector_aggregator.cue b/docs/reference/installation/_interfaces/role_implementations/vector_aggregator.cue deleted file mode 100644 index e3c5623601397..0000000000000 --- a/docs/reference/installation/_interfaces/role_implementations/vector_aggregator.cue +++ /dev/null @@ -1,23 +0,0 @@ -package metadata - -installation: _interfaces: [string]: role_implementations: _vector_aggregator: { - variables: config: { - sources: { - vector: type: components.sources.vector.type - internal_metrics: type: components.sources.internal_metrics.type - } - } - description: #""" - The aggregator role is designed to receive and - process data from multiple upstream agents. - Typically these are other Vector agents, but it - could be anything, including non-Vector agents. - By default, we recommend the [`vector` source](\#(urls.vector_source)) - since it supports all data types, but it is - recommended to adjust your pipeline as necessary - using Vector's [sources](\#(urls.vector_sources)), - [transforms](\#(urls.vector_transforms)), and - [sinks](\#(urls.vector_sinks)). - """# - title: "Aggregator" -} diff --git a/docs/reference/installation/downloads.cue b/docs/reference/installation/downloads.cue deleted file mode 100644 index d15ebda3e4644..0000000000000 --- a/docs/reference/installation/downloads.cue +++ /dev/null @@ -1,23 +0,0 @@ -package metadata - -installation: { - #Download: { - available_on_latest: bool - available_on_nightly: bool - arch: #Arch - file_name: string - file_type: string - library: string | null - name: string - os: #OperatingSystemFamily - package_manager?: string - title: "\(os) (\(arch))" - type: "archive" | "package" - } - - #Downloads: [Name=string]: #Download & { - name: Name - } - - downloads: #Downloads -} diff --git a/docs/reference/installation/downloads/aarch64-rpm.cue b/docs/reference/installation/downloads/aarch64-rpm.cue deleted file mode 100644 index 1d8e92fe4bbe7..0000000000000 --- a/docs/reference/installation/downloads/aarch64-rpm.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "aarch64-rpm": { - available_on_latest: true - available_on_nightly: true - arch: "ARM64" - file_name: "vector-{version}-1.aarch64.rpm" - file_type: "rpm" - library: "gnu" - os: "Linux" - package_manager: installation.package_managers.rpm.name - type: "package" -} diff --git a/docs/reference/installation/downloads/aarch64-unknown-linux-gnu-tar-gz.cue b/docs/reference/installation/downloads/aarch64-unknown-linux-gnu-tar-gz.cue deleted file mode 100644 index 03c36297c4082..0000000000000 --- a/docs/reference/installation/downloads/aarch64-unknown-linux-gnu-tar-gz.cue +++ /dev/null @@ -1,12 +0,0 @@ -package metadata - -installation: downloads: "aarch64-unknown-linux-gnu-tar-gz": { - available_on_latest: true - available_on_nightly: true - arch: "ARM64" - file_name: "vector-{version}-aarch64-unknown-linux-gnu.tar.gz" - file_type: "tar.gz" - library: "gnu" - os: "Linux" - type: "archive" -} diff --git a/docs/reference/installation/downloads/amd64-deb.cue b/docs/reference/installation/downloads/amd64-deb.cue deleted file mode 100644 index a9c82c2930409..0000000000000 --- a/docs/reference/installation/downloads/amd64-deb.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "amd64-deb": { - available_on_latest: true - available_on_nightly: true - arch: "x86_64" - file_name: "vector-{version}-amd64.deb" - file_type: "deb" - library: "gnu" - os: "Linux" - package_manager: installation.package_managers.dpkg.name - type: "package" -} diff --git a/docs/reference/installation/downloads/arm64-deb.cue b/docs/reference/installation/downloads/arm64-deb.cue deleted file mode 100644 index ab3da3d428ccd..0000000000000 --- a/docs/reference/installation/downloads/arm64-deb.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "arm64-deb": { - available_on_latest: true - available_on_nightly: true - arch: "ARM64" - file_name: "vector-{version}-arm64.deb" - file_type: "deb" - library: "gnu" - os: "Linux" - package_manager: installation.package_managers.dpkg.name - type: "package" -} diff --git a/docs/reference/installation/downloads/armhf-deb.cue b/docs/reference/installation/downloads/armhf-deb.cue deleted file mode 100644 index 3752a92b68a4e..0000000000000 --- a/docs/reference/installation/downloads/armhf-deb.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "armhf-deb": { - available_on_latest: true - available_on_nightly: true - arch: "ARMv7" - file_name: "vector-{version}-armhf.deb" - file_type: "deb" - library: "gnu" - os: "Linux" - package_manager: installation.package_managers.dpkg.name - type: "package" -} diff --git a/docs/reference/installation/downloads/armv7-rpm.cue b/docs/reference/installation/downloads/armv7-rpm.cue deleted file mode 100644 index 8c7ce809192bf..0000000000000 --- a/docs/reference/installation/downloads/armv7-rpm.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "armv7-rpm": { - available_on_latest: true - available_on_nightly: true - arch: "ARMv7" - file_name: "vector-{version}-1.armv7.rpm" - file_type: "rpm" - library: "gnu" - os: "Linux" - package_manager: installation.package_managers.rpm.name - type: "package" -} diff --git a/docs/reference/installation/downloads/armv7-unknown-linux-gnueabihf-tar-gz.cue b/docs/reference/installation/downloads/armv7-unknown-linux-gnueabihf-tar-gz.cue deleted file mode 100644 index 834b49c909773..0000000000000 --- a/docs/reference/installation/downloads/armv7-unknown-linux-gnueabihf-tar-gz.cue +++ /dev/null @@ -1,12 +0,0 @@ -package metadata - -installation: downloads: "armv7-unknown-linux-gnueabihf-tar-gz": { - available_on_latest: true - available_on_nightly: true - arch: "ARMv7" - file_name: "vector-{version}-armv7-unknown-linux-gnueabihf.tar.gz" - file_type: "tar.gz" - library: "gnu" - os: "Linux" - type: "archive" -} diff --git a/docs/reference/installation/downloads/x64-msi.cue b/docs/reference/installation/downloads/x64-msi.cue deleted file mode 100644 index f5326e452f6ad..0000000000000 --- a/docs/reference/installation/downloads/x64-msi.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "x64-msi": { - available_on_latest: true - available_on_nightly: true - arch: "x86_64" - file_name: "vector-{version}-x64.msi" - file_type: "msi" - library: null - os: "Windows" - package_manager: installation.package_managers.msi.name - type: "package" -} diff --git a/docs/reference/installation/downloads/x86_64-apple-darwin-tar-gz.cue b/docs/reference/installation/downloads/x86_64-apple-darwin-tar-gz.cue deleted file mode 100644 index 3d3087afd0d44..0000000000000 --- a/docs/reference/installation/downloads/x86_64-apple-darwin-tar-gz.cue +++ /dev/null @@ -1,12 +0,0 @@ -package metadata - -installation: downloads: "x86_64-apple-darwin-tar-gz": { - available_on_latest: true - available_on_nightly: true - arch: "x86_64" - file_name: "vector-{version}-x86_64-apple-darwin.tar.gz" - file_type: "tar.gz" - library: null - os: "macOS" - type: "archive" -} diff --git a/docs/reference/installation/downloads/x86_64-pc-windows-msvc-zip.cue b/docs/reference/installation/downloads/x86_64-pc-windows-msvc-zip.cue deleted file mode 100644 index 789c9e44ad389..0000000000000 --- a/docs/reference/installation/downloads/x86_64-pc-windows-msvc-zip.cue +++ /dev/null @@ -1,12 +0,0 @@ -package metadata - -installation: downloads: "x86_64-pc-windows-msvc-zip": { - available_on_latest: true - available_on_nightly: true - arch: "x86_64" - file_name: "vector-{version}-x86_64-pc-windows-msvc.zip" - file_type: "zip" - library: null - os: "Windows" - type: "archive" -} diff --git a/docs/reference/installation/downloads/x86_64-rpm.cue b/docs/reference/installation/downloads/x86_64-rpm.cue deleted file mode 100644 index 116867e32cc42..0000000000000 --- a/docs/reference/installation/downloads/x86_64-rpm.cue +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -installation: downloads: "x86_64-rpm": { - available_on_latest: true - available_on_nightly: true - arch: "x86_64" - file_name: "vector-{version}-1.x86_64.rpm" - file_type: "rpm" - library: "gnu" - os: "Linux" - package_manager: installation.package_managers.rpm.name - type: "package" -} diff --git a/docs/reference/installation/downloads/x86_64-unknown-linux-gnu-tar-gz.cue b/docs/reference/installation/downloads/x86_64-unknown-linux-gnu-tar-gz.cue deleted file mode 100644 index 4cdfd0947a0e3..0000000000000 --- a/docs/reference/installation/downloads/x86_64-unknown-linux-gnu-tar-gz.cue +++ /dev/null @@ -1,12 +0,0 @@ -package metadata - -installation: downloads: "x86_64-unknown-linux-gnu-tar-gz": { - available_on_latest: true - available_on_nightly: true - arch: "x86_64" - file_name: "vector-{version}-x86_64-unknown-linux-gnu.tar.gz" - file_type: "tar.gz" - library: "gnu" - os: "Linux" - type: "archive" -} diff --git a/docs/reference/installation/package_managers/apt.cue b/docs/reference/installation/package_managers/apt.cue deleted file mode 100644 index eff23228370ab..0000000000000 --- a/docs/reference/installation/package_managers/apt.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: apt: { - title: "APT" - description: installation._interfaces.apt.description -} diff --git a/docs/reference/installation/package_managers/dpkg.cue b/docs/reference/installation/package_managers/dpkg.cue deleted file mode 100644 index 1960e8f446d67..0000000000000 --- a/docs/reference/installation/package_managers/dpkg.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: dpkg: { - title: "DPKG" - description: installation._interfaces.dpkg.description -} diff --git a/docs/reference/installation/package_managers/helm.cue b/docs/reference/installation/package_managers/helm.cue deleted file mode 100644 index 2474548b7b309..0000000000000 --- a/docs/reference/installation/package_managers/helm.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: helm: { - title: "Helm" - description: installation._interfaces."helm3".description -} diff --git a/docs/reference/installation/package_managers/homebrew.cue b/docs/reference/installation/package_managers/homebrew.cue deleted file mode 100644 index d47b1f958aa33..0000000000000 --- a/docs/reference/installation/package_managers/homebrew.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: homebrew: { - title: "Homebrew" - description: installation._interfaces.homebrew.description -} diff --git a/docs/reference/installation/package_managers/msi.cue b/docs/reference/installation/package_managers/msi.cue deleted file mode 100644 index c4bc0ac3cb78f..0000000000000 --- a/docs/reference/installation/package_managers/msi.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: msi: { - title: "MSI" - description: installation._interfaces.msi.description -} diff --git a/docs/reference/installation/package_managers/nix.cue b/docs/reference/installation/package_managers/nix.cue deleted file mode 100644 index 622ce3feb2365..0000000000000 --- a/docs/reference/installation/package_managers/nix.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: nix: { - title: "Nix" - description: installation._interfaces.nix.description -} diff --git a/docs/reference/installation/package_managers/rpm.cue b/docs/reference/installation/package_managers/rpm.cue deleted file mode 100644 index 83ec6c627d27f..0000000000000 --- a/docs/reference/installation/package_managers/rpm.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: rpm: { - title: "RPM" - description: installation._interfaces.rpm.description -} diff --git a/docs/reference/installation/package_managers/yum.cue b/docs/reference/installation/package_managers/yum.cue deleted file mode 100644 index e203252d9b8d4..0000000000000 --- a/docs/reference/installation/package_managers/yum.cue +++ /dev/null @@ -1,6 +0,0 @@ -package metadata - -installation: package_managers: yum: { - title: "YUM" - description: installation._interfaces.yum.description -} diff --git a/docs/reference/installation/platforms.cue b/docs/reference/installation/platforms.cue deleted file mode 100644 index 85d5ff85eac3a..0000000000000 --- a/docs/reference/installation/platforms.cue +++ /dev/null @@ -1,17 +0,0 @@ -package metadata - -installation: { - #Platform: { - description: string - how_it_works: #HowItWorks - minimum_supported_version: string | null - name: string - title: string - } - - #Platforms: [Name=string]: #Platform & { - name: Name - } - - platforms: #Platforms -} diff --git a/docs/reference/installation/platforms/docker.cue b/docs/reference/installation/platforms/docker.cue deleted file mode 100644 index b36dfdf6cc051..0000000000000 --- a/docs/reference/installation/platforms/docker.cue +++ /dev/null @@ -1,15 +0,0 @@ -package metadata - -installation: platforms: docker: { - title: "Docker" - description: """ - [Docker](\(urls.docker)) is an open platform for developing, shipping, and running - applications and services. Docker enables you to separate your services from - your infrastructure so you can ship quickly. With Docker, you can manage your - infrastructure in the same ways you manage your services. By taking advantage - of Docker's methodologies for shipping, testing, and deploying code quickly, - you can significantly reduce the delay between writing code and running it in - production. - """ - minimum_supported_version: null -} diff --git a/docs/reference/installation/platforms/kubernetes.cue b/docs/reference/installation/platforms/kubernetes.cue deleted file mode 100644 index 3f1d8d1769f3c..0000000000000 --- a/docs/reference/installation/platforms/kubernetes.cue +++ /dev/null @@ -1,29 +0,0 @@ -package metadata - -installation: platforms: kubernetes: { - title: "Kubernetes" - description: """ - [Kubernetes](\(urls.kubernetes)), also known as k8s, is an - open-source container-orchestration system for automating - application deployment, scaling, and management. - """ - minimum_supported_version: "1.15" - - how_it_works: { - components.sources.kubernetes_logs.how_it_works - - metrics: { - title: "Metrics" - body: """ - Our Helm chart deployments provide quality of life around setup and maintenance of - metrics pipelines in Kubernetes. Each of the Helm charts provide an `internal_metrics` - source and `prometheus` sink out of the box. Agent deployments also expose `host_metrics` - via the same `prometheus` sink. - - Charts come with options to enable Prometheus integration via annotations or Prometheus Operator - integration via PodMonitor. Thus, the Prometheus node_exporter agent is not required when the `host_metrics` source is - enabled. - """ - } - } -} diff --git a/docs/reference/process.cue b/docs/reference/process.cue deleted file mode 100644 index 81d9d3e627db9..0000000000000 --- a/docs/reference/process.cue +++ /dev/null @@ -1,45 +0,0 @@ -package metadata - -process: { - #ExitCode: { - code: int - description: string - } - - #ExitCodes: [Name=string]: #ExitCode - - #Signal: { - description: string - name: string - } - - #Signals: [Name=string]: #Signal & {name: Name} - - exit_codes: #ExitCodes - signals: #Signals - - exit_codes: { - "0": { - code: 0 - description: "Exited successfully." - } - "1": { - code: 1 - description: "Exited with a generic error." - } - "78": { - code: 78 - description: "Configuration is invalid." - } - } - - signals: { - SIGHUP: { - description: "Reloads configuration on the fly." - } - - SIGTERM: { - description: "Initiates graceful shutdown process." - } - } -} diff --git a/docs/reference/remap/concepts/event.cue b/docs/reference/remap/concepts/event.cue deleted file mode 100644 index 9b5360316ac04..0000000000000 --- a/docs/reference/remap/concepts/event.cue +++ /dev/null @@ -1,46 +0,0 @@ -remap: concepts: event: { - title: "Event" - description: """ - VRL programs operate on observability [events](\(urls.vector_data_model)). This VRL program, for example, adds - a field to a log event: - - ```vrl - .new_field = "new value" - ``` - - The event, `.`, at hand is the entire context of the VRL program. - - The event can be set to a value other than an object; for example (`. = 5`). If it is set to an array, each - element of that array will be emitted as its own event from the `remap` function. For any elements that are not - an object, or if the top-level `.` is set to a scalar value, that value will be set as the `message` key on the - emitted object. - - For example: - - ```vrl - . = ["hello", 1, true, { "foo": "bar" }] - ``` - - Will result in the following four events being emitted: - - ```json - { "message": "hello" } - { "message": 1 } - { "message": true } - { "foo": "bar" } - ``` - """ - - characteristics: { - path: { - title: "Paths" - description: """ - [Path expressions](\(urls.vrl_path_expressions)) enable you to access values inside the event: - - ```vrl - .kubernetes.pod_id - ``` - """ - } - } -} diff --git a/docs/reference/remap/concepts/expression.cue b/docs/reference/remap/concepts/expression.cue deleted file mode 100644 index b18f17ab60e6a..0000000000000 --- a/docs/reference/remap/concepts/expression.cue +++ /dev/null @@ -1,7 +0,0 @@ -remap: concepts: expression: { - title: "Event" - description: """ - VRL is an expression-oriented language. A VRL program consists entirely of [expressions](urls.vrl_expressions), - with every expression returning a value. - """ -} diff --git a/docs/reference/remap/concepts/function.cue b/docs/reference/remap/concepts/function.cue deleted file mode 100644 index cde153f03be7e..0000000000000 --- a/docs/reference/remap/concepts/function.cue +++ /dev/null @@ -1,21 +0,0 @@ -remap: concepts: function: { - title: "Function" - description: """ - Like most languages, VRL includes [functions](\(urls.vrl_functions)) that represent named procedures designed to - accomplish specific tasks. Functions are the highest-level construct of reusable code in VRL, which, for the - sake of simplicity, doesn't include modules, classes, or other complex constructs for organizing functions. - """ - - characteristics: { - fallibility: { - title: "Fallibility" - description: """ - Some VRL functions are *fallible*, meaning that they can error. Any potential errors thrown by fallible - functions must be handled, a requirement enforced at compile time. - - This feature of VRL programs, which we call [fail safety](\(urls.vrl_fail_safety)), is a defining - characteristic of VRL and a primary source of its safety guarantees. - """ - } - } -} diff --git a/docs/reference/remap/concepts/program.cue b/docs/reference/remap/concepts/program.cue deleted file mode 100644 index fb382e89fb64f..0000000000000 --- a/docs/reference/remap/concepts/program.cue +++ /dev/null @@ -1,7 +0,0 @@ -remap: concepts: program: { - title: "Program" - description: """ - A VRL program is the highest-level unit of computation. A program is the end result of combining an arbitrary - number of [expressions](#\(concepts.expression.anchor)) operating on a single observability event. - """ -} diff --git a/docs/reference/services/gcp_cloud_monitoring.cue b/docs/reference/services/gcp_cloud_monitoring.cue deleted file mode 100644 index 872ce60df8e1c..0000000000000 --- a/docs/reference/services/gcp_cloud_monitoring.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: gcp_cloud_monitoring: { - name: "GCP Cloud (formerly Stackdriver) metrics" - thing: "a \(name) account" - url: urls.gcp_stackdriver_metrics - versions: null - - description: "[Stackdriver][urls.gcp_stackdriver] is Google Cloud's embedded observability suite designed to monitor, troubleshoot, and improve cloud infrastructure, software and application performance. Stackdriver enables you to efficiently build and run workloads, keeping applications available and performing well." -} diff --git a/docs/reference/services/gcp_cloud_storage.cue b/docs/reference/services/gcp_cloud_storage.cue deleted file mode 100644 index 46760dfbde42b..0000000000000 --- a/docs/reference/services/gcp_cloud_storage.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: gcp_cloud_storage: { - name: "GCP Cloud Storage" - thing: "a \(name) bucket" - url: urls.gcp_cloud_storage - versions: null - - description: "[Google Cloud Storage][urls.gcp_cloud_storage] is a RESTful online file storage web service for storing and accessing data on Google Cloud Platform infrastructure. The service combines the performance and scalability of Google's cloud with advanced security and sharing capabilities. This makes it a prime candidate for log data." -} diff --git a/docs/reference/services/gcp_operations_logs.cue b/docs/reference/services/gcp_operations_logs.cue deleted file mode 100644 index d8d0f003b2e8b..0000000000000 --- a/docs/reference/services/gcp_operations_logs.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: gcp_operations_logs: { - name: "GCP Operations (formerly Stackdriver) logs" - thing: "a \(name) account" - url: urls.gcp_stackdriver_logging - versions: null - - description: "[Stackdriver][urls.gcp_stackdriver] is Google Cloud's embedded observability suite designed to monitor, troubleshoot, and improve cloud infrastructure, software and application performance. Stackdriver enables you to efficiently build and run workloads, keeping applications available and performing well." -} diff --git a/docs/reference/services/gcp_pubsub.cue b/docs/reference/services/gcp_pubsub.cue deleted file mode 100644 index 4e2f227fd6b4a..0000000000000 --- a/docs/reference/services/gcp_pubsub.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: gcp_pubsub: { - name: "GCP PubSub" - thing: "a \(name) pipeline" - url: urls.gcp_pubsub - versions: null - - description: "[GCP Pub/Sub][urls.gcp_pubsub] is a fully-managed real-time messaging service that allows you to send and receive messages between independent applications on the Google Cloud Platform." -} diff --git a/docs/reference/services/humio.cue b/docs/reference/services/humio.cue deleted file mode 100644 index 6550b0dbe342c..0000000000000 --- a/docs/reference/services/humio.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: humio: { - name: "Humio" - thing: "a \(name) database" - url: urls.humio - versions: null - - description: "[Humio][urls.humio] is a time-series logging and aggregation platform for unrestricted, comprehensive event analysis, On-Premises or in the Cloud. With 1TB/day of raw log ingest/node, in-memory stream processing, and live, shareable dashboards and alerts, you can instantly and in real-time explore, monitor, and visualize any system’s data. Metrics are converted to log events via the metric_to_log transform." -} diff --git a/docs/reference/services/loki.cue b/docs/reference/services/loki.cue deleted file mode 100644 index c1ee8a29b883f..0000000000000 --- a/docs/reference/services/loki.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: loki: { - name: "Loki" - thing: "a \(name) database" - url: urls.loki - versions: null - - description: "[Loki][urls.loki] is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by [Prometheus][urls.prometheus]. It is designed to be very cost effective and easy to operate. It does not index the contents of the logs, but rather a set of labels for each log stream." -} diff --git a/docs/reference/services/mongodb.cue b/docs/reference/services/mongodb.cue deleted file mode 100644 index 2818f82c8773d..0000000000000 --- a/docs/reference/services/mongodb.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: mongodb: { - name: "MongoDB" - thing: "an \(name) instance" - url: urls.mongodb - versions: null - - description: "[MongoDB][urls.mongodb] is a general purpose, document-based, distributed database built for modern application developers and for the cloud era." -} diff --git a/docs/reference/services/new_relic_logs.cue b/docs/reference/services/new_relic_logs.cue deleted file mode 100644 index 7725e4a9b8c72..0000000000000 --- a/docs/reference/services/new_relic_logs.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: new_relic_logs: { - name: "New Relic logs" - thing: "a \(name) account" - url: urls.new_relic - versions: null - - description: "[New Relic][urls.new_relic] is a San Francisco, California-based technology company which develops cloud-based software to help website and application owners track the performances of their services." -} diff --git a/docs/reference/services/nginx.cue b/docs/reference/services/nginx.cue deleted file mode 100644 index faa2a716adc51..0000000000000 --- a/docs/reference/services/nginx.cue +++ /dev/null @@ -1,10 +0,0 @@ -package metadata - -services: nginx: { - name: "Nginx" - thing: "an \(name) server" - url: urls.nginx - versions: null - - description: "[Nginx][urls.nginx] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server." -} diff --git a/docs/scripts/cue.sh b/docs/scripts/cue.sh new file mode 100755 index 0000000000000..eba94d29994d1 --- /dev/null +++ b/docs/scripts/cue.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +set -euo pipefail + +# cue.sh +# +# SUMMARY +# +# CUE utilities. + +ROOT=$(git rev-parse --show-toplevel) +CUE_SOURCES="${ROOT}/docs/cue" +JSON_OUT="${ROOT}/docs/data/docs.json" +CHECK_DOCS_SCRIPT="${ROOT}/scripts/check-docs.sh" + +list-docs-files() { + find "${CUE_SOURCES}" -name '*.cue' +} + +cmd_check() { + ${CHECK_DOCS_SCRIPT} +} + +cmd_format() { + list-docs-files | xargs cue fmt "$@" +} + +cmd_list() { + list-docs-files +} + +cmd_fmt() { + list-docs-files | xargs cue fmt "$@" +} + +cmd_vet() { + list-docs-files | xargs cue vet --concrete --all-errors "$@" +} + +cmd_eval() { + list-docs-files | xargs cue eval --concrete --all-errors "$@" +} + +cmd_build() { + # Display the CUE version for CI debugging purposes + cue version + + # The docs JSON file needs to be removed or else CUE errors + rm -f "${JSON_OUT}" + + # Build the docs JSON object out of the CUE sources + list-docs-files | xargs cue export --all-errors "$@" --outfile "${JSON_OUT}" +} + +usage() { + cat >&2 <<-EOF +Usage: $0 MODE + +Modes: + check - check for the CUE sources' correctness + format - format all CUE files using the built-in formatter + list - list all the documentation files + fmt - format all the documentation files + vet - check the documentation files and print errors + eval - print the evaluated documentation, + optionally pass the expression to evaluate via "-e EXPRESSION" + build - build all of the CUE sources and export them into a Hugo-processable + JSON object + +Examples: + + Print the whole documentation in the JSON format: + + $0 export + + Print the "components.sources.kubernetes_logs" subtree in CUE format: + + $0 eval -e components.sources.kubernetes_logs + + Print the "cli" subtree in JSON format: + + $0 export -e cli + +EOF + exit 1 +} + +MODE="${1:-}" +case "$MODE" in + check|format|list|fmt|vet|eval|build) + shift + "cmd_$MODE" "$@" + ;; + *) + usage + ;; +esac diff --git a/docs/snippets/ack.md b/docs/snippets/ack.md new file mode 100644 index 0000000000000..f5e7da297b66e --- /dev/null +++ b/docs/snippets/ack.md @@ -0,0 +1 @@ +Currently, Vector doesn't perform any application-level message acknowledgement. This means that individual messages can be lost, although this should be rare. diff --git a/docs/snippets/arc.md b/docs/snippets/arc.md new file mode 100644 index 0000000000000..a54de7f03d06e --- /dev/null +++ b/docs/snippets/arc.md @@ -0,0 +1,25 @@ +#### Adaptive Request Concurrency (ARC) + +Adaptive Requst Concurrency is a feature of Vector that does away with static rate limits and automatically optimizes HTTP concurrency limits based on downstream service responses. The underlying mechanism is a feedback loop inspired by TCP congestion control algorithms. See the [announcement blog post][blog_post] for more information. + +We strongly recommend enabling this feature as it improves performance and reliability of Vector and the systems it communicates with. + +To enable, set the `request.concurrency` option to [`adaptive`](#adaptive): + +```toml title="vector.toml" +[sinks.my-sink] +request.concurrency = "adaptive" +``` + +#### Static rate limits + +If Adaptive Request Concurrency is not for you, you can manually set static rate limits with the `request.rate_limit_duration_secs`, `request.rate_limit_num`, and `request.concurrency` options: + +```toml title="vector.toml" +[sinks.my-sink] +request.rate_limit_duration_secs = 1 +request.rate_limit_num = 10 +request.concurrency = 10 +``` + +[blog_post]: /blog/adaptive-request-concurrency diff --git a/docs/snippets/buffers-and-batches.md b/docs/snippets/buffers-and-batches.md new file mode 100644 index 0000000000000..ae977783cf9f5 --- /dev/null +++ b/docs/snippets/buffers-and-batches.md @@ -0,0 +1,8 @@ +This component buffers and batches data as shown in the diagram above. You'll notice that Vector treats these as sink-specific concepts rather than as global concepts. This isolates sinks, ensuring services disruptions are contained and delivery guarantees are honored. + +*Batches* are flushed when 1 of 2 conditions are met: + +1. The batch age meets or exceeds the configured [`timeout_secs`](#timeout_secs). +1. The batch size meets or exceeds the configured `max_size` or `max_events` (depending on which can be set in the sink). + +*Buffers* are controlled using the [`buffer.*`][#buffer] options. diff --git a/docs/snippets/checkpointing.md b/docs/snippets/checkpointing.md new file mode 100644 index 0000000000000..55133c297cd1b --- /dev/null +++ b/docs/snippets/checkpointing.md @@ -0,0 +1,3 @@ +Vector checkpoints the current read position after each successful read. This ensures that Vector resumes where it left off if restarted, preventing data from being read twice. The checkpoint positions are stored in the data directory which is specified via the global [`data_dir`][data_dir] option, but can be overridden via the [`data_dir`](#data_dir) option in the file source directly. + +[data_dir]: /docs/reference/configuration/global-options/#data_dir diff --git a/docs/snippets/guides/integrate/background/aws-cloudwatch-logs.md b/docs/snippets/guides/integrate/background/aws-cloudwatch-logs.md new file mode 100644 index 0000000000000..f7dbca97e83c3 --- /dev/null +++ b/docs/snippets/guides/integrate/background/aws-cloudwatch-logs.md @@ -0,0 +1,3 @@ +[Amazon CloudWatch][cloudwatch] is a monitoring and management service that provides data and actionable insights for AWS, hybrid, and on-premises applications, and infrastructure resources. With CloudWatch, you can collect and access all your performance and operational data in form of logs and metrics from a single platform. + +[cloudwatch]: https://aws.amazon.com/cloudwatch/ diff --git a/docs/snippets/guides/integrate/background/aws-cloudwatch-metrics.md b/docs/snippets/guides/integrate/background/aws-cloudwatch-metrics.md new file mode 100644 index 0000000000000..f7dbca97e83c3 --- /dev/null +++ b/docs/snippets/guides/integrate/background/aws-cloudwatch-metrics.md @@ -0,0 +1,3 @@ +[Amazon CloudWatch][cloudwatch] is a monitoring and management service that provides data and actionable insights for AWS, hybrid, and on-premises applications, and infrastructure resources. With CloudWatch, you can collect and access all your performance and operational data in form of logs and metrics from a single platform. + +[cloudwatch]: https://aws.amazon.com/cloudwatch/ diff --git a/docs/snippets/guides/integrate/background/aws-simple-queue-service.md b/docs/snippets/guides/integrate/background/aws-simple-queue-service.md new file mode 100644 index 0000000000000..cde487c0bd1ae --- /dev/null +++ b/docs/snippets/guides/integrate/background/aws-simple-queue-service.md @@ -0,0 +1,3 @@ +[Amazon Simple Queue Service (SQS)][sqs] is a fully managed message queuing service that enables you to decouple and scale microservices, distributed systems, and serverless applications. + +[sqs]: https://aws.amazon.com/sqs/ diff --git a/docs/snippets/guides/integrate/background/docker.md b/docs/snippets/guides/integrate/background/docker.md new file mode 100644 index 0000000000000..699c9c3b0076a --- /dev/null +++ b/docs/snippets/guides/integrate/background/docker.md @@ -0,0 +1,3 @@ +[Docker] is an open platform for developing, shipping, and running applications and services. Docker enables you to separate your services from your infrastructure so you can ship quickly. With Docker, you can manage your infrastructure in the same ways you manage your services. By taking advantage of Docker's methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production. + +[docker]: https://docker.com diff --git a/docs/snippets/guides/integrate/background/kubernetes.md b/docs/snippets/guides/integrate/background/kubernetes.md new file mode 100644 index 0000000000000..f5b52152dfa16 --- /dev/null +++ b/docs/snippets/guides/integrate/background/kubernetes.md @@ -0,0 +1,3 @@ +[Kubernetes], also known as k8s, is an open-source container-orchestration system for automating application deployment, scaling, and management. + +[kubernetes]: https://kubernetes.io diff --git a/docs/snippets/guides/integrate/data/logs.md b/docs/snippets/guides/integrate/data/logs.md new file mode 100644 index 0000000000000..1fbc69e3590f0 --- /dev/null +++ b/docs/snippets/guides/integrate/data/logs.md @@ -0,0 +1 @@ +Logs are an *essential* part of observing any service; without them you'll have significant blind spots. But collecting and analyzing them can be a real challenge—especially at scale. Not only do you need to solve the basic task of collecting your logs, but you must do so in a reliable, performant, and robust manner. Nothing is more frustrating than having your logs pipeline fall on its face during an outage or, even worse, causing the outage in the first place! diff --git a/docs/snippets/guides/integrate/data/metrics.md b/docs/snippets/guides/integrate/data/metrics.md new file mode 100644 index 0000000000000..2311dd616eaa0 --- /dev/null +++ b/docs/snippets/guides/integrate/data/metrics.md @@ -0,0 +1 @@ +Metrics are an *essential* part of observing any service; without them you'll have significant blind spots. But collecting and analyzing metrics can be a real challenge—especially at scale. Not only do you need to solve the basic task of collecting your metrics, but you must do so in a reliable, performant, and robust manner. Nothing is more frustrating than having your metrics pipeline fall on its face during an outage or, even worse, cause the outage in the first place! diff --git a/docs/snippets/guides/integrate/vector.md b/docs/snippets/guides/integrate/vector.md new file mode 100644 index 0000000000000..bc622ab0924e1 --- /dev/null +++ b/docs/snippets/guides/integrate/vector.md @@ -0,0 +1,6 @@ +We'll be using [Vector] to accomplish this task. Vector is a [popular][stargazers] [open source][repo] observability data pipeline. It's written in [Rust], making it lightweight, ultra fast, and highly reliable. + +[repo]: https://github.com/timberio/vector +[rust]: https://rust-lang.org +[stargazers]: https://github.com/timberio/vector/stargazers +[vector]: / diff --git a/docs/snippets/health-checks.md b/docs/snippets/health-checks.md new file mode 100644 index 0000000000000..dd89eec87fd4c --- /dev/null +++ b/docs/snippets/health-checks.md @@ -0,0 +1,13 @@ +Health checks ensure that the downstream service is accessible and ready to accept data. This check is performed upon sink initialization. If the health check fails an error will be logged and Vector will proceed to start. + +#### Require health checks + +If you'd like to exit immediately upon a health check failure, you can pass the `--require-healthy` flag: + +```shell +vector --config /etc/vector/vector.toml --require-healthy +``` + +#### Disable health checks + +If you'd like to disable health checks for this sink you can set the [`healthcheck`](#healthcheck) option to `false`. diff --git a/docs/snippets/how-it-works/feature-flags.md b/docs/snippets/how-it-works/feature-flags.md new file mode 100644 index 0000000000000..2c6d65b6ffacd --- /dev/null +++ b/docs/snippets/how-it-works/feature-flags.md @@ -0,0 +1,37 @@ +The following feature flags are supported via the `FEATURES` env var when executing `make build`: + +```shell +[FEATURES=",,..."] make build +``` + +There are three meta-features that can be used when compiling for the corresponding targets. If no features are specified, the `default` is used. + + +Feature | Description | Enabled by default? +:-------|:------------|:------------------- +`default` | Default set of features for `*-unknown-linux-gnu` and `*-apple-darwin` targets. | ✅ +`default-cmake` | Default set of features for `*-unknown-linux-*` targets which uses `cmake` and `perl` as build dependencies. +`default-msvc` | Default set of features for `*-pc-windows-msvc` targets. Requires `cmake` and `perl` as build dependencies. + +Alternatively, for finer control over dependencies and operating system features, it is possible to use specific features from the list below: + +Feature | Description | Included in `default` feature? +:-------|:------------|:------------------------------ +`unix` | Enables features that require `cfg(unix)` to be present on the platform, namely support for Unix domain sockets in the [`docker_logs` source][docker_logs] and [jemalloc] instead of the default memory allocator. | ✅ +`vendored` | Forces vendoring of [OpenSSL] and [ZLib] dependencies instead of using their versions installed in the system. Requires `perl` as a build dependency. | ✅ +`leveldb-plain` | Enables support for [disk buffers][buffer] using vendored [LevelDB]. | ✅ +`leveldb-cmake` | The same as `leveldb-plain`, but more portable. Requires `cmake` as a build dependency. Use this in case of compilation issues with `leveldb-plain`. | +`rdkafka-plain` | Enables vendored [`librdkafka`] dependency, which is required for the [`kafka` source][kafka_source] and [`kafka` sink][kafka_sink]. | ✅ +`rdkafka-cmake` | The same as `rdkafka-plain` but more portable. Requires `cmake` as a build dependency. Use this in case of compilation issues with `rdkafka-plain`. | + +In addition, it is possible to pick only a subset of Vector's components for the build using feature flags. In order to do it, it instead of default features one has to pass a comma-separated list of component features. + +[buffer]: /docs/meta/glossary/#buffer +[docker_logs]: /docs/reference/configuration/sources/docker_logs +[jemalloc]: https://github.com/jemalloc/jemalloc +[kafka_sink]: /docs/reference/configuration/sinks/kafka +[kafka_source]: /docs/reference/configuration/sources/kafka +[leveldb]: https://github.com/google/leveldb +[librdkafka]: https://github.com/edenhill/librdkafka +[openssl]: https://www.openssl.org +[zlib]: https://www.zlib.net diff --git a/docs/snippets/how-it-works/schemas.md b/docs/snippets/how-it-works/schemas.md new file mode 100644 index 0000000000000..a5d3318f2249f --- /dev/null +++ b/docs/snippets/how-it-works/schemas.md @@ -0,0 +1,5 @@ +Vector is schema-neutral and doesn't require any specific schema. This ensures that Vector can work with a variety of schemas, supporting legacy schemas as well as future schemas. + +We *do* plan to implement a common information model for Vector that would recognize popular schemas, allowing you to seamlessly transform between schemas. You can track progress on this work in [issue 3910][3910]. + +[3910]: https://github.com/timberio/vector/issues/3910 diff --git a/docs/snippets/how-it-works/types.md b/docs/snippets/how-it-works/types.md new file mode 100644 index 0000000000000..52fa751505d81 --- /dev/null +++ b/docs/snippets/how-it-works/types.md @@ -0,0 +1,42 @@ +#### Strings + +Strings are UTF-8 compatible and are only bounded by the available system memory. + +#### Integers + +Integers are signed integers up to 64 bits. + +#### Floats + +Floats are 64-bit [IEEE 754][ieee_754] floats. + +#### Booleans + +Booleans represent binary true/false values. + +#### Timestamps + +Timestamps are represented as [`DateTime` Rust structs][date_time] stored as UTC. + +##### Timestamp Coercion + +There are cases where Vector interacts with formats that don't have a formal timestamp definition, such as JSON. In these cases, Vector ingests the timestamp in its primitive form (string or integer). You can then coerce the field into a timestamp using the coercer transform. If you're parsing this data out of a string, all Vector parser transforms include a `types` option, allowing you to extract and coerce in one step. + +#### Time zones + +If Vector receives a timestamp that doesn't contain timezone information, it assumes that the timestamp is in local time and converts the timestamp to UTC from the local time. + +#### Null values + +For compatibility with JSON log events, Vector also supports `null` values. + +#### Maps + +Maps are associative arrays mapping string fields to values of any type. + +#### Arrays + +Array fields are sequences of values of any type. + +[date_time]: https://docs.rs/chrono/latest/chrono/struct.DateTime.html +[ieee_754]: https://en.wikipedia.org/wiki/IEEE_754 diff --git a/docs/snippets/librdkafka.md b/docs/snippets/librdkafka.md new file mode 100644 index 0000000000000..0ebeb05012641 --- /dev/null +++ b/docs/snippets/librdkafka.md @@ -0,0 +1,3 @@ +The `kafka` source and sink for Vector both use [`librdkafka`][librdkafka] under the hood. This is a battle-tested, high-performance, and reliable library that facilitates communication with Kafka. As Vector produces static MUSL builds, this dependency is packaged with Vector, which means that you don't need to install it. + +[librdkafka]: https://github.com/edenhill/librdkafka diff --git a/docs/snippets/line-delimiters.md b/docs/snippets/line-delimiters.md new file mode 100644 index 0000000000000..577bf018b74a4 --- /dev/null +++ b/docs/snippets/line-delimiters.md @@ -0,0 +1 @@ +Each line is read until a new line delimiter (by default, i.e. the `0xA` byte) or `EOF` is found. If needed, the default line delimiter can be overriden via the [`line_delimiter`](#line_delimiter) option. diff --git a/docs/snippets/partitioning.md b/docs/snippets/partitioning.md new file mode 100644 index 0000000000000..0e67838fb5a22 --- /dev/null +++ b/docs/snippets/partitioning.md @@ -0,0 +1,8 @@ +Vector supports dynamic configuration values through a simple template syntax. If an option supports templating, it will be noted with a badge and you can use event fields to create dynamic values. For example: + +```toml title="vector.toml" +[sinks.my-sink] +dynamic_option = "application={{ application_id }}" +``` + +In the above example, the `application_id` for each event is used to partition outgoing data. diff --git a/docs/snippets/retry-policy.md b/docs/snippets/retry-policy.md new file mode 100644 index 0000000000000..33903cc12da94 --- /dev/null +++ b/docs/snippets/retry-policy.md @@ -0,0 +1 @@ +Vector retries failed requests (status == 429, >= 500, and != 501); no other responses are retried. You can control the number of retry attempts and backoff rate with the `request.retry_attempts` and `request.retry_backoff_secs` options. diff --git a/docs/snippets/stateless.md b/docs/snippets/stateless.md new file mode 100644 index 0000000000000..888ddbaab9b88 --- /dev/null +++ b/docs/snippets/stateless.md @@ -0,0 +1 @@ +This component is stateless, which means that its behavior is consistent across each input. diff --git a/docs/snippets/tls.md b/docs/snippets/tls.md new file mode 100644 index 0000000000000..64a5c6343d9f2 --- /dev/null +++ b/docs/snippets/tls.md @@ -0,0 +1,3 @@ +Vector uses [OpenSSL] for TLS protocols. You can adjust TLS behvior using the [`tls.*`](#tls) options. + +[openssl]: https://www.openssl.org diff --git a/docs/snippets/ui/start.md b/docs/snippets/ui/start.md new file mode 100644 index 0000000000000..e52e44458d5f0 --- /dev/null +++ b/docs/snippets/ui/start.md @@ -0,0 +1,27 @@ +#### Health checks + +By default, Vector performs health checks on all components. Health checks ensure that the downstream service is accessible and ready to accept data. This is check is perform when the component is initialized. If the check fails, an error is logged and Vector proceeds to start. + +##### Require health checks + +To make Vector immediately exit when any health check fails, pass the `--require-healthy` flag when starting Vector: + +```bash +vector --config /etc/vector/vector.toml --require-healthy +``` + +##### Disable health checks + +To disable health checks, set the `healthcheck` option to `false` for each component: + +```toml +[sinks.my-sink] +type = "..." +healthcheck = false +``` + +#### Options + +See the [`start` command CLI reference][start] for a comprehensive list of command line flags and options. + +[start]: /docs/reference/cli/#start diff --git a/docs/static/_redirects b/docs/static/_redirects new file mode 100644 index 0000000000000..6ff10073faaa5 --- /dev/null +++ b/docs/static/_redirects @@ -0,0 +1,21 @@ +# Integration guide redirects (302 because we may replace later) +/guides/integrate/platforms/docker /docs/setup/installation/platforms/docker 302 +/guides/integrate/platforms/kubernetes /docs/setup/installation/platforms/kubernetes 302 +/guides/integrate/sinks/* /docs/reference/configuration/sinks/:splat 302 +/guides/integrate/sources/* /docs/reference/configuration/sources/:splat 302 +/guides/integrate/transforms/* /docs/reference/configuration/transforms/:splat 302 + +# Other redirects (301 because permanent) +/docs/about/data-model/* /docs/about/under-the-hood/architecture/data-model/:splat 301 +/docs/components/* /docs/reference/:splat 301 +/docs/reference/sinks/* /docs/reference/configuration/sinks/:splat 301 +/docs/reference/sources/* /docs/reference/configuration/sources/:splat 301 +/docs/reference/transforms/* /docs/reference/configuration/transforms/:splat 301 +/docs/setup/deployment/roles/agent /docs/setup/deployment/roles/#agent 301 +/docs/setup/deployment/roles/service /docs/setup/deployment/roles/#aggregator 301 +/docs/setup/deployment/roles/aggregator /docs/setup/deployment/roles/#aggregator 301 +/docs/setup/installation/deployment/roles/agent /docs/setup/installation/deployment/roles/#agent 301 +/docs/setup/installation/deployment/roles/service /docs/setup/installation/deployment/roles/#aggregator 301 +/docs/reference/env_vars /docs/reference/cli/#environment-variables 301 +/docs/usage/* /docs/administration/:splat 301 +/guides/getting-started/* /docs/setup/quickstart 301 diff --git a/docs/static/favicon.ico b/docs/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..85dbeb0f87681b30e5e0b292492474e0fb13903f GIT binary patch literal 123726 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/adaptive-concurrency.png b/docs/static/img/adaptive-concurrency.png new file mode 100644 index 0000000000000000000000000000000000000000..c82f9e26c4ba990e30fcdc078834003d8357587c GIT binary patch literal 154675 zcmeFZhg*|()IM%&m0GaWT9qMCMMY$T41o|Q$W}Hof`kNQmMsK`qoT5+>3iM49q_x%fg*U#$;DgTDy|26A zFV=(pUe|bfyelKwz|p|b>=~Vk%B4KAFL<%EJh!H{5VVpaSX+SgXNKhaF3&xV2c-D_ z|NVbK1HWt?$QSwP>q&ZFJEBB#9Jwg_=bzt6gogAkZ~k7`b>4qp+mn%gsL1TDcKO#A zdVe5O;04R$C0F z;ykixr@A{Mo~6d@9o)P-{MXTc|N5Tn9k1}RNw7vf{Y2l z8uM#PQ^JD3kzyT&4p8t-g)zekHn`)VXq&_U8?gALhz56w~y?H0KFFKn!Js zdxW~bqOAAC5uXD0hgS%*_5wb(@Xj}|YhoPTv030l@yF@!vk#kWG+F0;e?6t|25mJc zFD#dud(&5`rf)nFM2jn@!+c&0ClK}XAp-F0tI zyeS+B`WQDzOK=ygSR-}vh^Dz}W4aGIN5jAR)Y()9$0-<-*AeEyu40!snJ(F})?b0o z(Ois8ZZh9E&AthOWFVF~*ZqytibZ==lv9<{_x)?~Y{T>C<2_uY$7ON`DPBE0K4`35 zw7`g*DuYgOcq5VD5Z}qJ#E%_X;B;SrtRw`0Ju2BQ!*{+pY?K zF^~)8kgd>DLm-b~mv5*JEhy!FR*Jn+BFkWz5XgEW#Q^XX0m8-&{?G{v+_Y8=31Jv4 zrv!*~TkwCcS{HM}jB_^5(##s&22QQh#+$ioViUT{s|oI+TbnONM43y2+b)$azVpBG z>(IOo3lxlQT+v$g7#uv$X?GXg(ks;oh*dXEu~p%q`NKHA`717!!D?>jzZ(9Xy_+Xs z1M}$7T6$R6ho>pFG}RW-5#8kwm=A%tX|M7&aEo>3f1C?sv1nDPLp5K>7zTjJazrhk z@?V~!HZ0cAfFmHcnt{HNG*^?i-w^>;qUqY z{1RnoRz|UmIUO8=th6`AC>jM|$XWXv@a$|Gp@b%}70x5z-f02yv2m{pd|n}06*~BB z$L}Q0J`f$vz4xT49*DgZ?#1?i>(ioNqGnI!huM^&kvoZTT5*6=F-K}q%ICkGG@JL1 zi*()iQdySB-O&>%G6chGVlBER;y?gZ-DQ11?sg8YN@Bhj$c%!_tnVvz*UNWqZ+(u5 z1ck@Foxm|oh<^0VCz3oG6=MRN#Wd}24$1zT` z9|$d?4Z8iA7G>U_$nhq4?rDc!5yt3O|2@MV^{1^yNnGFep77mkEK3_TjHOjh;rSWx zf(tNioRIuxu8bR(poA+rV$3DLT%C^mlc(-@0Z_oH`R$fw8GWzD%M@fleXz6*Qhr=K zXYh+8HM%Bl=3gYSqgOK?5|+6@JM~o-5wjC{oixprd<^Oz7I|kFd#l(spsf_or>1Tm z4bM>g>TSKc%6_%(tWtN>W{a_yRoR6!DMmGLc}>^+O`HB>;82GGby#I-Uy-M7c#ojB3hx_k1a6XdAngcB#8mVet%`cd}|pOZMgGN8-XkUlXm1wX{RVn zQ*20*7+W=e$rS!w_*Tyzdq^dFIE(H+Z6a6f)QV<=s590Yir z1qy!fJ87OhFiHZ=Oi__oh-}@f(JR393qVZ!6*9=-&38RdivJ3Sdq&x%12Dj@AQL^F zc=vOmuNTEtbX{LDJf-d8P1OJ7et^sc*w=8GeZ_Ufk02_Ulc^(ff#lXAiq^R6gevg;2=a&HsWpfkO7ST7lCWw6Q(|lKXn-AZ4#UD36 zqt>t2QY)h!#fFyhxW*3JcYM;}to2@k?D!Q3b*X=68j(U|t^1ZkWzSMsgXKZN8)R=l zf~sJ&km8@_8HzwSp(MKQ$9!ia7l~zlc%g9;B{3jFHqB%?fuOnE?#MrID!<|L(|8lK znQw=CRXI}auT~0yV?}*&^;H^ou^*%@ben8M+Ze|Y%YDe!9&42BZs&09`jd=DM+{wnQjh%NUoq%8|-zrORfBI@>BL^;CaigpPKpvHAu3kTZkZ zwBp0FpPXf*!qRM!eaK_#*8%QL0_=o%SAuY+moxu!zMp~feO7Zpt3Ak6kLNgRu%_)8 zA}Y6J;OX44=0G^)h;vk(R*z7iK40=(9lngRKlSqDBFJ4W3XIxN(}4Mzvl*pl!;P$e z+lx*YcD4(HrU!R^Qd?``wMA-dH!S`vQn48&ZaU;pxln>|sWMYa_V4(b{ak!LDAr{G zpjO5_dx6s)tB-|BXZ2pk2*F>*DPbERioO~ix9Vt;Fc$iqn9uttCrU`^mLcIwT z~9j);0r1Mq6wVT zucOpfSrDDSV}r39tVVJe;2Y!O6rnDfHOSAPl*eUxHzOFIpzx`nM!|>iGFgqYQ;nSC zpM9Ei4%%KD@c`jOaa()0EY`AD4m)-o9HBE@Km4*SBqS83xjln&><3A`@|)k=$LW!z z&=~Y<9{#M1{Hen5nCr?93IB&5s`QUKR3Zw5f<&H~EDzCh4pkjN+#AjWDE?*{w)|Sf z<^=}!d_fDo&o&eyGz3RMt~+;S3N9F8rL>8wE(S;k!wLHP!cvzZ)C@KOeRQxv3i$^= zx}(k4O{I;Ov~jS~k&<}#uDRBVo%Qyt?5(X=R^{tM$veGc0=@(NYNT*s`Xc>PHIt_e zXTQd(HQct}v{NcGFF`_vZjBHV)NfBd5jGiepxv{h_ph`&d}F(_t|(ZVP?u;j!L0V> z=-zVL#G!$nCwQ@&{WI9!JV?k6lNcrLr6$EljCS8#!?72ifr580t4|ZAnY(MepjpM6{-&>e*e2(ik`(5P(d zp-|h#EQwJBW6!4-jE~VqeY4tI>R~(8E6@D_2!NklQu1XBXA=w4-}yt159z=NqFqa#2U-SDB52x>(~ z^(I6jOEjgMFe%EZM(|KDmq=^IzfLZoAd5`3)mnmrd&h3|>ac|4^2~bm(pt3l0Q8Z6 zQ~yEl$yahMV`41nR18}J_k<)GD(Pue`{H98ZfVU>fpWjXd(FeRHJh~JvPS*j&Cln# z%G&8~m#FC2B5sbhR!^5kD{S;dE4VG?YIC}Za)hDtvC-a8UePM$5?oV%i(Y%VO;FCHD0yB|(3MHlo0k=_JSX z(7Df&e*_6cu{$5-DQm`J*O`b=)__=;Byimo+lDuqaB2G^N}{&HBPy#4C83Ks$!i}| zlS}WyY(tSjwi_SAlkFD~^+_YdBO06iQ(3x_TYCOH+**Pt^ewe1zYnk*%cR?(QfEv# z8MOX<0CkSGTGTL-`j7x1?f1tA)lMtcq{hMPIvfJtb=g1{hXUJ1ZA4KAcxyz_?)Y0-`-25C>hWLPN>3bS@i&9oe1~|9Xj?1}QK*_q)BAQu2zXjNA zM_g~_jSZf?y;j%bK;t?`N%hD19Pgb;DdYT!{kyD9WZ9o@I};ET(T< zG5XA2v5nt&weJtbWYFs0>(fa`5O;^C++5|EEnyNZ;4r4JKjU&%Sog1nIKOpW<)*sR z3oQ#M**o>~;f2wxiPF=3&T~&f+1rn>s0AaOWKW%|r|n;}ue^8a7oaomhk&C#I0l`V zl$xzEv`IVOseQHn?Oe1#;7CEWV`HRDa7-sP_(bbe{rUX{xC-+yFjl36lL_H~VBQ4a z90`G7VX2XY*@r;zICMxXq#BfY%kogtRE^@9LB_`6qeU_L3&l}+BbKc^VxFicPw1Ro z`y#8l(`P2OY;6MqhoCEwBx*s%4Xxd>`2PD`JAwqi!({##lrZ)XXr@d#R8kp-s*Zg* zI^uoV?SpIs;`;Nop}stoP<4{&L5@2srhd9eTWogp(Ox=(LEDhkX*B`Ft0$@{M3`q`QoU~1+;6QZ&VgN#P+X&*rWW~xKZls z{lvN{)USkBB%EX8a`oM*j^x^pgwbalZ+9Ylx^0Bk_*ksflw=>NKac&*a*&;}BiGsz zi2cpD7`=U0Uii@3H1PgdH#n+rK@O!qUmPKIw8(P{IPaDnc!oB(`+e5tAm-{RKdxlX z4_A!|DIaaZ(55o^;DyXQjM1GRl_t`qg@f7H1}{ViAnCk-IlTk5jzK*`PW5C2 z=r@k|?J6}1g%Gi;TLw-(grgA7cAaJGHQ&rg$&I8olvHI40MfylN;-H~KGTXBC!n!V zQ|&(0ArNS3p44q4c&sZ(Hq+KJkbBs^7?HK6EVI^6JDsyHH8LaD0;{IB0_PZ>$9G%` z1iNSx{$7+sKKKt>Cv-(L|EX89_vW)-qJyP@Y}|kSHl@)W4S;~l84(~&H!7vufwow) zpu)iD7=SU^3)J%u32vTGE*+k4UL=V{b*@;6CK0zn8l%&yPRe3u30Bw_FA0t02*dH2 zSdGkR?+uIc#S5}^P-{Rt&(-LuX}s86WJXBvL+Us#isc!JMo!qtHSepEi%g+w38Qzb z6;B4N1b9%9tCysM*5*D;?LMqttaP548855_emf2tf}gZ?gb9d+Y)`Lv>4p4ZV;?G$ zOT=i(R(k|Rx#f_k9Wa%IlIuX;X`jF15Wu-bw|i)vtt3giXBazX^UsklYTRJ$v-bt6 z=>&J7iu})pp5lX}YTPc)J|x_6{$q1D1166cRvu}4cK`z&^pBj4y?}474#FRq$O+UE zKGtJ>v=eg9Nxn{5HWec++ps}63Tiv;n;Anc;+ahcI&|Bq>@}j1=V~aEvG*Y_mc6!N z(VXLJ*}M;v6(f8MENlZoDmgCb9JC*QJYJ>4mKdLzo^x|tirDfGzDr2GJ6E9!Wzr}I z+3w_tLuijsPzjDosCJ+YcoQ|$>`p`K@8+GLMg^=zz++|ARG8;8C7(m^F+4?OW@AhQ}1cA^Ri~^X|a*j4SO{v&rNmc&Geux|9y7& zLrTJI4iO!rUU83vJSp4oYPq&`YS&7$zDRQ_luqwP!ED;8#2q{7u;mstPHv9(GzD+g zka!f}5ILZge~!}VP$>;rD=rIZ87s4$)0o@oxY1T9ZMn0s9x^A_>63ttUy!m$oI58f zgSYIF!J8XcGuJB(gjpbd=H(aS1YKRQ-vN-7Pg{*B{ z5Jiw?fnuS-yLCv3w>DFb&VfIq5)^p%|KZ1iI)jfSO|hLcZLp`O5L9CiOnmX2F_HlV z2pMV{%rsS?Rp!mS|Dqvm9B>$(*8suK$$7EhrEQt6k>|o}G7IbTxN0-^Y8ZNTkhAi* zp>Oa;<%`nMu-L(CZk`vvw!}S(fIOCN<|RM=xwXv?Bz}em;q>xX3+bk-pV3X1FhpTw z8zjRG?F5cZY+Bi#XSS=`sWICHd^h+VhgtZx)M#`wW1_IsQ{UW8l_Njw9(+2C5y^20 z_?fYRke>`q8kqh{sp1TfP)s%~}(km0aG<-QSg zUmsU~po>t6aCMZoNkm)O>?-7qmD|oC0LbLH*_Wtc4}$kz)IXvaUko}rj(b|GYa-Eu zFaP-OE%*#`&OJ2T~E8QNme#<^~hJUV(ZG-h?Y*tqK8 zY2W7!w{>mrk`8-c;w^!g=M*%O@8_>JlEoslKAIhB!yM@x#;!Ax##S+V{&@MK)cwj8 zLaTP^jlk4Ka)Rk>QDjNv z3rnKN0?^q2Ty@mb?yuQ?fuKoo@3vXe3|`FLtK$CR~Q7w@sQ#hiZk>p(_X=fK;43F}esnQ2g#yXF9+O2B z)Ik>DTMsQbS2_{T(m<8~GXZl0Rfgx;ZZ`MLa}=#~$A9{jM$yVpzUuf{wbwVT0_S7*-wx^oiQtM-4w{oJfkkcf6 zn-JEqiSkq0U3bs+;BM<`*31u`dHh~Od}b2dAcouBqRxQBHjH-L(1BZNfip=swp~3l z53FOFHV%B?pQ1J_Jtt?-@8WPRvxSDUn~W`QYF;8ge5CwgWA2!7Rq>eZ&WOi0VUH`o zmvu-gY%dsKse+dx6JDqD?UI0MuOC5phtI9e+WT)4JUjXi&E)P+Wz;{Iysb2QH$FJd zZ$=lf`8Rwinc zGKpq_IZ9$t&qqK4P@$ln4X?YWwC(5@`BF4h8OF(DpZt%5=o9;ig-tzLFccceOk~yBhF%X0VHwj?cR*!I|?o{>1Q*rXSE@m8;7}SnH0-W5{*hoJNK#` zYMSvpVV(b^D1yaKek*a9I#6Ka$QNkjWK%kYr8M*8xbG&}*Qw6sFK z`RW3^Cw8_|w`UP`C^(VxvFWbEj=nd|oEN%SL2r9|ClWeZ-lDKM#+)S=9&NpX_lTl{ zM_Fc5Tm>d$%B92Y5y+@y>|Hbv6o3;#a*qBAH!TqA1}JejVc{H-_-kvbD^J3l6ubHi zuHtpHme@tTx-8kcaVu^$A|4rx0@HauRMM8Wha#0o1oLXW2q;wLQF7VoFpzZ&H{*5_Ku-15nXa(g1iA z=r`f8O?ad#2JOy-0X18bg5Poj(4*x^3&lPkphjM@?0HJH*Q)7r`{3Tyx`6WBZdkTa z@j;`JoBsR&V(4wzlJw?@9M~F!y6aulNEVk;X?>PYZ+(-Z3|4iWpAk^pn!3BWW4Lyy zp^-d}L#V>RW#{%A)<|ggSk+sOpl{)LZL~e~5%S47vo>3^Rs7P(ooIY633sTDOqj z#y+Eue-Q;%Hn>?ZM7oj=;0eS|xm_IA;qENhm8s6|SOf>V@}OK?-@TBzvN6GxqV{6;%8=W3t4Aew6A%VN*(e_QHygVwJ z;VYbOi#j&Bi}}ir!BTMO-%a+Wu5Y&>*_A-~KYc{laW($YP4!pv&U(($5sg5vS$u0h z2FyYcn=5!TpZ*Xxud@_Y&^DDuvNSxMrtP7(A2ay-p)9M7j!N;4jU!4O>ql(p`*9=+GJ!FfhKxI+D~$y-I~75E7s*H z9g6)|6_g|~5uoLgV{V*60n$opRGL5@EU)=qr&sj!i1d^GrO01g2cwwK-q-uQcRWxn z!nlw+LMa)CW7Q>VQh5~q>VI%H!yDO%SDHzEq_7$>J~QYY4OF%21=ENBM%Ax$4L7g_ z>1`jD=q(p4r$j6#*Y29JcfsN(9ho$d(oZ|l3NGur0vC$s@u>6w2w$ouII;e%WB_^e z(4j-%AQGqLNEP_#g1tYzq-}!9)rzow7SR4af7>w3P1hRh1MSqo*vLuJ-11D_Xnp_| zP>w_>fP+L=t;1iZMXpkvULvFK;}*g!GtpKX&^-u6*xESGu)LvFSKjQkCyiBs5bR9o1y6Q)Ov08thdzXqAyIL~i?A_kY z-&SMU6Zw2##VvtkISF)-eRLI*bN0CT9LbBHI|sSbNTiDuhX&c?j-u0y3iE+ECs=|e zO#@lPs=ERc%=~HmBQ4>7MvT1`33KO&gg9hb&C)r0gGc;u@KE67>V+1z3BbVpjqbpb z)V2@Dt8z>d1C)tOioP6*nrMH-84>_Z58SF322@*)q$wbeF_a`iI+4; z?6(iHbOId0nl6L#uF?{^k|#Y%!Dpz#F4<}!bh~Q3f}&ExAbj=fB?8{vpyB{lfeq2W zY2o$f!cg+!)!l1BC60PQSRd!xocjhXVisNm#*QP-Q$43uOFS&3)?IJu-WOObhsnAF z?vZuypOvA-)QEV$wR&oIV+0g| zhPYP6BNPaBDP8rBeR}AU;aahNiOcF1hudh~78Oz0iV8)rOpi6MO7c4Png_Pj9A0Ss zs9oZ<$(9gw`YO=eWfK}{)@1h4y{M*Hbvlf7PdUF zRSQ%E1gYw|y?AL_QUs*|=#T*`EirPTv!5)06@~#mxSX&UQSgF7PyHtbmoEi?$)t?u zX#9?XQ-3{xgbQoE7-2_d49c-hN310dwj&_#?a5c`YR{L}zuqPST+JQ8cn_aeZI(O+ znfgfLT&5Z{;r4b4b3|MyB(RqcX*UH_6E;NQ3Sj_@r87=yV=QnC1`*&!-+h@vIJkLp zSW8&9pAb+0k#=>=Td-|ntnJMahcs^n7`BLjxTqU zM{Liq+x}qcw*U>VUx7Y|@5Mr3*l)cbLrnJ54M8+FtIfVlQMfyk&h62HNXvDO?|^>Z zhu1;g_`|T$#ia^hA~31o0K6Z(C8{<5sm^h=S!1S4zXXL8MiM;H4Rq*&@-{nUsX1

    Ns-|oe`{COXru7TDwjKJ0YVW^U2O% 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

    SYO# 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/architecture.svg b/docs/static/img/architecture.svg new file mode 100644 index 0000000000000..9fc33df212714 --- /dev/null +++ b/docs/static/img/architecture.svg @@ -0,0 +1,67 @@ + + + architecture + + + + + + + Concurrency Model + + + + + + + Topology Model + + + + + + + Data Model + + + + + + Runtime Model + + + + + + + + Components + + + + + + + + Sources + + + + + + + Transforms + + + + + + + Sinks + + + + + + + \ No newline at end of file diff --git a/docs/static/img/aws-kinesis-firehose-to-vector.png b/docs/static/img/aws-kinesis-firehose-to-vector.png new file mode 100644 index 0000000000000000000000000000000000000000..50452515cae1bca5d2776d9b158f77bbdf816298 GIT binary patch literal 85683 zcmd?QXH=70*EWi}ZJ=TS5fHF!lp-J^pj1Tx1?f!)gpF)KdT*h`1}Igf2?!C9-lT>W zP^!`bQUZho6{#VFng9Xvts8W|&wloPzcJ1j=g%3(AC8c_thMHv^P1PZ=E^f|P1S?U zT+B>NOb2h@x~a>=^xF~>)6O6J_JD7m*4cM5F`Z(%ee=4$&+8ci4aPRHlR6(TLMt5n zJ+U!HLMrd^&Yhw6C>Zs7GlYSAQO!pq{zKW!y@Rc_H-pP zhOHWVZu>j!&$=gfz$YucHW@Qb3^|rUy;m4b<8=ldzvFR;Qe0X>l#_?rz^zzK0#Ms0H zK0s*8GaeiS<7A0ml8}f^OtkYmZS>-{mR9D#*23N-0;fsMX=`uSS5pfmkHM_Yojv;) z=DPJ@);Z|GoZ{l*oMCp~bpESXje!w=JsIi_J^8t#qc2T0%0X;kM$OJHr?{kqym?~F zWY_qiR||b^Z$I$L*j`u`7{UvAa_iEYqgMo$wAtC%*d~D~%j55F#`X5 zEwtl`YFp#X9S4iw$F_U-Zp6~$3$oQ+gWGOy#cuBIB7fiH> zKDvABK`Stm$8~A#x$7?J+kv+gjmQ>>MIl8&LBTsQJ5HT4#rVS9jU2uVvnP2hk2_X- zL)-a2=&=&(=7qCo8>q#(RX@7ZRK1YHOkexJO_ve0$@!UFK2YDF(5f!N%3cW542kzo3Bs=(dK<6(W0TLxTb(mu0=EDw}e1A!M^1G6dT zfc0Iy^K!=r^KBdf58cp0DU@Nla%OL9Xq3_InV6d1c0tYp#I1aZfynY z`Rz^OFPs1I7=-)){ML(wpwHq=13^lxV41+f4)V$){`5Po+=>FAR9&aWlymx*Jt-&9 zc*EpBt*wVPJa=jz{IwXLmI^}o^pB~YOfO_Ilm3lg#v~S%mR`n(3FwMjl*5?30B~(> z_FNaw&W49Ti9c^KHb}m7X{Wq!?9eGRQhY# zzRT0G?# zSQH-qoxLNpj9b37P((HmjMP4m-M``-Unt}`lP+vTC?Bb%9WKPPKAUxl7(q^EwU8t@ zF3e|t5>BMq?X@5Ic$Tt$GBYDX=x1U=ZZPSe{xyJ*4%i2fG&bD4@Lrf;A2#y<%Vr-l z=e}T({uPA=mH6z-c{=FIqqD<;uIu>~KK3&q*Hf#!DJgi;-a~xucsSWQzwAedr;P8o z7GYIZC%&-Rjz-*Aa~d-VDkIrO*ncUG)-vKV^s1z-uew_|?$&ntYv}86cnXN04KG7{ zZV_?{GxX7oE5ojz)l;}zO?VjOU60N0R`xYVP8v)P)QVfmsWp&gX)#we;|YHGt~?0V zWgpDM^A}FoxoX!%!)ywpEd?_zWE$uv3$hEp)|K-=g*$FIh z6&NqdWtnk6d+j8{_v{PRhB}+_JsWnfM^h_0N{0XnZY=gnxjfH*DlowHa9w zLO+&Fhzh8zhLrFz;5vpk(l2kGK!M&bI zQ{(v+y67VR<*5FZS4DbZJbE4rp&g234?pXX%CLC3<`LxFHNM?J?8H5$VmFcJ&sAXp zMW|JIz0&{6sdr9uW(B?r1jXlbm+N#KgR_Jg-?-oA3R6!Vwc@lvf5v$7d@$eI`Be$jNj%EAQPx zvpU~4p>M=oo;>>^oI1e}^{TtSynJS*k6h-cNGXRWmHm+oJavgu$H>tv=?4z1;MAq$ zO(D9&Y(C7n_RGl9W`wEoS}6GmDe>T*iw4rao0vzUG7L!4q=C;8yy)pY_jL92V&mg& zXt77#eY|2H_a??nmpeJl3-##gQL5=)YrdR)~ZXN~ntS0Rks5z6Y$VNKr1 z(+|ZV4s5=TiD3iA1}S9k*N|U<5_3H;Fz_1DIw?lqC+KzVWp}O&Dv#WE@$r!5q7oHQESLzWEo< zx~8*RFxD5N6dX@lm>GCabdIR0seM@ui_c%)dw_4Eyt4!5iYWAY4`Q{;OFnN*(P?AQ z#HK#nSAnl*(4C|79$Dq!y4|C8L$f?s@W`F~V3D2Wy?&rBAej3x1qT1hw^3WEt5Pq; zU(%vVE8Up((A;=*{K8soucH^=5@Kc+6Lies0u1xfq};CIc$BA!*Q`Be7NI#ZDL8Vs zt(-Ev*x$0^eeW%>*V|QfLm`2@WLP$?yyX-+clRzqz^l=866=SkUvWJ5u`OQAQOvV7 z+K)ydA+3dThh^N>^`BYd9EY4DSZwiWz2r{w;xAmX?jMf=Z^))~>GT%^u=LH72$;PW zRWDX^14Mj&#R~J)@y5n#E*ZO*uxvD=O9!tQhCYbx+4c2T>iQT~Q&aOG`L~8xp1RF( zLx+H&D@rKIXBVW(xPq!9rc z%OYXu*5jCi=rapoh0{{bmY5Ncl^huth+B!C!N#<*{})`qw+Q#8%o@&>zTZ&io(qWf zjEe#|rSZviwH!401Tu5Qb(W1<#`7{_Bj;k6*~G`k$R*?GTlQbV&5`uc<@Rd5+Uz+? zinz~{vJF>rZ1xp`ujllqOou0IOmuu z^J>~G?&H~(00k<{b$(4ipnYgFF#_hukZVoK)ItsYZ6y9rot@>Fn(U`bCog>wDjgRy zo?1jaR@GdxH5?Aud&rN?ov`PSm?s`2Q$(Jnil?Aw^4S)xskAp2G3J>G&045jZfWOO znN8vb-N}fxKaX$PGx^$Wh)^lAGD-afA&($x1|N=*Mt}cqkmlr`+be^dFUFFbMk-rO z3Ip%LHWsmpO_9}pw3Mx^J8``5F3FSLf%gF5wX$NH9_f5?u-kE6^|}R@45ApIo&kto zoqONS_=hXgj%8x)26L9}P7sNX>pzTH92jy!LUQV?S;SvB!gf|safJFM<4my|A>-1B z6Rb2#7=b4fcZH~*ge_h51a<|XS>uERVd_N6!>{XQk9t!G6e&wb<1c`lRe3XN$tYFj zAWr9p(-A*I^oBS@M*VE{j@XX)eS#63NNU}9CsoZvo$nP>?i{dDu3$9H77w<=TbLkf z9E$@;l1@%xjF3;i=pa3sURpGW0Lw+3C#sR zdbAVY#-&sfgm-#49ri0Xac@;*_WS1fA%@5>Wf}m*-ByLrzzrCbqnI7IBxYV)N}t&I zVb3p6C2F&$pj2~IeIj|a<^QS=9uxQvo~}J7BGNI7VqxM2#qnWN1yrW-v69QBsu^pg z=Yc@>w2*V?tX|1E>#6BzEDh9|E}yYjH0IsuM%+d5J($Hc)I=$`r0z6H;~d5ux|#tCp2}&j{y13IodswxzLNR zU%2P5XF$#1D0Y9Jp!!zfKFH+L0;WMRMeiTnXgLf7zoVaAH|T8qK+5D_v2*J3A7fZl?% z=qP3j_L7xP;n!Zyd9xuP1Fzmlok#}KfpR)1RN=jczpJOn`QD>pcRx4?t@iKB2t`n5 z63EJ6qkn*E_?O3QMk+-C(+eU6mTDkfCku#X_%JRde?Vj-35py{Qd^=%*I6)LE0`Yz z?7B}h0lbE|Rm^UO%72eVTw0m8#ItZKsj*HWL9&1fq)EbntW&KM+r5QG1!VAs^J4gxq3`H7La! zXh3Y|#l*1G@4?T%zeJ&&Y1my4A|UG!GrE$*Z7_fxlyM)5y<)xejvs_}AkmjdRV;?~ zzxB}e^D$c*M!fVBHVrTuL6LB`@B3`|}1&}fI#(X*Bh$@)dw)5Sv^@-!1kC*eKw$Gw=F)0FF z14%0nN+HD!MZhBcYNQ;gGN2f?@8`=YReZhW4J&#-_xUo=x72RmF2b~*?vsUT@}H@C zr5Y`=8$BzSX(1#~npU;MoeOLP?f~`bBfOu+ z>+&yLxGQgSp$jGl8~W^TeU1)*`V>t;+py&SF(2I+32K(E*+K;-MFmgRF3OSqku0Lb#ay`Ve!=W;q-Sp z@9ZQG;N~s8^Naif>oNo-j086g%ggfK*-UmM*6Dz1sy(Z+zjy^UXxC@^6vPc#w$r4| zEC}uq^{u~r)VX${;w6M7^FZH&U}DYy$VUMA9mRZaE#Csd*_H%5v}+DXKXcw=f=l0> zYrlXkHc))`_~un#V^KC^;`zJuYXQzP0c4@9%#?q}BCoRid)4 zuCBl$6B|gPn+0+~@Ow(NYe;c35L$e6XS;@sG%(V*=#Vugkm^v}vN%g@&+*(F^Xhq_ z0qGD#PratF@DcPor9#Md#LKOgHTH^#Ly3QixU(awz0AuuSg(T(ddRcAeu3QAuTQGU z>)PJFeOm{l34*yhQy{1bMBr z*ufOrOt;9-?V>l4=yCd!lA)8jcBwe~Inu-^=rYOInV0;1L?7+~Ggtca$y%qvmJ$E-#APM6ql6YxxhZ-$GP$^&H1LuclO@`~ z>|BYVwmYsC$Qyx=Jhc3>a41LIQvT_9L_@Hct+e#;R^KPk0{|w43U#CrQAtevv^imq z=6fg927+o5g{xlT76wT2@jGfbj`4n+RRe{ABS$**faMEX6mVeomv1-RN|y5-;X->; z%o711JGG46ZEHquK*-#I*Q|7OAFrvuEna&%YybH4P}+ zptVyTfBpCO(Jx+D(2O{*J%G|z?o%b_rs)8~RN6SZJ8&ZzpNsG^E@kix2?@c^;?K<3&z=k`=Z=T7tm`;0he7ego1`29mEq&Q5Lu5lZZjm~D**SC5{0_R{ zQ#CK$R0FpByys${z}v7Y)>m(aK6ZmwRZ&3&YQB}Gg@o7;M8JZyk8IIY!J9k9fEeBi z>AfVDQx5b<<62cgS3k?Qy><6YnI(~^G{17sxiG>i15;`TuyIFBxtZ!Q?| zxtT9>P$xh5n;l!X^5fdq*(Elcp4`!g<8#GYM4wxf1L*VIG|gEaidEOTe6RkDeU*_tN_rb*p&B~TTA+kg7WZ(ct$!`mNYW3FYq^H-;)rnVG& zdzMoleohj~J^Hkt*+S*;2RD3gdY zy&#kEpZj6I4bjx~!2Eim4e($f<+oEuJ)1nk0fNrCvN(+J0WQn6jlaKa2qrSIR;%@@ zT9kLvNPc}ui;G`Qit*M=adGy*yPYramY=$mPqbgX-vb6;6*t+}mg zs*&5x#P^SVcE(i2y1>@&M&6U=D0USO+#OnJ=WqBI7 z6P~lODkU5ahNDjla(GVWJC8dT!_BL|Jy*h0ds+_Gvl9c~9QQ{zkOQcE73q-})f~Y4 z0EsdL%z_uqO4%5#dh2(<2teCfjcpA0h>J>!iuHj50CtjB?X-Q>FR@haq$mQQxhvHN zMO8d4YGjUu=k5`anQC}*vFyI$HE#4tZ$B}kRJ0XdP}%F`JIH$gsW^19W^BIFM|Pq% z(2GbF6n_X($9L3E8VG_osE!Tsj22zG7-gBbNic~DIPfc0n%EIw zVSw#P0!Pg^M&8n^GtN~xVpi(d!fD^0^=t&9ZUC~a+vz$0o&g4zc{QB2Z+}Vg1`>b_ za(4M0kMw4140wUxM{9fIT+JI0Z3XVoo43l{SH`%Kf7k5F^_Fd705L4+I`^gc{byYLkJ}hEt|X0{zHr-$Bsiy7A^&+hk$WpgB^jkvtMEr zB4qNJ7CBxnr5S-GhI-Zo{pTaj7-Sm52u}laGTdj|Y$nB@>PyF8NJCTxIh(A z0UCTGmPZj4-E%P?=3Z!a8(J!q;UPzhwWm&feR!pC zBI803+?7s|(PBBy_)(6;gxu-QjDVSpng$Wc6({WnU!3&@u?gyx>N^v|IBX~Wf7v4r z_@A}CFFh4wP2OJ^SqYP3RGHWD$XL-OhHv!+1``2BT(+~eNRX~RaLkg;Xp&GhuWOlk z0V=lgY(DkbohWcrWG9wa2DBJQ3AY|SwjgOqi~@Y(UZFhTc7x0q;7N!X*l@%Jfa#zb z6Le+3HoZMfT?N-p)|yp|30KkMA@D|EEK%J~{6k5C>ZwMWKwJHDm{Ej0AuU48=*yXnPX`0s<8aWLY^wLzm=70>rZhr2gj|2b~?XueB7v0jV|yE=4Z2(A^<=+fh|daatcK+$X4{CXK;{?nK3VHrwT$&bpU0`bHWm$2Z-*JP$(|P;8Lf>4Y~AsLPls8l#@Xh8Tu{*44`f~KKVi-+Z{Asn zMJ2QTtE;giCJKp5K82`2MN?Z!NKV=%X3St4dKzya+vX8QPU4jCea5Bi;R^Gb{;{hm zJTVvG4RG>18fU6)hh{vT(4OZS$EHbx_I;;nN`Sm>aLa=)-^BZaB^_*Ds$p_)7FcBv zn(w|@nY4Gel>MEg0`ci#?>o=v6?TLjK{siAs@Fw&-v=o!w8}XvQ#vnD*x@$0gq$0nZr;6X0LA5w7xKPLx_we=!uA?d#K3_3tOy zAEuKT05>!?GUnt0hEJJ_$R6wtujGz79B&_yaLK*QuHPFONJwXifN2ml*m$aO5+$`(XUiOQ+*@$rR)b!KF$f;x_(ef|3N^cudLxK@EBp)-IA6`fPQ zTWO6V({IdRgEdt1DZc?ZwQ)pgTgLZkB2zw!#-P7g2W{f!s`Z z3ku$zl##-zA@&jLW_|meW9Yv*m=8w~u{S7pm^eB&6&Aaokd?Szwj~_y z6#So5l{KS83DnKOQ(HRW1v4|RnUQ?@X8+*)p{=4zn^!h7@l@%V0oXUn!<>k}DW(R_ zdq+{ZEgAG2%-3>-SL~|$icZT*5pb1$V&u)jU8hdzd!?cgcwRKw9OGJDKeEe!`)>+z zZtbCFMKtEqsV6mu(s{p{S#cmn3W(F?8>N|??3=tPdzvVUsT6HR3Ze%P?VDhlBU@9M5;fZ?@$b{o8xSs)Qz8*4^>y2bFT% zz08prtkzB0)SXV`T{YRjFlOyw{_j=6`6@ie^cUwmGRnKVbo%m5ZYiF=w^p(clgHCS4p(o> zL4|8?yUsQuK_hep^m#W$pR-_^+K_z!bR9>cLO)exw@LaB@8pqTD+JP;;|QO*gzJzR zz)a(8OF$&kQy!n2n(VFvGppb>o|g0}?st^a{f18g0Rx>ofD$&)#)N$Z5)zu|M2r52y+w5u5pJb2)zZq&yC9Axttv;2oG1?QpZ zLG`yksAyD{OW%9Vo52pdx8eqAX=2J+R;29+?act>)xv;P1FKPr1m0t4{3DIH;~41^YL2M`QBhEkm?mYsDip2 zu0K(0>9KOFURJ(SorBl5vBDV=D*E#Ha;i>~FT1Q9FsoS^;IdR%*2is*4)=3QdsZsg zp2!B4?=J@W5Oko6TxU}a%8^?eb+1H$)*SW7Bn#yBM6^#5UWT|}o$3u1RX?&h;xq8neL2;LJ%Ms*aEVQeD z{g?OOe%jXegENJd=n9Vm%_ z%HgXl=ud!_V-riiq_gnHD=3mz^guL;NbNmD6k2rUz2c(|W!ZLL?lQLy1&x#isHE7~~+^L(@ zo@U>;qHK4v+hC&ArOcpPi9*5qLZJm_)0v{-CVSpl^JsTY&tZtUD7~fM@2nRI<&@W= z^d0i5_Uyr7Kj2*(2|f@RZ?56X_p}xpaA5xkS|49PNuQ&0lfx13+B{*Y=ygFS)sdd< zo1_5M@T3Iar1BIX-jy*vh@fcZ=O*ab(`vTC)09^vYGi|tG(!{}2gM|yLS{64o9q`r9+XuQ@!%3ZEq z5V6Se87MO13NO@_x78yRp~F*cPl_ zey;{%q6INkf0jq?a3=WH7Bsk)Y)9kz?Y+Od8^~TUX=oAA28JFNA!dLwRT6M8h**Jd zB6&ApzzE|EwK}j*P%8!G1xf3LqfosKx@CD4+=Z>BAU`^f#*OmF#ewp(+d1aOi0Fng zz{rA^OUn{-UMB(52X%BY)%)8^o}prL49s}kzEyWJ;HuZdmbF@5OCSlb5y)Y>*mzQP ztuN^|+7(ofwR7~%5s@xpB%v&McNo$QpGmxtQ4v7dcY5|;p}?q*890|eIBDrDk9BDO zk?w>}ICri_bctwM2;i!}Wb)h{m=5^GLGoI7piPU<`hXd@mr}&)d|bFe1*`Y?ef>f~ z0QLyfsM1WSah7j$Bz|`UCvz(Bi}N574N<9j%YawfS08Mst{{k#L<-!Eb9J6Tk~nDK zcmnE+76L`Uh8vhv)$ z6*A2}2#uMo&1-y8zhA<-o$%%mM%B2*&=iD1&$coHjwohh=@T;Xplt7IT8x4mh!^YW zhgYIFDm?xknO3UQ0h&_*I0La#j7cfUd>or87nHKKIH4(Kc_Z7&DkUtwsJgtwmh|ir z(tLk*=f5tA<5Ljv>3rA{=#K!s0PDCqSn`>{E~5@mXk#Il&aPf?bULJLZ=Tg&)@BCn z0LDP=j*r=M5%^{*}u(O3n?;oS{C<@ly@!u^l`gi)hwPo>>Zw1KCP31&8+!p0XO*@&Rui3CfDHz zBW5Rp-s$cDe+4Q42}oRB<{5`Gq2zq)diPuG%l>!whOF{B2nLJ*X_R27DXIx5lOVta z&64U^`DgnJSujvh30yz%l6}M@CE00k*wJJCuEo`tphW^|GN^I{uHG}OjPJFX?5#iJ z(!ocWIU&2unGc0EP%_pm$U6@5T!jHd6r&nj7in-lMX(@^#LXKC3aEwSh}uA`|5fv6`-4h)WDe>DglP1ECHH37hXZESM>-TY zHJ}9gX|rB1l{OXS6zWK}kTO~oeef(f5=sP_Gq9f{S` z=goYdPf0ngEHwo&9#5Ip z#s0k0@6f5_Vuc85@!-kyD+5d0}VUcQNwGeP! z93fr~?zfn83G}bu)%>+q(3TVzzX9e3^*3|q+EKW|&FE|`F4Y{{BwpS^M|qdcy1`^6 zk6B8lQ(^KmsCk_;`a!&~g|Frf>$FrnINU6j_t?aPH%lw2yqGt9*m>yyit79QQD47| z27XEVR!Cruj@V7$$rGnXJyt)m*gLex1VMQlRpn$qC}BBh4VIeg#jE3>8y6_g3A?8w zWBZW{d?ymNDrdOie;2H)l%Kn;hBb4P*KVW|U$v%Xoq&tbX#EmA0@VhIHTMZHR7gLj z4lKcQWm+Dl7}W||h+9=?b&knoMB+;Fbcjb+vJX}`bgS0Z_t;jx49wX5S>hb9{u~aP#aHH)FHla9lIS z1~W@3I2MH6y$VkC1YY&(GYR}L6d)NnEec5L_(Dg&8&YJcK<-m-3usZ)1eiw^>BvJz zL?9^KNO(R@9m+CR2m4OG;$PWL*Cx7OPc=gPDy|L6w#v237DLPsj{+Q8(Ca`@3hfRk zk{bsRW`d*xA0EC0N~@o|m-PewCpDbgO{P90Wi|vRSWB=*#;Ml>7_!9BVfloFr|Y++ zd6IW^yw?%J9un|j$fr@Y1LU%KcNV^a8giF%(>eCzPGG0>qb$aTMm8A)Uen>gSy^wG zS%_v=1PPQBnCb7PJ zKoJ7V?C}=;XU)3y}wxT*q0@6RFmtHYYJES%-gT!7(%}--n+uC zm!-R@@j%l#Ol?zX!vmc$A&tb++0!5ZX2>m+ca1q&K4Eil}KgkG!zN6nUt5;zUNa0EH! zgNA3x^y0hf{_I|KG22j49RTvPMg-?-%&S+aT%a{yMI)WDUG9Vqpcu|x$x4kLuhj5x zSw_|4Z-*)Dn)Uy#2h}|aS@=8lf%4RT`nt|zmjG*(Rk_+yaN4Ca&8{yX%T6-1m+=Un zwfNk1$ag&v{|YnlJq)u`TuM;A?8Z>GakWCqgeN{Q$Yavz$_-O`ZQ}bsVhy_3MV3sX z@7ytcKV&kV*f{#5<4;Lj!i|WuDp=u$Ti%>S|LAzFsG*iA!>A!s%y5w!uuRbJQ)24t1<)_m=m(CJrl#wH|9AD7T+Mn^cm=^6o3&E>^Hj8sB;j1 z`xH0W4;5s|up_rJsuBlcwCN7~jWdpsvx|d4^+k<<-+&CACbybRikLETB~w-P3&rv- zEdm#DRP^}Fg{Jp#MhyvoTH zk%!a3p(}xZ9&j}Zh|TPh^**m5`B=%|d}(sQ1|1~1!a|j>NtsWU>siKaVDcnpsS*vX zAaB8w-c+h3R57nbzAhMecL8{p`nQ{$)sfYXqtl8BQ1z2R(O0@c?m^5O3KzY76lvvZ0~K0+p8+6INP~_dSRWglaER6 z2>hieCDu7`H2J?y#^lzv>P?Ca)}RO8wt8CiBn5@#nkJUr%Z+T>9Canx+(duOA=Ko9 zae9&McR(jJ?Y>ar2qV15n;WSI5^>J4Ax(hzX@+L`xy@>7%BHDkS4zTB=QKwU*`zpJ z@o~h&G1T;iOb1)P?X_q0dFxbZxACL)j5x=Q(K?&yWWiw~^4OnCTnfry>defP`(~I4 z5di9ygfnJeDxYcyy}sW7n&Zb9S-p-`%owpuQ8(D8jgpClAYP)G6u4?KX?CZ*3;cSG z-LEG4IGci>OOw`KAbF=7)UmkIC6>GK}LH$bS#hiLV`)TjeJ`ys^Fn&q`8yK{jD zlCQe!0ZbIEFmp!H#sC~EdvKfjBu!FxrAOvJwVAAJZ68#0SUjQlwa(bXY!rk|rS$^& zxJ0*Qo_)qwX%>uu?ACd|YDCDM$PE?X?D@}bLb;%i#1i0C-rqg2w<*pLP&h%5XaJkY z1Lf{;0b;4F%f2@!S8JlQ^tQNNFRMuTCx40B{h_gtt_a2#rt*=jINBra;e$WaL1-yhyf=;jB>9FwV61iu+tZwDIz8BqUILT9s&;rgwdv%)^bdH5;yJQ1|%jT#9FM8P6h}~pggfh;ZJztpx zE6jR{z2Ei$Gj$}uUBr2!*;--!q7C&2L_fqQl)2h-b2 z>yj(S#9fuUALU;_57!#W4%pvb1N~T*XH!AwVXqm={Ls4~`{7m%oCw-kv;KS4?y3qU zO2>M_^9-$|(xvQy3!vrolVw?^qRE-{EiX>W_*eHr;u0JsX$v~XhK5dXY%kq2ajG@_ z{IrBe4s=EbLDuvy$iTu2e;%#@Dp4VyG~Z%X$2H@^`*Hr}E9m-X$7pIiI5F$Q>7a7l z2zpTtPG7{bEi>*_K_?fH*7nOMuIPZ$%!Rurr{}QafQNoq99bVUL>w6F`%kljP7riZ zxDSUvjv&)HG^MmlSA@851{Th7>IH+>)vGW?q^|w_B-H{17rzcq15?zCo>I!NBYGlk zV}))T(0j@hM3TH(qjbsQ&Aitt-yAYzwHi&@q8Q7C?NagpRyEA4KAUWUP1y7kCD_^z zR@R}W0lQsxP1}clcGwiV{{q7EZEgkqo$EXN@67H-8^32-Ant@7Ve8I*UqK&xUzP^~ z?_Tt#qTj@(kzUox{01d2^>9PZq*5+jG}c4!g__z;wI90Ap8k2}40`xX;`M!%KT==< zx`Q)UB|;=7uDEv&cdRDDQ504@+=OiA$6s2kh{BOJ9+#oY`b$!lOR<9#U(rHwn<<$} zf~KinYk3HgVa6*z&MT)eZ%j_7pA$FEGG&?jngBD*92PYx+5Jesf;Qi#cAe^_QB^5S zbhPVUClubTsy%wXK!J-b6}Pq^nQ_j>_|rFa*1DFvf(OnLcDiCV_LkQAN90DC|M4n} zwKhhndtj|#WUPkpDLu0bRyKA@$Q~;kNeJ9Dzd~2OTcgD+AG|u3+GSbF>&J%J%W58U zO6>}+i)d5X2;OuG_0kt>|RU=FED+BB0}nnUa|NWk**vEO+R5}RjmUmGp|iolsoEg zdCRL*>=t-JOpl|mCB1KNZ&#guSyuei0KZpo>BRWPjntO=Ku5yFml&nuh}6B{=0B_v zDW+6cQlZOYl#0hauR7C&ITc6rXP9#`|@tB)GmkvKM zmKuWeU=9_I`udSpC)`Sq+t30GW~kG$SEljpQqlU-VukTvcFtjou zwc#?T5hbSHMd!zLyaT!eN@Am>hYl+`Uj@&96kwHKDzY`qbRS{h#qO3`vzYEW^X&&` z`1{7yE5j~(3wFFXewN!=k$yy2&HL;; zT*ZpYSKAiGvPnkC2GV6dA@p74ZcLo-!rfJA4+^nP!=Be!Mu@N4b%S!>e&e7BYhZmo zO!2^4_4z0McLkOlR8>=L>Nr1%qM!KB%B^gAAMjpoifP=9`Vq*6IFKgFh6wMMhyjE> z_)z=n=)Ka6`&TsQLP8XduPV#V=PgEE+U4T7*wex^;h--1+JIS)8?T?(DLd=qDt^D6y&$?vx`4r>a)To=33+p< zUh;6d;0f}PaNEyeuJbRi>rAYbL>*B$drXrT5x&fGOP`P-en3uNc>0A6Sg;;?SJ1hyZMRR~ zucb4qJhlxb0sQ^#=DR=Is4_9mxeZ{mpJg>WPFvkrK_FEWxDg41%%v|juF zVG_OC#oja@q%K`=QNwsHTj)mP43DmNnQ4?)u3Uecyl{D_T(xfW$JFt#7hb^L_1`aj zJtlJue3~V0a!g~FM5pW`i8nVB2`9*$;a83A^PS#Y-?u9F3nYTUp^;;o-6b0KOu>zo z&FgZ%HKl(h?IzCnFW;WNmfCW0S_y)x8^)8y4LA70mS*m)ju0*O&+Sis)_ES;+5*fY z@Fc|-@n`efWjD@66NmmMaKl-n<1~4FOA|lZ+zal7qKqW5uU9^r6K{Ppy&?OXPJKbn zBBtM5BO%3s;F^OSlP@r16qq~uyzMMKGWfB7ronSxm<-g zciLm&p=rGPL9z=@E1J}^@b&x^-#s5C1di{vr@aB&_S$(;+f-E}Au7U9btoWfF+5mw zCeKd$P8wNbvcpd{fCjMtB9{Y;eA>s-v$He1bAc1u)#=pXMNj{E|Hgl;X9%3F{vS7% z)ehJ#T6^U9*)Q!o^Fg);m;(GFbdhRgZnzJVXwnn;&YZ70O&}iQA8nB8z2Fh1Y!=7v zMDcuLdPg_XboM48065@-BThROCc1B54b|X;0`b15NDZrJN_SV#^H(0eT>0I9m`#?+ zt?UPEr^sbWW%U(Ts?Drl+VJu#^nJn`M)F}Lg@bH}^0c(B5^y%@$XgzPr4uS<;Ju=XMX9>RiVIQU&aK!36%2p$KPKD<5T60G{ezvHDqh_R_#6*@--;@cS zme7q)1Gd(mRd_tS&J5me6@+)4CesOb;lg|p@nP!X`DGQ3HkcaD(C#k&sIR2XcVB%f z#f~Z|fFI~?(cU+O}>{0|JtfoJEu%A|Mi!Bp_fQh)9;Kf*?t9R-yuefh-ag zlqevX0?85!BxlJ;0fnR@^TyJB_VJw0eeZj%y&tc=cK__=7NORfbId;a=%bGbIDRgR z1AK>+A{dUoLF4x98G4e%thE8cL!gTP8oS!i;p8!<$oJZEHq&tu{_SP16GtGf%dOSz z*^2gva0f7!vpQ66fnh_Bj$iA$Wp~?d$H9~L;^003#1e~@_jqk1K@b{)me5q1&`?k1 zQdZ_yE7&*5`Bb#qkyB`8vwb*}YG-O~3L@lF!5%*Dk@@A;7RKcnmJe2Q>W@ zaqq9ogx^qeC4!?~s2N{N*EW(zc%D%S!$s!2CgatSEwiu3?&rby&u_J00&Zrs)-9sPK@ zPNmqQ$%7~|dk9}9T)=YVTIQe&;VaXxz!pQhM0f^z>dewjo=Nk?7n!0j6mKX+^fu=! zEQl6mWheE%D(@EOOC1s!^*myRwH0#@G}ZWFkU4BivG`b!9zzr4j@y%*_2&Jr3}6oT zs0FCO0EhyHAzc;?X?OTTAiRPv0Ks!vsvEZ+9zcSgQV*6(g~T z=EFT!?XOazWZBFg9i@H<_nE$UQ<1~+J_9Y^Xow&cSM%K#OlEh2>w^NR)>i2gut04i zV;c`|5++mSt2urf-m*qt97T}+@~N{v+{#q|{g=6>zRj0#?VeuY5pXD%sTz>9C4Uky zf#<#9&!v~CQB-=TQr_MCM|mp^*O`-ssx8>U#jYBu!BdsybijGFnJe9<^jehAHDWw1 zUFe%pV{_e=q+6qe{{?yf2@%L_`KLp_<;CAt1)?3kiVvgMe`n4AzkgLXF=avcV#3aa z*|p<-&v7ty>EuA|whqOz?5D#(-rfU)OIZUHCvc>mKQEO1(LdF!P}|y6ccti3h%NEw z@M4k&qmK9x7TitUUiM6Y+<;nHvmWu>`)_Sy2~c=B`rfYGpvAJa5u&FL$E%6kuTV!PY#FUm0B#+$&T3FQQI&zteDb2zua#uXv~C@Xriy?ZTV26Ajn=R%Z# z;vt11^5il3R#**{g)(8rQY1OvkCBH2=ld#<^)V&Sm!@4JQJZp?9FbdcXsNrYd-JBq zTV{q-dr3A2X^4Ll8zBeuJd+($XiKW#j-LVvYD49!&nq*Eo~Uk;tx@4zzkgbOQocw! zO_SmbbYgFcG@kssWQ%=yAZy6kT>ep3wC~@+S_Qn4Fh+!~<7xjA+4V*64cqkIuE8JXdg}h9R7=wSE25n})?IkH^_zNYX(5QXS3q<2K!T&`!lWJ0cXB58GhVr{bq;* zaV@vAKskUCe0P}*#O|wpeNYZJ(Wtx5>LbEZSU@}LWXEKx<_&O zYDe~Pzw<{*C?!oZwYYBzX>r`QJ{TvlY8&@0jLH$Wtq+Ut*}lVuU>($Cz&CPFdh@29 z;;*;WVk_Q~=dS%Y@N3 z`oNiN$HvuL3_cPipMN)c?4^gtpHl?6|493|{V_M!3};!2Q|EN6K@6Z6y9ok zjP&nGgJNMCM;$Od%{DdBo8uXVfG-DCcO(W~#&;&$=lHev;%hhTcIwwEc|+IINW0tf zy^!GV)4Bd_GD*>NVg)ysrgOa+5dyLeHZ`RpN|kM_O|5+CjlvG+Cw{YFB% zrlP;m`Hz3KP#;{4cG5H4C-mV?a;D}ndsw{c1?yzM=bFvTobYPq=-k>i zJbpUa?L3`A(b(9%g9KWJZ~1N?h9nGU^D_j?B<(HkrUmi7D@kc;f8K5M4QMqmT@MuD*M1DF_@z z@Yomg*=jhpw)EJX_bUx2At^(COx#@LZ6%akIp62*Y|z*s70~|rwLXbVcxEWcU>=Ih zhr3bz2HW|40v~R6PM(Hj8{DKEF-noI5{fJ7hnnFNTLsuGm8&DU+nLD~s3c^it$M!Z z8Pu6OZ*>M(%o39ika^8X6w8M?W{zuiCxWP%sTwK9|ZN=q$6aq2;q1W(k50h`!(+GDRmlV2Xb(tJLmzXC%N zg5Swa&qXddbl4P19V&no&<9ObdUWYYQ+ZtX)XikVQ;!2T0E0Xp&w1$W6RGXA$48da z!{I^5mH2v`T+i2YN+dxw3q>4X2UvGQa}AORpIoVmTyW$b)eMaJ?n;y&U0x{(0EgAmiq96+ie&@c`FQUX&MAE5FbKO>Sg+tx9l z2bF8bY0{ZNz&J*x1SsI>7Ps!h&pxne>7-{B49DFhyo?p#wD>d5w7!s>3Gd8fFSkqX&&MwZGqy^t;l>8v zKW8}e zp+zmTwb1A)4~UCj7ARPy*$xi($d$P?!sb!GmRP-0?tLex%n`~7x15;^`lCU>TsAKP zf$hu3>a(zp?DNZ-d}Y6;eg-bJy~vT@yX8P9j5;c53EGr)NX2|srj2%T`onwh$skUF zy6~Vtne3J!Xm9VOJd~w+)@Pk3Gr1eg(MEN`W~nngJt-JWe_mwd+V*ZO+JJ~I;luK1 zuxo26rne%hIowJTDgxU*53_{cn|f_MWhif~qI^GSoXY{6!`o`;ip)aNZUILHPB;hx zr_LUp*yR`-XF52_b5&E`#5=yueD>vjjo*ZebRD&$5JIO6UCv4Pn(&FJvirjP)StL5 z!<;O-{Rci2Ur4bJH9wSe++pXCLjWf_H#)ul%@@Bj{(W;#UCmmkxY)knK%*yf-aTJu zUih(?M9g(IS1gBlYH-drd9lLe;@xK7gm04!co5grnZv$7yUyT6Ft*5IKPT~O%ExZT zbkb7u%#}TxEHC+&7vNsaLC6opbV}#yBy^j~SqJ7E-2r+HbH!)U?yPNjUeUYZ*Jv{p z?<(2@aE62+NH6B4o3eH)hGl_Hbj21ktr57f}md9s*VIJ=HZK ze*R3TJ8hRq5cQI|ew$a}dQ3uzXp7H;%!)VgTt!+TAg<9DxNO=--no*ZdIF_us=BoV zyO$8{-F8hQ9yg^XE&&8!-@h7aLo#X{Ho^VuX?x5wmAG)TbUsl%e0J=L|gDbuB^}N16a|i!`r4kQ0vfA4$z> zFghQ7GD+(TNeC|N)|W|~Yh+KPq0*?Hd|9T~-de6WY}6=orRX1!Y;YCMGZANq%T%*I`RmNebKV&nd80)y zWOr`dj6Xu!8;N`81@~LYF~FLjWC(&B04!CoyPJ_}C)th0A1gl9ql8ly99rvq9{Hhs zq&BfQtdvK=Y4*{a)xu(<_NxdtY{u@j~pTV6!~zv|XyY=efL z48WsX0}f-mRa^UxxlJnzcCC^xL(~0NuLF@W7k-l~HD-lHr1I(2?#{aS9`#a#U^z(1 z11v2`+heb#U&J*l1L?FeW7GP6z_lkfcON@LHtD<)7c>#Hosey#LHNX!YmuiX6Jx$j zWy+~i?{n(ia;1B=qn7t{?&%jjZ>IbsHmduX$g%r$py`@YfD~iDntGcPnsSg4sX0P* z^}MS5gH>sI&)K*<&rfFN7&_G6v!$1Slk%9vPhU6u)C6VKu2&$iW8UlR`R(G~6;$ws z!}W4Oc?l*_gV68etQs&)$23qN@)HOoa42}US~pkTK#bN+0#s|OcV0i4I+K$7BW667 z#VTivE}M6k5YWbU4BACMo=bFhls7K`T`~nS5HFJp8LfJ` z`Wi^3JWeHR#Hv0Zg|syDRKWwCY~>TkQZL*-6B6Le5e8C|n)YpfsH-OnN?I&$!wm&D z3^FqAsFMa=&j9E)&(+K3E42wShGGa>Csm?nC=IGQr@p_|uyHOS4Y^V^_i|U;K>H|& zI7+b+`s`9rhy?+)MD`IVe8LV(fYNK?z#n_j5o%A66Tm1=4wM(P=OTK_O&-6Ii5^42 z0U>(!;XAP%?eEN+<8QGPzvWKToMj;8jCl|r`v&@}_u3kf${4urlrY{i{LWh%@B`@= z=X@byKsHodUskpy56RW$NAElk>Rid}(OTdnq7hdC=!^Sw&Zpgc)@Q#4dzXwZ6M_8bvVY|yn)fqQ z-2xnr7ohtZ0JKPF5{FbndZR)``^i(Ux7W@LC$%$yviUD5L$vseP7%xF&YQw^*!kp# zAraM5ji}f0drXMZTeLWrSb3OF=HGn)4R~99sI@4n1nm(?_on%wplf8uFY*w8_(whE zq$!N>_J4EzAT&D8O74y<>Zi z^swJy1&FPZV*Ck&;GKR0Tk}gPFhZuTv6 zuwz#Xx`%04G=Da@IQ(`oLA|z;v`GHX8u4wP|JoHRs_HcU&%l>}>f&|2q|+M?msKvA zt(`YWNOIrz?%Bi#GF%Py;qquaup7|ui=J0oKtlFhLw(PWLI}6A^8RdZezfb*7B8M! zp0?1}7N`xW#Wkq_8-F$RN&QE@ofACI$}6(iQ;VXbwXTl7`bxSHRm3V4{9@5J;r}!eNxsm8^>tcMO1(GQ+MxcNus7Qtf^+1^sCN^!hd%O;409HA5dh1 zTtVt431mQT_(y>_5V`sfoqVWJMvh7Q8Bq9_zep!b{=0%@l2~qDuNFF~B81z!C7ZK3 zXeiJm7q%?7=DSDs3I8`K@4j#Kc)C>DwRPt-eZ8(XZcip%Q@DC$De0jSE-?y%bfkOfPqZwQbK^;`Sl=0zDw+7#cxu%f5 z;OVEIpg9!Q2xun#D3Z=Qac#;HdfD`Vf40->>UC?hS^Y$TNB3ye^|FS`M3agZt{mP; zxn~Tj&d_Sd7ry?-+oSub-0EKMS>xI5=%*O`+Wknv7czXIec(J-TDP{|qhDvMWjHkN z@lMQZ-h$U>{3~+$Dqb|c7xSP^ky!nrqi5V9<&Md&23LZDDoK4yi^mW&uhZwYx<@7e zezn*tpNAn`d(dKX-7E{bafxBdHQ-b5IPvm^<9L(e0@dHWVQ4lbyfvenfbxhIbM%-j zp{w+7YtDSOz=Hr1p8JoAahJ9MXtLm$jegKBHRg)U&Z(V!T17uYMaG3TYSDfkSiO8W zTEg=z(yrTkm5PzvVTH;&C-a(}BrMjG*JVoGsH~$X7Q@$0xx}!nF1d+`B*es` z#;dhP@a=$P!RvO!K~+J|%3kCZ6Ee8IOUINN<3!=-J%#8huZ@_0X}DHR8Y92LDqa_pK>qQ5>76V-Nd?;dx0WI`krpM&lMhcr99Q zPeoR8n-bh56mJT(rD!jjvhF0`YuuM|T{#L6-BV+xF+3RCj=bwr_8-NjJ2@U_?%Gj; za`A28)z7eb%gg6goyW#!rM}!QxT

    &Vw>)(0j=dBT6KL4BUVLRxMzzDEcyPQD6u!`D5fd-VZ|Qi!XM9F`NZfvk6BNr_dSS7l?grV}wFe1% zKNow(lQTd?D5R&J;aT#@Hhbi5%_zgKu3lkg^ z%(nxB3ur2*-IR(JFe4Ur5iam3yp`Sd@7yEv&0JdXIz6 zeQ6h~sfctJEg+u5uFeXdXPP=EDsH%TdbLz_)Cv|J+$qeEuo+K~rGOQ*a0AW=4F=i7bw(Jc|L1*-Wjv443mEN-)!W>la@!pQx#wkG+lm;b-yjFMvyX(CNOG`4ZMGjq z>ZJH^A=0LA%UB}{X0p7bZX`Kx_lMDs(LMqI6O=TSuUypE_BsI3+7X*oyxM;Ll;d^> zKD^*EN0fyb^YS_cy;LSQSIvLy@P14S~zzeJpLwi^~2h^cA{~fY3tyMT_uvAPFF@S z`^P~w2*8xSoe4ScbN%I%_(P=LbX-2I;5usuV3p+s!G8+OZ8QzpQeMWnhaZ3uDLOt^ zHa8GoOX;LAEti_2aX^Z{eI$X$&*>}GEn>6A!U*Nh~ zq4P1XG2}^tV1V3=wdvps{J64h5(4xPU=TQOtShtam#3*7NP5sVWEYOd|1d*JeLTg~A~(rQgy&ao@?g| zy`;IVV)XJ3LwzW<=?UJzU#1Cok^fqc-z^pY=d1r`HGV%U|MyozF+-NWDDjXFH;7o^ zkrA3*`>r*-!V6^>8K}#?22o*GZ`?Zla+=oTtNU5~5>n_VFszzkgKa`bfs4ME-Y)Jv zw@oI}v@0%D~`(wZd+1MFexV?MAcG-bgmvsjZ8V68N8A0b7T0+9JYnW%y zO9A8a6}@77nus)floZ=5a9=?0dSi08x>0Wb>f&0(?t=LOAAtI+G(9)I&aEZ0IEi7O zr!scn#yB^Nefb~B_IKA#Sfu|57<=k+(|73*+F`Ki)Q;(8VrmKn+aPrBL}nc~`#ct9 zv7Xzn8IyWZq;OB@rbOaDs7Y667e?F<0{AT7ok;A>5hdzb1etsG!TxAs@096E2{8({ zU<1J42h-sHs(OB3472ypk}~HJl2QAxY^FYbPJqu<5JU?>sE0vr*Df174y7;H!#=lM za0T}-;s$Y3u!Fx68Z9)A7T_s_iV1o^M&N=z z#BuXR-Uob;f|6DTDUGzA+4QHW&&WXdQp%`0_8K0Up#f}BPf;Y3LX-l78u~r z_TmSZPP%0_qL#Sv_CHt)uGo4FE+kD_>|=K$5(W3@5jk)R@x|ZW&K62_USuEvPdxPS ztCF7~`|I&f`z!y`+Qu8KoHFV(fB*Bl>*z@|^gaZu`3^uM1zZCM?08E0Dw;pNsIOnv zz07ql#lfDha3NE1z~=-6XI2E))JhbcCh!gLEXjkV=L`RUKZx>R+)aqsSpZUh*O@xbymnKi<5od--)5(^vB z&j;<*qF)tgo;6jT<d}At!{u)OJo!F(8{RhheR ztuk|Mn2vpYh8zr#SYU00%m%5^%1Me}W`1|~{^nC+IE{F_Je7s=&s$jUsdX1XhXDK+ zk^5GWccD$t+|Xh<7NhtDv@2+za?}KP2!?$X3g!T(rBDV4rO>ZzZulkV+a_)if!-*K z=5k2w#;j{J#Mm!Snuh6l`y-#PyG0uq=rKgY`6@Zf}m4aaJYbyoB=Rd12xese2%4Z*3_qSGLOL7%i}F_JPv} zmI!=~G`P3z9Fr@L|K|Gt;b-zVD~sm6qma{!^n^eXMmrOc;-SZ)(lxB8IG7OR4yDJ7qdJ5kSJcAYmp7c@qkpb3q-~JF%>?#tXbCJ=R!TV`?RKz*0OWzq@kFe3#ccjA2UQ+LdrF(+ zcb-+1I1gw^-tgRrO&bIpSdQwBE%};QPAroNQ{D{^(su#dyDS!eWIJwIeF%C;P8?n z|95%zd&WS|oLB`bN|wRQr8OF8adP*_38_j8N9h=7Bf~U7D~m&Wi0yc@&{;O;!*{kT zv3idX4c$>`p! zpRCJWwsKq|R;?DGV=Gw%V-l)x9|V0k&)5}~HEK6Si`Nhcp>K-QxWNu64Ic{rLjlIF zqo~*cq{sZXowqKP9vbuCSdCsf!X{mEd~&S9HoR0s z$6TuXF6ec8obK)xMOZ0nyWu44K0)wyf=QQ z?!1oWPaXt_WjnPjF8B%TrVz-x-BDAPo@d}%^&WECW1osY4SZTODthDOURa47epjs= z58kjmaQ0Auk)>D%+cPJWlN1%XY3*48KY5HLGBNs4xxt&jN-Ida@*>yrmpt--u5GgDGOlmxbL?C!E`!B`?wyq3x zQei0Y80b8->gxpm%L_omq$^>)O9P#T6R@ygE)X1%J_gtqw5`Z>Pw)0VbS>d6s~Uv} zp~3hZT21j1UcFi>@zzzfiDH1=d{{3_$P6$Z^DR38AILla%*~Kcp?p)E4)nWN5MuW# z+&4>H1-2m0(nXXp8`{F1TP}|Uk%2St2%Uk<4}nuyY|uT};V`Z53;nAv7r>_h9_~rh zmb}gG0`%3`E6t&h^2_=4xJ;C0Gn?{PadfJgKjUAz)xYO~*Dbidy+ zbw^&ikj#S+dG59 z!dwYd4Sv6u`mF4~IiEkB{`qUhlJNfJ|G4+qHg~00CW^tYPslOMyJ|_8h2nYw*?RAx z8gnURC<>gt|Di&qvTcyn^g0-AJ;vU^ZA8gLG5Ym!(209%?C_l<=>$Nc&-(9LJPx~~ z!TL^-kio-xe<7@DPuGaP^-r=y+h$RUZ|&DK-?Ku5xmxf+q36PkZ$TgXzXgl{WBLH& zfNTHrvrOUd>F>Sw`+xsiRGH53XI=(l-+2+K8kigHZfw_0P%<*cAqoisNCVrd*)}ub)2j`z(MV_b=zU(P zMoFHZvla~ka-w_-_?e?#6qq8m%h$_{KW5YjkgRn49FK&VBdc_=&`&MNGC2)_$DwSE zDS20Hn*>v1TQWK5z+{MD0Bx9EO<1jf_C8FouD%+=cy5mYn*q(10Uk-)N>Nz#NG+HOG!B6&2XfQWcMH0PNGQ?rI1R)p3Ra?N^6B7H2Qn90n!o-0l7uLMoDPh zR_JUVk$QII4!esof8q+j7iD_@?4t@Q|uK_KMS$Hhipct4$gZzIK40?_YJo5b<1Z`OGJ0EE%=K;?caf`cpXF2>ikDooIWoKY5a|Ei7l$3=6kId3(q+WnbzFYt^ zjmXFYNQz+MO}wN2Y@AtmzTf#EcovPJ^$&%WzxJH6$Z#c&1Ke<9pg;g%!kkMr7$btt zf#c+Pj9$7}Vfn|eCU_ITag_kAk+!bN)#}us38JK5pj=&=L&n=i9CS?{AbY&;-#WaSq&ja7?u!bcauI<UGoR`;gVwlR8d0zL~|@-Rgq*V#%JWX7;KXF3&avHeZd}ySc$+{4(7+l;D&@y)(Rig={^9JnOF!e5KI*y zm#mh>gY%EWLxB@YDP$UDi6N%X&{Jn`2OOm!K!D@pRvg{2SJ}_=gPbrJtd{(K;aX_R zD2=e9jVxPC5EP5i!ZxR1C;=I(Gl2nUAj^DBIE|u_t(M+~McCM`1lKcB2%-6pa{A_~ zbg(;FB3n#C8WaQ2w5zETJp?^+LD4dLm>}2sl#zu!xl%wBoFTwv$p=KZ+$U|~ij{ih zsIuW`<)5?&qssVgxxZ$>0~kuj$W;T3=lOn)jNbA$fCY<|a%TXmM@XqU`4lBWC!zAs z;(ncLE(v^Q98yH1EQlVDQU7;1uzSbRru)eJ4wPvk(~ol>;w4XfYgN z$@5ukj4(S2_6e|^e9_en(5Q1qBqGT7lk3WgDInksSiN2 zFK@Uj5}YU$Ql1Cn9b*S3zzqfQ3O)|*HqxMLb$|p=X)cJU5Y>QvBx`Rs{rl*yt0Fji zwPDr)c@3EML_F*r>rfq4L$O2ah{2S-E0VJRv`!0u(^ynJ3`Y^Z8GbCHTmVz@t9=W# z9e_dAc>Gx@b%L(27W4#I5up=r0v<19=n}MnLR;m^idQYYjL`FeW2miBPB->r#SVrS zy0HqaI2+hRaJF88(<978hCtCC2tL2c10=ERj5P{`pneVerh^?nGe<6>@}4NtY6T-8 z81QNX0G_}ha>na`bCf=q-yvZwgP{bTHmNA3zceiKe(B~RaCC1Ebw4ckervL-?EID1 zBbrnK!K>^9&i!o|yM+Lh6YfP!N1$Fb9y0;m;^765Z@`PGvR4FNAO=Z49q*$sTml*! zqKZj5l~!m(p6|J%4vt}34xSu?O)DzzLxpQLu4cjbEAg3T*y*VE5qgT`C? zFE23E<%nVkO!>Hth3!gxa8d8YUd)P!FbbML?}v6(7_~8h(;d%gBCzp4U?OC^Y08Fg zYb=)vH);Ay`*c0|igBdq8Ftw9ZU;ZVp-44YAK6!776*>(5NbCEw}@zY>`z|S&E_qx zYRx)E=}PWc z#P*#_MGESu4VW|!X8Zg`b?;W3I8<_A5kpio5Ncw*P9}If0!#Ech)sx~ zAB_nGkh~C86;uuwhww#4MiRhGbQrMT)y)DFG2~(ls2*T0s^;%`{JEm9$dn-D0YGx? zIIU19pv2Ui*7b43d&k%lyPeN#HYlq|Pb1pB9b`>uva z2_}ul&%ks-sLr8nqw8)ojC+i$M>Wb?cJ`RkFK(%9#oUMT8tTblc;Y;Xg*}O$t)xwc zvamhO(-O8=#ZX34{bGm4TWByo-Kq@4S(&a-qvOjy;VZm_OC=y7z;=ONpa@@Fx)}YIc-Wk^Tm+GQ~ za}nqBa5X*!@S%C7824Rqdgl9uY5$Aj|@#s(@!hYl+(pFPJ;49?kNrv-61XT)?D)j;0{ zbPQ4x0jtxcuS17mSTiCAlN2Toik5~W#@yYC(e=|k=bXEljhyy_Qr=rp$qyV%L=K&} zIq982={9ZY7-a$x3B2cwNF6fM^~v87u!|9t4!if$7m-O?7)OB_{^M}zLGrzOJZ(Hs z5JPwF%)n@5yHIbl#LW)I9ua2&)gxy|MFf)4QlF7CmmUK7%6TqHK4$Ufh$$dDOmjk@ zgbm?)KD$*=|Fm=)1|cqW#KWxVav28p1t@^>zSpSpYW6*i|8mY7g2KSz)z47v#KdVrJQ7c@F zzP$&d=&;Qo?3sgz3X?D9s6DvsWiv!_d#vG@o5et%1Ygn2y<@;y&iKVMfKT{#**Xh| zcFNvtHiPdfhssv2MT$&QnooZi2Tvt$)0XO+cNTsIxJpCe-EGg&7cu{eeTD*#)s}@G zPrs2sYPaiJ*6PeT?hz~5uHdIm3^2s4Zst3$@ONMSyw zZp#}&5m6>7+yGvn=M@J19oO2J4x_E41-f`V@Q%`QBp^Z{eMuiASYTa4nDZAbk?APj zI{_w>qrjDy->1O<6VMFcQ&&0^BW~)NSzR+SLF4%n|Ji|q7Dpu%Y<(Y9Zxmem#|xY zJg&VP(?C({Y&ljSxdr|r9w!km7;A*8@gta4umOWBe;tOdT{oB{tf@1r6X04H zz%)bIdKNf?o$W93{%8M!!>o$ye^-+reN|g+rM^@iYIzgegcn zFc_M#bJl(Fq2>82X z_8!&CA3MOQ98U&=D|KY)Y_hfGHcU)FL}59gkg$U(+1ULAl#sXO_=7Iny*D4O(>xHL zPb9g1^7!ld_k_jAY3V3}h>z3A1KFg$VJAn3X_D&U@AHyzl5X*lsx8z)?>e3`(2vhP>pD`$&HdqfP=|^X z3Lh0e>WbUn_7~p|vu>sZm3GNsL@wqT-XaYARLPCs|dAif33X z$=q5+JRMN>{zZ&_s!R4{Lchkamg|D+q1*cQtOs9Qr5~FkNO+D{=Re4v0DNjE=>1)~R^{VJQ9mTAa zx-xcP`7k||z(J1T(tFa2?=OTIw^`J^EAiYV%hBH^y_&zW20@@*nHX4DJAV!4rfbCrCk-FvIS;mlIYi{f7k z9gXbvIE(Km3l7PXj<)0Z#uQ>P&Rw2rA(Njx#J2p#@&zA9zbGZ)E81ghue^$4dHvW+ zG<9d2>DcS!C#dO28MN4Gd`a0%x_FmkvJXh{B~89-+qYxTrM{vNw(H%(3=+MgnM~KL zS~H@&<-2>R`pWhhb*-fpA?OIht_yD$XR2B572Q3KL#3da6U~@ud|BChh*c$yvKQj} zvgSHS^(2bgj9EZyYPHnoop6GK`j(Vc=@ucx;FmC);TR&)Fh@;8oY&H~?0$+heW$3dYn1YzKa_XW1+PZGD_UgRa>&xX6C>4sU36T%H}@VJ@4M;sasR+8(J{z= zOW{al``(s_d2AH+H{8wAU8&^T+8$Y3+b2w_|A+TU3BP%*mEAYq?iPugpEke5kCT3V zj3jQgUya+5FA?znfA>qd(}^=|f-DnUt%BQPEemb>bWnr>-+rhonEJeTc?D_g(s%mlOa-qove{2>uIS$gNm3cXS}83!8yY`J5sjqNc)hzZi*ld2 z5Fq9@q0otiW%aG@E@;0mK1TKOI9p|EMp%oK%C!%UO@D~7%nP%vhUH|iHL;E)&eoE0 z4kq{(xZ5Iw^o3Xn;-8Y@{oCbB6aZ%D?3)C*@+nA37e3nea<7v=Reqd*k@?6eVRJD% za`<{v6Zr{aXc#i7>oxNN;+{I9*SaU(G5B!%0;mE7mX+*h?^9}0_g+d{xLotp{R?j& zG5|WYy#K#^Ivt|OYWH{e3h2d3==s71l_%0x3P>!X(WJo1a2mPBrzEOOU)Se}r$ z)vF24QktNaYF|;9SPINiUJsP9u{9`LM&{|?K1k@VZ`TX4uy6~36=@&YVoX!TOfHO$ zxWj8cFL=A`8`^lxH(q7%DHT`2#`=if?b21^SR0A&IQpB{zF)fYhm+OAyeey=PVpw1 zUAnDp@X^>=i(9>MikI#jo0r(3WPa_lHIWt6%d;LF`}l=5BXW*rvWb_aX3)qm^^Jlx zzwv^{YK_qXR>;nu*Y`X*>aL7^qlZrHbdnwHd7ODF!d62OIeQX^x!A3Yk7nz;?&Hjb zgca@&UKFV9&=WM+m0X2gp~eji=HpJoBGpIOYe@Z8y~&o;=`^nG$$Mg= z(`aUl9Dw<4i(V4povp+ofg)z1&gHRLN!IMSD|h%l)S?PSgY5Jx*XbMYZ`v*q`M(L2 zKEatb{-uMqPD)ve&3G;|hy5BmlHLGjA@j=UH8(qNpO;klI`j@8y044?W_k{DsaT9+ z1mA{#t@wupJCyR0k|BXp+8|mFoFd=g^Di`uu#4Lqo|im?{2!q0xju9iFExYCJ4lO1 z=|%}j?3b(h^GD^<7T`A%BHiv=n%%s6sou2?7fy`WV4usiYxP^&E!_~RK;dX15SNLa zp;*2%9d0}^jX!y25RZJHzN^b%er07o8|BA0sJdo>=I$SUT>D-w&<1Hwwl>y0mTO%; zK>?o`blu*$*8uFSADziBDfBSHk6{On0*@s-Q5X1eWhv0c{18O3QAaNgy|5dzk4Z(i zVGg;Q+?#Srabc=vt%b{XWI+!_&md4|Y?LrsTVy`;0FEeRxG%Y6S2` zrim{(@tz(!;|4C{R|#{4=~th;TM@)Z?K<{OS@8xt!yC<~Tb=LAxrZw&b^-taF9xiy zgKnn}L^n=yl~d_8Ib`3%TM}(^w!RGBZm;gmtZkM)u7AInpl)L*!!K+fQH2r8Z-$u3 ziMA@ff8BSy594b9d23l}ppeW%gp*<-`Q?Rg=C3w+laeQi<8)EnvPU=FN=sf zlivJFytSj$Ej$Cll1b!USUUQ}WCd%lhz`^0L`5E!%s-sg8B=1n1Thzx!5(%Sao1%S z^RJFwa}3%Able`+3c@i7yTz4%#TfY-I2pWS9uK-^sitplV0U$HdsPk}rL4zDV!*~4 zMFf|iFlX3AWDVPcttrXYkiV6IRK)11{ zTvFS31;6;)~dAnsfa`CXJGk|;oThn*M{K| z&24S^DbX|=6+6#mU{L&?Z*N%ewMBc*F<`q%o$Dy>`l#gy9;2nZ1*xZ^i^H|taR!v9laJ723E{r=An7s^L~Dsv7`7_1W=A0|P; zIf9;^2J_AN6jtfFw~4*Og^^lf9+PBo-D67_+7E7XFrRG~HMCBVOwK!to6_lRE1q|n0UJv)kjOI$G_nMx`KLw^~vrLXjXIZ~)BF+NVEMx|wF82gwMqZ*9}nX|ePX ze5zZ)OnT1nZjP_PJr#xk@$KZKB>kUU*^$7eDNLEvP25>ufG};QP4csVnebQI$S;HI ziW6yP5w z)N(utn>^9-9Xq+3OeF*e%=Cdc2$=U_Adi4iYIrCcEXp4!`pp~6LA{Iqg;|IBiV`M( zSBts$pAae|vFzz(KZW`^!O%;Co%l|_@GmdGuGmhm3>G*Mq}I=kq9iMHIdTS7B6teu zT3fn;@@pSI$f#CcT(}}i3NLkBw33K*PY|Fu(0-;=vqaKkLjs=I-F14faE4?WcZ&h)fJSc9_##HX~@F6X%ECB!t_vtKoqg&?yUUK?ub^|!zu+?yp z85G-RV7_*&%y?aDDyLZ@RsIYcF34$g2p(1`mQUoyn&8~mcZNy>-tS)(RW;?rT(}Fk z8n@$u9?5`+fGhRBuStfomIZ&=I1fqYvj)r4#zq}6ubtr#)OuOY(o{2&tCF>^_Kj+}d>hA2k#S?L3&cLf(S^c8RFY%=8dsrGRuRF6E1y zgHCY>k0iVH2cR`=mBEe<3@S-kYO<~Vq-_=b4W?FGekZ>)gvo^6+_L#oAd$HBU>By% z#BAR)5ReH^z&_t&3oGci9gp|eDIHA<1Il{h{~2Y?txJqTIdDihvRJO$-MGfH>+*NL zy?b|)Z1b%>{MVj55N>G{Lx?f_dqtji;T1N2!`FT5?qs7~C+ct;Mf;4Np&E9-=j3Ea z*+IX`{Vx1#)xRndxGOI62vXb#%&J}EdFLDTSKR})32ov(aBi4l$fZScQq9j#Bs2JH z6=6`ygzpzAgZJfODgP@2z@SO3E`p-);qSt4UUd2Og!yL&3NCt#fAe3B^YESFd7`7Ek&(C zNpo4y229sSuHzTGKHCD*elQwi_#siv^r zTh`DLB#akeY1Yh=s~?|QA_;-N=u^|{#TG|q-Ui#(HwJp&%)9c@0-k4~P%w44bdq&{ zkKn+!@A;KbfuyJ7NX7|C;yy=zh`wkhb>Q1(a1{OAK?|+U zx`6$2s_{abSgV}jFjt-H1QKmNUx`Q@msyuEnpzLQ@wze9t9aOJ!MkxP_4P(=74c#$ z;TZ!ppEw{nVXvXnCm=55{27b;xfm*z;`iS2RikVwnU*Z`BWaQzTDH2oOUphu_&W9LN->o+O_{#vEiDJ~1Sugu`5Hi>E-{uq)-;LzIl z`aFk5F1kGP9e|MGmB+L59->Tk*ISW!(#l<`Q_Ad?I+VA&CgA16BxmbX5)LaSP)Ka9 zd@$LLz_hw7O{gCBlD>Y_%~ytnHn4xCQUoVJn0xwvo{P-DND=6_RId;0Zah#r@RgRw z?D6jADg$6kUF4hP!dMi6U`r!G(yN!x#W1|C+s@=((D@UyUBx@_ZN!rWzB9n83|}I9 zO+y^Eak0>nG#(?>{N<*PfkB6EpSwAA6lK}{YRZ^s=vdgUwCTHU5BXn*3xn-0dD|Ep zu*Z4G{d$87E(E+4fmO?bc#;Y2PopDB`i5$b*QWm=Hd!^ZKh#nv+U)E#P`%~T4N^-v zOmeSnQ}NVs9>=5|7pHq?O;X$HOO*$WXR@nai|TJQWlZsB0Fi?HHWJY!SJIdG8-)2#%_06s2BI*%iF6a5@(I>GZl?@8#o`IxkH0WbPlC zmpmV2#g~Pnh=_)+y;u8XP9ygPFW#?Dt%lBGF%b1F zLo~}1DO_#G-I~sbxe(Nh$oT>kbg|rjo`BZXJc)inefj8S9cFUIYkQZxrP%LlN&gwga{!AZY%M@(a zp-yc|@Tjd#B~x3U4EZrzeny(pCe#sDpAod$oQo(QZ54N>6tW_NcR|nr{uKH~Vh}sp zd%3pe?gRQgmu0ic?S&EN_n7!cm8i1)@n$U~$wi$IbCx!kn7H@34TaejbIexz;T7iP z9&&*=@^c3l9>?$w1+_R0QxW#&?O5yiG98UV%7oH%J2)VCs?nk7dORc8n2~ZsR)iCpD(eihORQv* z&HO2G{bv@yRPl;wR^0luH;K4usm%CKuQ#?C9)Y89K%ZCxdHaQctm5vksl^>$PJ5?a zHWW`Ahzm(VkEn{@;~aoo;$GJUBqmZOVk1iEVRfG^_Ug4`=I1Zpn7;*REeC*)tR7%q zUy0??Fu8QocFFq&)4i7wLAYjqgFsdN?&XOYeuHWVn-m3tZy2AOnYY!CIxFJ=KRoR- zlG0G=-0CniTp-p^sJ|`nwUs=_u(B$=Kjz6BDS}H{la!Z_7C0(S_O`XP$h)aXrQ?_{ zt;HV(Gsjc*(2@4J3W5VW8=dHADd&SyIOaeEX{uHi22}ucL9XvMTf6g~;mm>{L zLPv*X+p$LRRzFO z%w^uMTon#GAj^xV(0nxJO+KcM@ESa|mvpMGkm4@q9LK9ys%x_;4V8Q7MhoX_QFP8a zs~?n$Z?jZz6?u1`^ZSb4>sA>!W`PX}v|;(J+ZDsRE^w$PU_q#}hYuhNa$%GE|6=dG zgPL61eo-5sfFjbRi5)?z^d_KU0a589AfSNKL3&e)1rRKVbPyDjDpEoVkrI#&DjgDf zhfo5ch3xCmwchXj_VWGC?3puX=FIH>7E4H;=Pp1xf3 z2jIzv#wmL@OF5X>pG&+ke39^4*d*I`Wrzi))LP2E!B5=VNeo7_^2CF~m+LcL6lCs( zr8UUH6%vNB-@eVQw_tugygG2w*>QHv*2DA#4%ZSvxT`uYSPLzzwl&+jQE!MEbhfVD!#aMbjD8E>?t3 zggjBAK;)cnsz_NZ#Lc~P8=5)4JNdo-c~bZZzoGKEN1OV*cMj$lzeU;hlq1wJeLXziQ6-M)Z3BWUc#$-l?M0&Hps`EEx?8NJ!Zainto6eMcIswhs)p zP!J=C*F3wV9X<#m#<#rC8|61c7aYasH?ddf9f>uNq|jSgD0?}_v;uBmVpTTZPQrmv zjudnPy~X1M-@8WSnWGAjs~|uhR+2n6F@D`8E?MS@$1pkEFP{VH1Z?zmMnqm1(ph#ns-MG@!Eh$F~Vd^=scsSA0Pj>r@MeJS#8}RNJCGlg2R9>pJ@y6@7rH zzBWfR->j~<;%I+S%U3B-pYxv;az_OWhV|UEk`d)uiz*)Fb60SJ0 z{p*|5*r(C5hK_>AThyhbS5lKqF6mR`c&u8dpAl9sMTyC2`EJgSQwCvcJ~dWe)K}PP zK0iNhvTbvNa6!{V*}jrk98BgRudo9^<7EB3tSKVNvfiz;lU-wtyx+|BpIw51q7AQm`W!Bg^ zd1wH`lC;I2w#W26VDj%OI53~6nYeu-CQIrCho^#)rJLfN)@kd=w~7|%$%(HaZ;jeA zH&l4ecAC*C1Q@&d`VjSf6B7vbw0c`I+3Qz6xcUBIA(r4xGwKt?`4Ub0&q9&tg+O)=Qc=05Gd*Ajulb9Ij*g`nAp1YX8TaTHJYlrO-g#3 zSGEhH712|$MELWA71@H*;D#6Q@eNSD=scFq}qjzyzl3JiK?M1xg>F zOzeKRVpky2U>(>bpmRJTCQ1csPT8*Fekcc9yM))&H6P6It+M1@Pz6Csb)wTXUu=8; z2-2g{<2%B6C_;X$u=-#$9EjB%+l)xloNNkIz~zpxX4XsvH@)yTgEB^wQ5%|-2Gi_x zPlnXyXoT7e{*`o~^Q(Zpfb4bMECl<$7@%Xf3?W5qx6Id49S60NHGUyJG|n6G=m~l7 ztnkP`c8M)iWn#47Pb3Op$KYGCA|=;F)kDP2rOoehTsZpEhQ-vX)7VgFBal`DLWzJ091zL8K&1a z9HB?UPU9Xtxb0ErS+pKhabAIkZi)7#UOp@IG+5s((%cbfOp^8XpJ80+GA`xiV@fl> z&~rFIR8NOcv0sf~EPQNVaC~slhzE7A^$JfQ)EiJa?}y&yM6)r1CJu?!LsG=P=K!)? z=lR_XoKgAu!~)@>VLmei2ZzPI*wFm*!3~%7-q>pIx;)VD(^-=9wTFp}{<*$bGn;L` zwqkn%%0Q9hA_tK&koQeeRMYNlO7fcqxwKgTxoKJOL*R0CH5-?r*$*&Cm?9rEIwBqx zC0xQAL)|7V*KZgH6^)!(b1`+S>so8tj-{8~W>x;9XIYNeddR)4N*+k|(@t%3Kb#rIH}+)~CXM~`D2sZ0EE@LKw) zdvZvn74OwaDA}klKHKSs_Z@r-;&MUm^DH9+8g1?V^tXcjOLZJ0RXuR5Sy#{FlXY97D@yVo54nFSeDi1L052cR1H zt6zI0s+CI`5Oro~n0lHZ)^NMvw#v7SM+oUp?+HBk{UOhABYpA(C7dXqo)UV$qZ<7qVp+%Aju&>?WG#?@kzW$Sp<9=(yw^Ko&f!N1& z|H9Jq6TqcA4qOul)W7w?^2_ep&bMAG#)uU@rj+^aC{2@Mf}b^cK^IZIeA2?lj1r_I zw*q5&LLf1`(OI@o;)%F%U;R&La-Fih`qy39Lf|&w>6;VQnrDWm8{S|`;isE+II0OfWZ{R6U`8wr?6 zd|IcHS;^+Di#D|IW-m;NcBYWc2M1V!?+Tz0vUOoyQa#}%6~cRzeuUVj>}q^$4(0YO zr{zD9-J%jkK7pU|${(K$x*eFoyIGl%U~ye$exKSdh#*w0m44QbLN7W z3%L6Xb}vK-1rFy%gT3&i2Q0?ez02pOgt_6^)v&rm6L^nh>+qLxkqGIs|jVo zN^IhqJ0u7j;aQX#osyXO-Lff`-i$E#{s*fViHNB&0 zqlkqf!@6=X#Yi+Wci{xQO_i<9(JztOhb5d@X8I)N_k`5~jSs7}tz(fES}Rc7M8(Ag zebmo4zL4n&10K+br&n$U25T$>!Cz7I z@s8knNpj0DrgQ})DwV*IANSkZnB|_Qiw$PX_5}^!)0wi%h=S_7Mu77;@5%BU(54_1 z&tmfZ_wU&dbX7e{(nORRD7H@$b$`;IK#!R3gI5(6IfbybpC)rJ5oTejIo&LW&bpx_ zXCfWLmf-t1?rQIzzi4G2d$OQ{ZEq>ZLtx3OL{9KxcQ8#$aUpPb;V?Zy_O{4bIpq*~ z@$4sBzP&>A7cbL;#1PndEnFe6U@$IIqb3@PTWBf;^F)k=Tjya`YXRJ8YNwS(xHBWO zrYtCf1>XrZlw-!)r!w22d@9(-ZiKRp)4%rNr9bS$rQBT#EnhGBl)nYi@A-43K@eSp zwWBIeNb@*e3K} z4hk#IkXA{o#898DV+~TUYWnPaQ{8hOemfdioeGoGddZo2BlG5xMyH$CikAl`5HCMt z{>2~tyL9YIYe=Z(^s-OktTf=;B3Se+@onN1$so!w3}!mG)2Mh;34+ge7lJ={A6gLU zQHw&r2+6UtItf;&MTw~}JE3k>m zxmgd4xDmb*(ln13qD`yCppq67CSTS=SW1PNz-GAXatQEUs>CTd&eeGb^9?73>DG*k2yoDwYMxw;L!4| z_=21yw<+z;W1l#sq`vj$+j4`-b5&2-p0H&de6169CL-;+b-dTGwV{!}%E8hkPKGR` ziwGEh>#f$%@GPYdCfNdZ$CwnQOqU1r>-Nmr*(pGZx&g$ijOW?_sS;mC{Z2h zKXcJg-yb5r`)VyRQ_b;O*-prmlDq!26eGEa@|))Lg=rSq{%EyrX9jKD~28@W6ZXUg`1@I<#PdvYozyW3)vpld_6z)PrK zZT2rcP7O`fYLI4C>gm0~ov0rCw_O8a-s6!a>$)f4m1iOOY@=L7%)107zNvC@-I z=0ESrF($@k6|~6;m_! zj`U8$=$fD(1*!S0U;MeAL6#Gj^v}?pPh#4n1FBQnvJ;JI3hQ1mWuo-`@4Ugj@g{lotJ z?@aH1lhXYE;hz%j7J+&Wv>%RBKYcC*D4)>6fquCbXf`-O+=47Z z=Im^VjVRcie-f;M98~W{A;Tr-#YV+2k}1eq#_q6!tc4qvriT}{CgrJSa}C**8cnH; z>}>(+ARBbnkWxU-Q8Qzn9C7o>pQbD(02kM&0(FJdhBWSp50%0?z8=|GD6t6+HAL0! z;!v=bUGXecG)EFILHfLhZv+jptX~TEJTcwM3W1+9!|uG25(*c7w5wU!`#k?uUWT9c z8hXzPRaeNBx4z0y3|a6peE2E*uSGiGx`Eoc&lA;)`EQ@O*AwJ#paZjkw>yYf4G(na za%s<$W)w0)Rc>O$1oFo_KOK&Fn{UD|!MmI)*5>Anojjj954)oz*qIUQm1SYQvKNy_1L%Q&fgU zEv)e5%ARK$$`Au1v-x^F5Rb!w{_Ldmu8M1QCWE31^Kp(dKojaHTWBLzb%0MVp{-iSmCF;-dBG*pi%E;L?&jL$#F>FxrD2M@0E7=v3xj=ko zYSX2i3F3SxTafay^;zDi2;x}yPh!V4G^jpBf7Wr9!#O`tbVd+&Aj*zCKgJl`VdT?5 za|=p-uty+jy$&6o3*TqTvbP!fejPyfooUnm;w=uACDr?5r{G0FCJtgJm0RBrYulu& zDPP)KbN-k)XfYS3rR?S4421o1$Cx0i4K)yV08i6p2{I@Em_QK=>0TKYVDf?QZBEm| zd6aDa4;=!3=S#NpoURAsqxJGl(~6&5+Rewi>zAD0y7k9BFU%9;mG93NPkoTJ)$2R( zVSi)2K0hHP`~s*S>wCjGQJ}Yk)%y@$Vk!nMF}oz%kO@;n?{@u&6ehhzR3@W}MVzKI z_Kep6ojZ}!9=~dcWCv2%Bxa9R zn59XHwb_ffNc(wXC}0lGl>V!h-SAd|^||X@)3r=md5}SQPsy@oofb~|QBLQ%e(fUv z2LeE?zcr&m#$}#C=Yv?N^N2*sQgS72nfr2mU)50%|NO!S6bqBw*7Jdud6!uxU@@!Y zuoIRoD6tk5*R9@TLbV7`IJ^J}BGhe>f_OOA_cP_|UPNx`0%d{Fy*9rU4lio-7^fzp zHwN7;$ZrD|pQ|~Pm1`^HhSdGsfO0l_;}l6w*4r z@Ae2L*i6>jLah!G_11fMDnt_6xW$#I5fFaFzX zQHUgdGg#Sh+8-iO2h|_wa|JAHCR47rbb3%+frDk42>BH@n$_Qo9T+2=bi-395YX;D=1Heq3 zhdHG!pTlrXL0G_L;kiiEyH2u`w$=kEQIkORN$h!}=Jd5UcPY+nhFYAMY{A~x>Xis~ zs^M-Bu^zca7CCl|O;3oT8TNepb#ZEDBJqB&tixR2PT0LJKAKXLYKV7cz^93QxxC?X z8Y!1mzy00!U1@qmz4ktD>}){s6IIw`Tz`3HuEd+r!wwCIwt_+g+Lb$Z-avisokxfn z^6+_>-lZ*UFXvlEPV_3*QGtH`w`byV{R+Ra*Tnqkd{p_IvpOh0&w|GW-Q)bmKx>Ah zsOP4!DdiDoun)LeQ;Gt$l~%q4tAhCc-=v{9x7KNbdxETsiLrq$CLF>c+|7BM1`Wwg zlwA+}7SI_BYY%~21MmjN@s83ckBl|`gID`r^NIr?qZIh}44`2X(Lw}CwyL^{lM3H& z#)M#ZwUC9O4~F(AKL|Shne3rrkXAzAqXHxXJ6Z@W-L~ao%l)9EJ>)fcp(ywD73P?XN zT@G_`PH%ci9K?0G1PBQt_leT(u#^{i&?k-bo;pFS*S;{Z=7+k0?w zfVA6I#lu>w8TStEvS$xJav;_P{*(JWsCxHDzsS~?J_4e60Jglya)|Gx~Y^_x}x4pyBB~NI$X#{{ow%&TmQ|i<-r)3U?JT96pEM_pG=6}zXWhscI?#qaQC+U|t?f=C3#X0Y& z5f#0Z==&J<3ZSreSIoN;@iV0eF0nch?@OW!y<7wJ86x)v07V%R7Wl^20HTM0=17duz~lMD6cUt1Ak-UZ4Zr6{{jig zbBMzYYLp}gm#od`gPeXU8nd9939L`|%p>cb{J?wlcR6Ci2IF;F4LB0@Urt5vQwdgp z-4tXf5S=UwMJEDqZyG4CQKA#ewh-JQwOh7$OC@#gJr1a0d{O&mgmU=zaQ#1j8og)0 z5@a*@qhohB8YLeCHw;k&s@uSoj!tQxn^H-njjjM3Z1Vl*?tQJr{!DU%irlJrnGG^! z#fK}HZ@qw@lZ*c2Knfp~qyjVY;_z>f;etz($F6h7E1Ii#D{}ciD&f-I;|DXw`qE!ME&|Us(ApzDz>Y|^#U(Tq8gT0)GN*a>8NUO2l3MkMHkV9Ka@Pq! zo!=)(V~z&7TGwBxF*cwP3u(_yf*>&hA>#S-A zT0<6we#Lp7_WT81egL~G;k>J=IB$oQ84|+F0BDP@VWT{qbUIgt$MMzX=X~iL8hB^n z?L`3R&sD@X4oC0;&;}Fz&7g1(I43@SLU)aicN=-_F)U1+YEQWSrF7>WPc~tBB>Y2y z`_`Os&cc-gup03Hs^iiuTTAh{?SRN4mJ8St@b7`K$KeE#Gmv8*mEj{IZiViNN?P?= zr;^*pJ9+aWVsQcfsS*Zei8Z?>IY$6)J$wW#Vlam%*f{~Kz2fT)&PQN*5KD>fl9tCt zlp_;M$UXHnCsCx?nJke7Ba$j)V8EOrEr%uW?*7;{M7eoNvVC}@Ze!6}OI!~zuQfJS zfOUvb_FmYK)H?=G#BnQ!+1;RP_k@`lF72Tovako(dfoB2o>FkDHI8htXPV4kqeKu*Db90<^_u+&-%N0jGk)KMX5MM~}n$U=nky_BfG|gpWxuDmNK*cL8aX*&H5CuE4 zM=ZZ`&i&p?GO5e*EByhuSN>T@wHt2Tv@Q!{hB$;j_P8E^W-D&SGsoP=7Y8mUcyFNg zUZR#=8Ia~e?!U^$spAYVs>nXK-(8@pPsh~jvvmsN>@}?uXWUTCP z3|f=s0Ah#|m9)8!*?>0gN~AroB}M(4>bWN1_yiy5NNwsaG~k&K=)mx;Gc%t0Om`Pr zD{W3d$Rk0-XS>DSOb|)ZjZEl%aTSJX=j7^y9V`vaAM{UHAXgw#1!Y)|j(gF0g6|Ag zZCCk{O=9hNUSfH-n+9$LIvp@ts>d%Ew3)XgsZG|N{#|+eZ%HUV{Pe_Lmqp!~6pVJB zm%|SlbOK=QK#vg+M>N?>}e1#$}k zRG@QHk1F2=)gMbv9c;G5k}!#=K`X(DS#Tsiby1kLz8)&Noe7!(8Vy7ELe#mmnF@Kd?QnrL*hi&8Trm}M}*#9 zIq}EQ=QiBu8N5-%ZBH5J@qE*Iuawmu<`n?2Q6IZA2!2WGV2qfPGcpzwQpBc~Ew*@`gg$73=z1xaTb!MJrxt8FWK{iR2TrDw{;VBNO zmUyp+aQ?#k(}FKih>05xI$(MG!(uFg-yc^}UqyZWir)-0;{lXgLY(`f126qxtMA>J zY;ow2*dE}(7C)Gb%mPvZr8)L;<+@0(!i4SCxT0@A+reTFa(K4aM3d1edkB2*q~~B4 zec$>G^ZlcsXiz2qe~O?hfRZ4FWoZ7I<9yjl{@?J(k)`R6PQ)vbb|Q%2Aa4L{FR;iz ziGPAId(+#+AN`rM`>bi59khUtf1_C7f!-mg4BRY1pF7L@^~o0;}^bpAhmh@pg^$oexA2I)2AQ;MSREohcRnXhT7pg zW9OG8$=gLCH*+AkYE5VG1J^7g%ooyj?78$cEM|#1Cmvun2u>B^w-1Bu zm6838&HjWAd+8m($w5PT%;d5s6c!hwQ9A%TfFm#jYj&xhwew}^F*L!DhLadP-#7<`C_w1ZF@xW?JcKO+^ZHGMh5X|sUCz+}>d4OYBK&Yu5YR#BpT44HH12x~G`mMbJ zprUf%y4Y8Xe3v z4XF)Au`Og@uAQ7 zL#`E2LNA#&@lTdm*2PR6p>B~-aDSXsmq(wFxa5Ld=GMF}U=gn9DO{*j32u(v&l1Tv zT;59cvLZn|Me2-cSQ$pvj221gH4H6E-z?)WU#ulc(UvhyzGW0T4&rXnzYhu7K&?o= zZi#89Q2=%q5WSU!YpPmo%nfjy1|+Yvzmpf?$b``k^0SvbTd)8hFwif>Xz9|3;<#xjooZ-F=SPa%pPBmq&$sFSg@lE>j9Pk0>26mn_Zj9Y331@Nt>9) zwD-cIvbdliPDrPh3%Nzy?Od;RQcOk6D`>GR#JhLdC$lTEA0N+C<3&Fw`Bq(I@WU=} zWUdp2>2mh(s%@ESFTSGNun`_B&6H9Tx^Y`s*vFt#!Ax+n$nWC6-cDq~0E3E690Z&S z;hRF(cw&6yf3`vnA0b>+ntpj>-SM{$AYpb<(cgG9fhm~dR+=68_Gis%B67HAh%M$+ zp(U&Kx10=F2i=9fv65^`i`CUS3y)aCvk!7avsXr3s*kqR7FIpKP}{55YN+Q7?jmKT z*MX^ogcyanC{>@<*mb{^=6r!*anmZYTfI*RYm(sQ+%uBjghB*^1^t5$C;9LG_;5$^ z$)U%=!KIFR%x-;b=VT9`yqx^9PW||jh4`Hs_c@Yk+Ld7HlFvGqH_Drf6|WifleKlm z8%OH3mIZ|l&gZhrfl7-{0bGvxze%h6rC{@H6P@T5<~=;obg@CaDXifZnBA`Bdtk7N zW4*WB60Tj4!%r~7b$8hOq3&Rp;La~s)EV>?9R?Lcx#Np|65*O2zC*6r8pE^v6Y<4M zyN(#`Wgq7Vy`mvZEk8paLGQU!09wr{D4cKB@&tgx%N241$NVn?DD-%FVPVQGzPS<; z{k9aPPzTYkSg8YS2Qd;^VJzakV$AVU3iGax3l<)|vxSKw)pbmH&X)&e?;ey_8Db{v zd8S#_x_~RfZ_&ZCNW0DwbP8XI*#;kn60P5oQt|$){*QpTmVS=;kK!-HCia4XKky@T zZC2b~2=91#@(C39va-|)8`zE{)Z}e&rm0*orGn3DeR2Zg#VyZ|WwR^38^Y|e%Hdy& zJQfRW)r6q{vyt)UagIdJF}@}0%V7Rwve@fLzqjaz2JyAILJIF=X%DlfuTK>6mM-GV z=Xi)_F&f3Dl8D)|9W`bgZ3)9(0$DZ(uI)A2YDulFH zxi4@=X5pzwN%}BYkMj7qmKHmQdWQY4 z%y%_`wFS!lExO3;?yzTDZE!#!=de%Z{>X?=_uF1SMVS2&^s>9EZlld+7mDxac_5Q!G72zPp>vT z%1vRCx=Ep8!(4jU=G=#|oCBA$I_;@K*_*2SA>^3!`3x+sIY z3>d%XuhLb)fPP)D8vbU7MPpU57hhre^S`wKE!s3_ST69+fod1IE|jd9MZ}uqNBBOFJ0K>gJX=EpKvDwDtwd-0dB)rF!Fq&`mQLI-!F@RRo6| z^0;Dv@sA88(2%n+?KES?FAa^AC{^HbC6d&NQ|qb$UX zy_3373!~OB&^P4WKEI!O!S%8kXZt!u-wiAxQqAJ*RdLH76@A;ybW97B?c*#(b_|ah zbotcWF;UL(5)_w{abkUZwN+q;K__8uJ?{LHrH+r!_1v5_*V&nNokdCKlYOqlFTX>J zX|t#Mu9k`a$0hbO0=xfQof+RVEH?G?jccDEd|sGFyxOU0qseA1_d>e$uhgf*&sTBY zq0hFr&F_A$r4U&_-K(=?`xzY_XVf?DA>~>Y``pskH3gP`ok7M3UQ-h< zWAQ!0H*t9DmJ}k0=BD>NH~rg4S_t(UH+Mh+d9hrXF!q`kZj*6K%&qd4v(-~j86FrB zXW2tXCsK($gnxW*W}^BX9e{OvLUe7#nj#xcPj^P?5~ROd-=5~5I6dP;mkQr_tal$| zl{Eu<*rcY-aO9P5wvom4W5Fn%FQ2EgQfl`7P@#|A*I}w$;dw4?>>FdF!bx3UYEwj9 z)%L7MPBYi6is$HQA(gL0ZTk2maFu=RavOV1g~sWo#!v7*hsn$Aar#{A+~%VE(l`J& zdLbl9%6j24jJKAQq31r&xh=Bd{}i%EeFBWvvJof~A|&Gh%-71?8;2l91=ZNI5MpCX zA%2^_kIlhOWil9Vg+W|G_9<+=FHiKHwklBQF#ggzbh{S%D-U*n*M-9xeoIKWs8!)m z_d#MKzIb$gjYO-Uk+XI7qIb+;eVAuKmHss^_&U)~S2l12rd?=AzNx*RN(FDU#gg}U zjzz!g*E=hTcM_n|AdqAVmrIsGj-c}MPjQdHNlZO%0S;@f;>FLkolEs@5O4%@K3=!M zf6mcOsL;#5mx$eH6bPnG4!pu(a>`g7pDHJAE_0tCuOlB|OPb_lA2frLS$EC=p?Iy1z$<=_7LwqA&F;5}&rqHlj2XiOfe8*d zS<|RUB;l^LmRc^rY(Z)Cv_&5|4WZIQOod5oKf4sekz4doALZzuJ$%R&?$EB34nGul zLRh8#)d3H6@$ZYHWKUX8InAHuQF+FSq)Qy%7i>AOd;)n0M)(W(V7(jL4qIB9nw`zx^eVwEs$yCk{jxy_ z%9ps0S|Qoxmnq^#@7=#jN{_@Oz4DEtP||Ic#QV&#F-u`;qg}JLQcWvIKJ(zUI$Ogk z!V=KbA7Zm8m0yDU=fk4|a{6|Ho0bL=pt@#5!NH8iu^jOxo|)4%z?O%=Z%0i~g!C=m z*g?;-x_&tYsp4jNEcp(~$%=k&>NJZq8E)u2`LT~K91gA+l;?ny@bX3R4z=kwd6PW8 zl!FkDUMEgVesA9v-YOl!ahIWdgC&4lfl<=>-69vxFAVa?{PU|77xi{RQDz2X5ki=} zv?Pd%5Ter}-aR{W3yQ((Hq(>0Tu7b`3{h_}tj&)dLLCx9>t5!G2>YF$;-#qOCay_N z%_ZJVaP0DF@2`2Ag9L|*%5Y6@H_cT=t(UKiki3MS<|2)kz{zuqlSp9>CJ8v+q`(Lc z5S?Hr&afHk7JrEF)rSV@I=DvKemgTh&5BJJsMRJ}Vjv8rbN}Ce{J(?nf3gy8?(@_% zq&#^yybK4WQ}y)X%w`|wFur*qF)*BLQb@C}AE;-z>O3##+z`^9z^f9)@@FD42B8 zR{b$I;ZVexMQD!<2U=VhBsBoQb8<-Ife@r>aMzP1AwV0=@TgG)h`+MCNqrl+03z=IP$ zw6H#jbQgezKYy+*PL~e<*=#4q|4Cd25~tM9OxAVE8y}PK}~$k^F*NjBk{z z1^6oFGUT%p=WuIqOU9Ir8-_iEB=5CIZQj3AL?G*IF8b4gC4FpC?H3)n5!-f&w<0oU z7?ILSOlF72`QC;6WxvH~PE;IlGFC;Tl(MW3YYfoWoV~R6$hej~vXF>$6J^P>QLl4p z!xH$SM%ci~=Q_~+T1vn0K8^fNi`)6Jyp@(h=g93)SKtfA#r#voP2-rKUeBg>r>QkJ zT=rO7o~*kvn8{F^cfy{T5PLwBvm*DNLKy$)40;od#oE`ke)YX8yk(G}9Ht(;E}I<; zpj3Tcz%9~$d+eojSi$=AagApcpZ9o5dpt4Iy}5l3PjO4Eoz7%Xvr~TKt;jh?wsIu% zaQNl1rxlPhjq(!mT@{-!v1OIE4n$h4K55&zmYe=C+6KGOOD*FPtQ&KZESkHgM>PWJ{y+IzHhz(5k_n+FWTRrF68>=(q`iyHw~b z@2iK47}v%{>ZBG?8?2=oIGFIFfeizan<}vBVy%^)(yj|1hH91x z3ow=^jq?~_C4@Rj+|KmcmU>lFZMNG2Ye{n+4xRF4)Xm22bff5px-gvG?DLi{qP#Z4 zh+FdVNlR*MWe#+mf$L_^E1rPd!(u+OPOo5%VY03@ZCJivL^^U{JnP{}D$~HFJL>y1 z&cVvJvYne*_Kpp}mGA5vgyX`m+m-JQy?h?-=1{k@mhizejO>QIR59}D(#LMM<&-T} zE6U$F7+QaAInWX$hlO(xeK%WLV4)Q_l4!`@X1rFS69p(VHp`Iv>7|?g#2Kf)lJ-Z= zE~laFa~U^ezWyoWQ}i+R(fijn>4+WNE~!-egyfaIdJW;x!9rUB7tl~0D;06RiX6GP ziM_k%bxJZG_@^ST@x;Z#F?(af>VUaINeaj-5!k5hQa3Opyo2IwQ2wbehCEKuJ4t)l zmCvjDID)X0n$RcYZ|eE_RrcMzc**2hu*QjNxs$s#kBr~`oN^-j);&G0hB_g>xs_R7 zXkO|&c;_6|H}>6vQd`<-W~+25|1*eIkq`6eU5RI7rc?eIZ~sW|HW%#`>(6(+PCL=1 zi##afxwNGBQP$Xb)q7>+x%{xLqw%q;@pe<9hlvG=G1eWgJDM%w{g`vQVbb?AzX`7V zeo$T0IM{R;&7z#M7Tf7CzqTz!2g41i4v7#qxw)f z$SVrb#Efj$8#BSEf2>_B2p!;DHBbgz7v*lj)_+=4O2=Hr4m(!|?}14RIFJ;>4e~ z#3fvn5@Cu48Kt=swu>{1v!|U9h7&}lFy`MnxCwS7MM$8^5zteU))d%zxBTB-H4f%T z%W8^$u_LugP8v7l(_SiU;Egez5?nq1J}GP2NIMo&gm}+dzi+DL49`t+c#iG2*mtg@ z?+cn0K)a5teIBuX)i&M|b-XpHCZo2ZmjFn6PJkf=#aBE4f zzP*)j-m5XunYdayP+qbLed8;0Bdy^U5N982iL`;iK5?27cs-Nc*{)|`Q$32mY*h%U?57Etb$se3+!X&BJ5#z^yaucNc#CnYtO7S& zneIcmG8X53aeJz}o*Rx?9ggrsWKZOtEAlX(T=M?8(mCIU(0fU~)oUfXaT(Uii~fg0 zqovQcFUZ3Es(!r(h(C?6|X))%IRVInko@*L2#$e!wpMEGcnp_@s!JgQ_U2$*;bxUOq3ipcw8H z=kxopXwud6u2w#;r6Wo2T8Uw<&s^n=kh4yMmB{gIMqWY?49^0xfclW| z$tN(iCQ%d;fb}WQ^8OARoq|c-ez;luU6T6=dMypQ=SX?iy0M3Cs>YGVwT?*EOme1ti_vtyu6^elodOcgu1h45i;=|x5A365dUjlir z#&nSg9x(?{?V=zG$EqWeh{DM`kHs3-_UpAydzPZQYr~D9y0r_(|4^6+s=Z5G?VVYd zFBv|;b4c2ve5fa=<<>`ON`F8?5B`!#t?9H924zRyDLy`8p6T^a-fqb+aANir=>fU1 zWxoW)`S#Xn;z;Ylx}s7;2Y$zF;@@lz&>Qy=joQzJTz{M!o}#)?9HOf`8;vzV^w_Xsys?}}{5_-7~9md8!t z${SuMEh^SL!FYr6Y_odj?&QgCXZSG*J!|AJb&!}Kzr_T%vnuOuU9jo*?KmvI@_ucl zX|XW)-s^11#)M8r~*0@ZGIjY)X`$_=L9T z*Kt-%RPcZ!AO$UsyC%MStC!F1Z&e)iq=&Eut_$pxS*2 zSsg%ejAo>Ze#btnQk(mhXW7&_?&F^@B;`m_TZ<}9plcT=?jy;o63llgV3nLTFv*^% zN!{5w^QrWhBuf}dmK>!HNEDj?OceUcIo=!FvEz1qJ|h7>lDWe92Z{Uqd}x@;szxwr z#{@4d#Q3D+z3%?rkQilreLkhP4h(VT@D>8>@SYSBGvC>>L1R9ji^Z-LitI8 zxiQCzITad4hZWV(-sxw_NNgN-5j}U6uGR&a7d!5;>*^B-!XAe9jJ4jl@L z>S6N+JjEdOrWlc#L*5cuDlMAp^a7Vw3f-=kVU%+U)-)j=ee4=n&*J~?hSn(b0(@0& z4btkw!bY&=&jQKVAup2<)W$txJH4pTNJ2TOxAXnONvJu}pYj;Z+A2wOW|rP>vF!Hzk%xmjn^T|;YK(hr zpIe``Fer>P2harwf?^L=iS%@pPL9(?`J5Wz| zDupFWjVt=0-(6@vr`rgZ?HHbKKk9eBY>I#4(^|ZDW|G@jBXT$>u3|yIJpJJ48#TrS z5^eF5efYWMTN!&GMx=7ok3GC~!*|=Hfi<$PU>)-=qt0%Ckmwf)LKl$mJw`lroS&<_ zuWMS-ErAS4>4jFI?bn(~rk8<$+wv~Uxh9AxXpW6MAKQ)*S~>iy@M={iU^93>TiyLI zBrZjeS>Jx)@(fEBHM-CL6gD&Wr4V&{-X$RuU$6{}1RW|dL~k4>^6g=lRAyjHbQodL zHQ2mj3;oWjT4N0iJ-wD?UEa#&dauO0E5F;!dyM2UVIi$XNvJPK0~^_>HXS>eXP122 z*eA^%nz)Ot@Dzms5`j#ZI{|u0q<{q0ftBGap{dku>lsj~-x>{aHrZO?WG!*WU~JU} zp>Jz@Zl04!PZI-d`WLUt4-`}Bu%DnR?_98h)?6(IVJklux#%?c-p@90YfotLe`Pek zN23~P8&BL#acZ~}!tMh1LN-Rlhvd#}pQjD20;FMpQ$kr7cvZt`PC>(hokEW< zLX(YbMyz1PilkNmOcJ^){-M>{)zht8|AlF!J?Q*24GWG& z_zbb6g}h?2AE;oUHuiQ&i-$-a%6KrXMh;6)Nu^9Z$j5c%khsfQAAWwX{!__wxvu3( zU18P5Z?{BmcOr1c?(4PSBhB$$Wn8mH@hb}Z%}T;aa0Fhf{A!-I`>lCcC@Zl@Ezo`n zbF|9hy6P`cYE{ed_dKeEkx(vTYuE1k= zPvP`(3H0**mbWK%DIg@bt8q4#L>j9im>dDRh^tI>;SKY{Z`}qbyIs2uPuPOyVtcML zqI&>*Twc}Etg8Ixn#`+YxRe0>G(PVvdVr=2$mFIXgq&Jb=)MiCeqSN|X&HIB}KoZnl)*xIVNu!X|xE zbmX*P&%Dq&r91Q$z-a*Vs$g4?~|<{nDI7<1Gk+6#U;i zCAmEbk*Rb{s6d1wU2Db2{DEEsK_lD}Bkyg@Hkse)Us zG~WyY8e<*^ax$&w`B;)UWHnc=(!+!w^Rqdy^@>N^b!(>wSo}*{wvG_q#-OMJxa5I{ z;s?4><>KZJq+@P=-8teDsWTH9pgp>k_s!S{ktk>}#%HVc<2vJB9_M``XPo}l0zAJ*l@TTLO#uH4^cEsSLi@K8YBa|^kBhgo zpSJgg-(Frhf-oM?k9kPqK7aBmQQF)hbfDYP23y9l_N)ew+BlS)PR3{+9Hzm zN=Mg6yPdu2w*qD{_@MTT%yZyP9OA|HzKt>TXd>%Wh2qQls09ndqJHL%wm1y2CI3p--E>A86G0-DGj^}c9rZEZx1>l zpm-JrN}(UW?i{I)9$f+51WZv!ds&DU+2e6Si2YH}`+Pb$44dc1mynIVv^1y*bMD=@ zi^gurg&9HZ08#-Roa?&in(T_Q}4H z0|+wJVHE2cX~!IZ=xz>&GJM=N->&meG>cqa2HS@$Xw9u_dTk*&soA2T``J3WWa0Vw zg{$WrR@2%Y*fB-hZj`D%ugVOB4iR#739g2vO58_uy7Ch)!Sd>a8j#Q~xMQ?F+=g`T z%M(_eA`=uy_5sXd8vX(UKEAbBEGAwhJjlQ)mr#?5s(v5eE!bq_DBgsTJDD1N+! z8wd(VLo*2y9mb6%ZEHezDAHA*aL1U?W@kB@Mx5FbiLq@U8wim@_8t`Syu)+eO+brp z)bqVU+km&D^U{@5%Les;;pp@UG|Gnrg;J|-e5;YPQk$jNg~Em9{cZ0$#Lfewb})Zf zjBskq$^?2z#qZF_tvG5|ekVm;sFkzv4oWfVG8t4-|EbGeAzKDG zKh6(%2ECnh9;`ko%4MBAtF<#&zP9eku#aixj`)WrlTN$?Bpxx8xU<*C0{`?KxYlY5 zcYlm3Q&g<>!vr9)^g}fl!##fIb;G{0UV96mB1}vx_OY;gK_zpZUYAqX(1UNCbRt`< z15f4%;TB8{&v$ow1Eh0e)?37LlGOGsrk9uV#584vSL$M*{rB#`K;=R2s4!nJF+**J zuE*@=`km4rpjCH8-8!JTgj0rE`{HDw6{B8n7fzYqif5R=Ab6>3YCxGs2jeHANzWea zFHd&8>nl-#l{1ZY?AwcfOf5v`r|jw$dsg`A(>RFM=4#+LyiK# zVOJVEm|_^YrD%We>$BW*2hzi{nBJ77LI_I#nJK0P*FSwY0CtrxzXgR$(wTaTm@{Xm zBF+}e%OU2sTe`bj(klu^>iA)$m0=viR&6jz0(^u*;%QGH2>nJB$j&fws;HrZYe!tN zY43J~FYBbY)4pxy+7C6wbW&hs-cDq7GgF(z)_I14t%6LSut{Cb{=E9+7jQen%~e$q z{Txvb0<*S?)2?0^7&xk#vrspZ)w2<0ub zuYe^gd^2zqpWGGsg*)0TyRoXi6@TPs**!o`g99I3?4Yn)?4QH^Cq5 z2Ov6-4S=khxMWT&(>&{89En~<1!Xb;t_IlK&@9V7Yuxq#0URAv+$+dI<%tI6x1qMf z^hNO6mGKl9ef2k#4YB2rC+i36Z#+r42BkLyDc7tJfNI_ls}*H=87><`E(aJIPu_^S z$3M0&+#71|bZRtIS8V%cmBCV_PZV!NZH4aq;Qy%De5DNmLcjo`=ng9u*jlCL|*HZrJJ zgk$bz7z?(_Y?yOcnCn|p^f@||wGSBnn~yCnKW(`R)nFg9R++JoOwz;qGVDf2rCeUO@7I=C4i zqB!v^K*VO5q8|^4(4Q8++z(;Pk5R$=l%~~s3m_TXS2a5-3K$ZU&CeR&I|GR4Ah0^1 zup~2T9ULKG;QBUD|JtL)j6A64--ohzbpD#^T1NB(^vW}Pgdqao2X*M9a1!vrwzISR z*#Bln1SEMmX50nc%83QB1x76@*ejNc}0N`MdiNvwrj*H4-#q-m)`pPNiN`N;;XNn6u32P6I>u; zP7{Fo_bDyb+Ysn?629Xze=%PTqx%#d8*OVjpVJ6ECv@cLt4h+8NwvvV_HWaMh^L3xF zf#>j#u>>j>kG|7(sCM2Oyghmo=m7KXuyi$-kbg8Iw8#f&r3G%CNbMaU*svv#`~?#> zZe!A|7|y2~9Rwo~__Vm&r~)ViK%`+v&9qSI^b#pR38BtGU0HcH905%E3(~s-YOg(f zJyX*HmO`_|5$a7;eQeji*)mM+1R# z1@3NmCzo)RwidY2;6kEKU8DNG#bO*3TJ6tvm#pg%2hG7!Pk|)8+%p`5v90hUx8XvfIr;$@I1caSVxhRIuK+2L#$r zU$vHqDOuVCj};i0lhrnO#|CgGD2)z$`EapH*7VNTdR@CCLevNhsbB$0$lyeX(_lyO z;Nc&xt7Ujf0ZHrn4&aUbsQ@Fp4))K7)gCd$|F%s^hxCU2gw)AqN#JB;trcox_&`@aKXkFg)(p6K$KGfz7j~E6U z(v{yT23(OF@Dh|Pke5IZ5t5NX$x{4p5B05t@jUe9p`=Ns8({OGIMYwKyk>v5#BqV5 z>9i;CJ*H^$t}v||Ajd!#LY0pfFVi-{KdQij zjody^OF@Pt|5*_yc0b0%I%joe3F6V!(%fo|Bu~Hu~v#55`HG>JF(8QjE0Z9vIpIsLZV}%Quj7 zpxW&aEcq)$1<({B!$IkCxUU&R{~JdC^E!k231Pv*8S~24 z_Mi?xX_4Md%cIF_`z8)^l42^b|V?~r9A-zunqU7ijhfe)5W~2GC=a<5RLgo$KZql?{=X3{V3~j zq#@cR!@0Mp_`t&&6J*D$FaP>HL@V~W3F603s*2r=x7oi{!ukC!ytEaA8}UlMNA?~w z-2EI_c|gr-Y+bqNjsc0rzuGOFg(M8p6M2;m(Yjj9E;k(*5c^hP-K^Vf zDJEcVHsGxM4{qN6wDneqHG`)HJKCYTUFqYynI^IQU2ScV=OKBLUUk3mfV@^*0vp6i zZ_p{d2iO2)n9xlIXD}swT>z7E+(Z+AwH>6!7xVd%udE6eXOkuvaAfcn=(w9-x5&?v=jvYt;!g+GZ>+-F8Vt@`!+VE0cu;e3jwd% z%S+>7J~K41k(t+`BAA{>m#HC@1gVCV5tzpH5Ma*TUnD4Z@DI>VUJ{dmg@x}YoPhBK zlh_;1#o=EU8p$30Q4%m&S}V?N$wz%F#4UfW{JL`0jKq4|1FKRYFq;MRHEgKj?ev zlhE>Y`jNZJAK_bC4l=)Z?4hhQOLUwNYnSK@Y8NqW4#_A10v;lEJ%*wI&r({u(^jrG zkeff?LK+OE1P($|!_6sYF)31ps=~8X+4biVaALvhSrQIP{)TZo*bd2jVxE!9PKAc6 zIX4862MhqZNnivzv!WZ%?c1jn-5k7Dam%Lfd$3FU;E>**>39I0D^;V0F00HxpE>hZ zoOA;&SG#b@mEGR}o7!F@-3kyGbOY=zf41qY4FAD4u622G%2IuBw9z;R`RjW;MbZ)E3hAUA z8Of@CMJ+kYdlu+ZyqmhREiOVU)h}q8N(Mm!`lKR|enFw8ur~l*d-Ya?Zf<$-fGU1B zPR{@7E^X^~Kb};jqz>3dsGmsKOL2VwAn(M z?vw3rw_KB%vL0HXtn>kn58CqZ>7)vYG3sy)6HW#iv-Vp`;beIW+Kvog{ z=75k^pIO;;QGAaI$i}`lZe*{+g%Il3CZka!-70HKNn0l9I@WZx#skmQ!D+|}+K~_d z<{iJzZ9(#iBGI;VjpJ~p*iobybTxc_MkGYeW;}cvOi4kPyV{f(G}EmbkMLBppEZs) ziqX_Z<_$!abtSK?))sWnNLbBvCV9n-gmz^Sx<^8_6YSS@t1>IO&wn>Le{aX$jhmRF zv*9k!3oXtRtbZOo{R$-TJw+c7E9vut2x8?flVTaMii7pO*|o=qf#5X9_%UlGpa9N* zfQr}Fl?HUihUsbm1NL+Ly zEuazkVln%V(WTp=SXNgESpeYQQ4=I1X~)R>i#f$uoA{16=IQoU}$Ze z1C$B?ccYuvhqpz=nLZD-6qFB;Q!V?izmKom40nL+v&Ut~3aWZg)KNwsX@$emS6%lD z5(^)$5Rh>-XUPS89|G1?{37%OJNa5X*De>Km&@5??Dq~ne%!}x;J|71AIc{AQJ}K> zt-A^BL?{kGQx+)Xbi?3$KGNO`MMr4aop#KqX4+a-{%^q1Z+8BWkhxFkt2>=Oj%Tkb zeQm?_)p%E;yiNIt3U}yz(5ll0MJ&*Z1Gr+SX|=L)-D_w|N8rsX1#W(I@mHRNYy#Nr zD83<(j~Rpx+}m}>#b>1qHxDvWk-aPO6Syr_7t&AWb}WDZ^FH|2?Amf4@H8GW?h?8^ z!R0ITh*lpI1T+pyvj|kr-*d)25NR`lbC^V)qc&FCX&kT;EU)NMSNX zU&9-*c3L|%N{Oz^m!WK7^wh)a@TnXqzd>(UHiiK(AT(nmwbn$!#y3JuvsBjML&X6t zAOL=J5~5HgHaqdqTdijpxZL*$xS7x}+MrviwLZoQ@dMPQWy+lr338fGCM_yJR3S85 zOj!T3k?1^YN;{A!z*{q1OFDadAb2Bp0Ke?HHK1x6qnU8k*!j=c!;r{OPu63 znPg`El6~z80_gp%bpjb95Ji$0%j|OA{lWavW?6scn}E?InuPSfeRLA?+(WZ-?eV~% z+8*Cb`Kb-^WLPbIdEE~{l}s^r56bOeJs*_gI|6W6<&P^jEsTHwRpSXEA;yTH3xddz7p-Ll&qk^K%l#v zu^BQ|u36)_V70tI9RHu2nPMy&m1<9^OACqf;g6j$a7I$dB5JTvuZNd1X;$W5{MTgT zTU$dm<+UR)hmpV@SVZmkSL*Bha{ked;!E+><@I31RU71qbNH zzSoujK6xIMy%TZ_C_ebUWE)SF>B?w7$#aS|aL)IoJ(UY`B_rr=0M6JTKr;L3Q4;j+ z(C`7f`x;m^Khz}OTqg7RxJ@(^Af%Ni_oyC_FH2MT-k_sO(akDfNA?43aec*te3uLatrP@>S=$otty8~gjUgu2; z43Xvnp8Ne@fH27m?u5+=-LCxu`}|?mNJazz5HP`p7J%U4(z|dO_$t2tf={q7c6Q<1 zJ&~au*raCQBF*ki`U$8fk@CuK@p;VbN#cn7y>~<+bHRbwEe%EaY7CvLms} zKqT{7_J1M11-Q2fkS^`?K{|(l?dT0nDz6~dh2D&n%l;IAV~{M-*Paj8QzPAA6Yj2V zxx7pD;x&!*)dC>OgOu_v>3(HfKQlcpDzb(&(EOEaeTppPh?6|wb>dXMjQgSk#KEH685T0Sy~Ag8oNTC~u8b9M4*p?_jnTNDDEPr&2+{<(5t$v(y9PDeO5=z4*I58-4AP6NwL@`3=BJ^^}ysx(-Djq^2-Dx-(p)=B-7Waz6!d z?e>?nAKng}J90(t&?MLW*%!O`jmG~Dll-);B5M>6#{v#7Tf~%9IS{N1h6e zNCziN#0^U)i9bEzef{176FR0Vv!--euyvHaIs4|W!ffNHvVMl%BxAEz<;|GQ1zIsB z5-tVkfGeMwJHh00XmOT3!7Hp|3XR(G!k=yFx1)R*O<3H8N-nbh5Dw*GM z$)O}5tagw(zQD1(X^nk7aLfGYoZ`FKZO9Ou$gIpgxY33+-6m6_R!yH-?FBaWnpi~z z1p%1*aSOElY}EHtTD5E!!KIO8#&x7rt&mmTEfMaxg49&4=!2>H(!}JlS5e z8=t}Nb>{sb)tt5@&wloVDpBF*bVY;o+XB5tG;&+HOJc#nEUkb-4aX^#1aJ3Bs@5kL zNvcU@4E3HbSM0+$U1fi|Ys+TG?f$LFjFbpBbkHdATFe_89cv3$gUvM~lPzdB)`-wF z5f}e)_&dL-bJ}n0Jev7&_h0SwaqMqEY1mcFSXQ8DE4;_>`NMM!nrntp=Z!?lZW;O# zDSi~-^IYd;e<4+CPk%vNi}#l?7O^l-!*-=}D(;stdm`!ej#t?3rBA5UXZYKE*B){c zEBo2o&mO$p#~LVnRpOD--J%gM(>3W+GpN>bAy#&AQH)&wW1P%6UE`Ca>{Z%giw(ZH zwkJV2;Z|9-GF--YEC_jH1XHB>61IigBCOH5D%s@D+5~4PsbGoDdKyirD;Oo{FK&2r za!92RY|>CRg4-*_i2tjY?xSW7ivqxp!On-N;w_Sk!_k$trDG}tE9vl7Og9G*uAiK z6-FHQS~98fIUW9#>(qwq(-mgnCwF0`SL!3XhYG`NP>EUnJ5H^S)ZC8IcK&>gmA|Wb z%3=EOUQ=wAfK!0lrSruDUboDb=J`LqkKqq!OR-ZQeSwM4yq1x5bFNrzf#_-6e(w?& zQI$?2yN*~ysuwE2Q}7=g)hS&&hKP5Wt2XO0w*_^kn6EskOi*)I+l*Fg?xT5Uw{X4H zUuhyWS?&q&Q9B>2s=tYE`4~}RU|2a&KWI5VI@dw9X%Uf@lc6V0Og|!o2oV(ECDs?` zu4q@#xe>9Qw{aK7MBJ1R63)5hvEuhUcJrvU2v(MRDqX4-N=%oA8390K7iS z!JE;?H$N`9bj zFkE=q4HPhcwPWFpZ-}HeZ5agq1PK$z^yZVKb9Vo-^Z3YSN785l>Gb9Z0c_&*!eeC) z^~>j6qbXt1xOi-gMX$_fLRrwz+{$VBf#59!_$7C_873yih8$Y#gCS80 z3JPm5F@toY(W0WWHnxB|dto7;qjx<66h{R2S!%?p!lbdwbvAN%Db7Zv&7yp5q-Kk+ z7Hqls)wRR?Iyv$j%Tdj=i-Q_UhH130V$Z5ck0`|m#%e}V(nJeh!I$Jn|D>cGJ^6Bn z(COt&)UoU}=d5*FAaYpGS0zRS@9ywx%e`QsVYi;`k1irCi%#d{4qvNW2)M+4JKEfN zWn>wbrl083HX|I+KRk1tJqV@fqN@EIMEjP+=Cj9-X$z(q$Iv>3mlrO5c&|C7j#<7? zkDB!C#spNj->8kw{_-LKgU<-MEnqPxOIlz=uQ?3&O9)Z#P=2np>Iy(VgEQ$2@D~CF z2YZ|X)5(q=ok#siNKyoRSfYhB66}5J0`Raw2~)djr#plW=r`a>3>G|2)VpDh%$bkS z%N_Ul+RVAlO>`Af5+#?Ov?P@~(o-f1=}=GW|3K12-lKn;DeT@`RK`Q{`=g8^~(}czO-5KAxzx34!!Nj2M$F zBhRmEfu@P5&BG&uEjI5SnwE>!Go<%=KGCiSlu(}OI#PJ^If1*Ky&?tU0A}yaKpsE2 zCWaCwVs$fUuou6SERBw7osy^qAG8;IkiT4jxA*&X7_Gtvjduq<$Tr-I(Oe_dL!|7; zxVA#j&F1KRZTk<4rGDrzR1E`*kt>!AT0kP=O|k10z4HcqGh(PQx4W-qR85so5=mfG z`QkB?>js5WAKSn_=z#^Ha;_z-^*%RppQ&C(=~rik-kGT@NU@k^!-ZM6n=L(&D3K$s z?Jnzt=xehy9guR(n5tU_&z&Lp=G zA-27A8uWI8B`m$%k1TIPN#l^jP+!kGr@aVb{bb|pTjRnY1uWujy$ZGLY?~VOg?+W{ zjy<96>%;o38wxvd^$?AH3a)d1uZzPoUE(-H2N zQtNWBXjE^29J90Ff9l_%MfR;6V3nKeK7{U)uS1t#08?zkT9#6lVy(lKV;peEWQf!% zRV&8lekl~rk4$&;E?K0as3~N|B2L3+e&kGB2?wh6%k8Wwc9FC4=DK@K2dBmF=?Xad z3a=Yb$JNf+ho~36BO=c_EN9ahFM{Y6d=fUVw>964!38$n5%e*MxNc4}V1yVOtJmCV z{j8>}`|=71xzCtbUFkW?ju2wYaba}aV-FE=N$K_J{7>;3L-R!ij8fl*`sz5T}kK7>ascF( z?OS+%*1|f3>3ilN(bDVZ(nz$_S15N%FaN{5vx#=OmX=)h(QW=(qff;VZ~x>O6+A=` zmfJ?d2Q)_v6@3n$H2g8uuSAD&4O~oksZ*~FHml0wUdtYws$t?_U)2?CY58q|;+t(n zU3hi)nA#0(g&|V@Jh;X~jyuMWVdgLS#gwOhi2XA6Ve$&tqqf-}Kw{!yu`BV(HxFCR zj9v#rw-lY#cwaE68T=uUw!#O2k_veD)z#l(m&JzpdS!nCC_h#%U?mj1dg`xi6MH`^ zW~Uj8*tCe&j^Zbm!L;c>?!`0Bv5L z)8tZ{j_fY>7b5B>Ra`lrB4AvkE8}8%as~ z^x%<7QX2I4kllGGA`(copc6Y%vl&E}#)cUf{9JWyt&J|o%ixV7Bi$+^|@%-c4^@b@=+l3t`SQ5yW zj|HQQUu3z?4fJx)U_D<3ETKcePsUY>)ps#*7NrHV6z$yU+h$Ql=QUBtf&(?D6%(|% zPDxeh^c+>+zdt&*`8rn8bx11*6|jY3tw~8_!DTw3{9as3gg+~v9hFlUf-ye7`5LZ3 z2cthdCa;XXdBQ?{fN3527;MhW_01Z&HxhP^X14M5Kc3(c`2}tSO!>elzL0D-kue-D z;uM9ePE0qp%~gq6(*nVjbeo7M-X#|js#|V)eu87f+qq!kvBdc@!$P$fuF^OnWi>v0 zLXS1f62dWcxlgC8+V2`%*d=;O`lk228HwJ3g^se(c-d}Td`C3baSmw4Zl95HTsNis z>LI29I;4-0{fs=gb)R^qP8p^a)lR(LkrRB*HGW1*Mli-S=GVdIQHgkVD>|Fjov2ey?}Yumaxjb{}X zaCbPwePG<1u|Cx1AENmYPSlo+YtbmMZX~2x(_|JsO;pq=@A^qpSKK?MJNDHWH{E@s zd0!mYcH&C%duS_H}D2F__Sc)WmQ~at}#i7XWTAr6DM@g~{OwV#PA}`TKogjeDHKMxLGC(QP z%U249=g@v*gePLY8tT*QvD&Z^67TqR%N4tvqFekdP^)K%9w-ko{Kms0E!V$89y#Gw zOYsb2laNs2ixS%)_?+_6xuD^tce$sJGuLOYN~>KQ(wkWz`vkyu)d_K9niqaLY7bKa zzUEuLaslrp1pi3V&=4)vx|J6$7M$?VXT&Zq4pLRvS@~xp65dsQCUKq_9Yw{BDw`v5hV(q+eXB6GbEAoL2OaBhYhc zw2x`uXsjY=4u6UWX>HbwaYU0i+q{}>tVzBZ;X@Eoj!XXh#~nKj%pOsa&Eh<_`LF4Fl{81 zQf=Jq`@)B1q4PQzOhGksKtv67u@E~_Cj&?VVU?{`Zx!3DAvDHvo&NaWHUVsaa#Y@V zNSS$l7F7mQcX#4e<*cxCokm%=%oS`?*qymoQ9hSHTti@x*kx)IX8-;J0+@Ck`+HXU%l#h*Zv-S z?pib7<>4^yRItM>A*%bOZe$dDR`cPj&()tfqv`ziM{wH-LZ%toMJA2M;+NQecLK-k zA({UL2CBXp@0K1zWblc_qlH$2I!UM2?V|uHRjR~Nxsp|H(yL-xigZelU&-+N3Xi0O zeAm5btNFZySEl1F-sKZf;s#2glwSt*N-}U$$?#Ql z;`89$j!ci$iSKTP8ycjicdcXliSmpe@68QhtSI!wSSK)IS{YhZ}uG9ws- zQ_2Z)LV1$DY#5vkIPHz7nQG4UDSz5wIKUrPoxT5vCH`VkVAxhnYe*=s zpj)ZrlDC!p8zxA^1b#CT^)C-&>lq``al^xCV^ZPpIWUiV0qS<-D$ z4PEEo8{HvxJ$r*V6g&TxFLh;ONKEsg z-8*1hQ!|>Qe3;Al8|nZE-qE8+*I}fc>DjT38#WZ&04xy!4_Rp3UnPxs!-m2wfB(D< z8(#DOJv-REVT1LXza^+pxU${#H6kHXy6Sym7S#$aft9T(&5Sh*LC___Cnb1ZhMS#vIK;`HFU-u0hLsg6C^{;`%jeRY1bX3tuHN_57KFLTYy zE%l0$4olHsp&jRM`K4R0pX{pvsH5tu+5Enl4hyl`hBO7rej5$5n7fGn#mK$re8mVJ zmi-{_fY>E|XD0&gq+cU=eDk`8M-9v7Usl!Nj-S5nadE_)R1h#C_g zo;>wx{SrhXr5_y7+Iq?8$CXGF72Lm%`leVOj9O>e=ztK0;K$9SJ#{~Of}NfCMb0L5 zh#?b73gav>TrR8J3ub|j&nX&A)64Er9o?j7UL&bWm$)ySG&So;cdKWDK){;M>TWqe zsm=W7E=U9&9Iwvfh6jMyHRJL^3;aI_-h@xNgr139Ut^~Cq~YtCIm(`tgs3{JQ&j#vOj63;zcWQlAAejvt z`VRaSf`fgZfS}V`AXm_6MHTKmt3+ zFkpj4*%oitp%a+iTpy_^SvCMChU9O`;rR-?$UUdP$G|R!W{)-Y7uPVW9*U3O!Vw~2 z=MP$R9IPQ{NkiTj$q?%`130wH;~n7z&c3hgMaHr|t@M8<D2%P3yWKIY@7FW8^`6nc3s4fo%#sb@XQH8N*cqq6OeT5HUS-#4T9=TKrq=|B=sz4-0TWIvixKPp<`XEg30VtL8}Q6XUO8d~JFuco{8_X6%coK+=aIW` z3~r7KfixW?dl9jV#>RlqLmbSSTOJV*b>hPaNA?uV zRSt&oeQb@%E4)*m0wRoIqzq$a3>gcS=GIzIHf&(pbXh@8BP&`kjl`fgb;lmue}EXt z>#M&S9#uj@aL?gR&p}zY2@WLg`5;8bXZ1=Pz2ov%%hfG8hQv!Ckyk>eTfq(9PRQ9s zy`z9xaEHyiVlF(37}+vbZur0#roAnw)>h7x2nHI{OS=F_{pV&~zS9M5%+lP`Wf_pI z>^T%jAV03;UoNukcPDHsbEDVt_cl!`wH6kPJTHLYRvuS)UePM~)oc3ahHm24? znrK5UM170FO=edTEUX(RQNoIHH|N47Es8?%FEKGw73m-K*F{knd^d*t<-@$rV{_dr zT;U4_6%Go`OGbb3c14bjU3sJDeN8PLr#{WD-9;XsBg%%>>6m2VIQTKm=5zpcuAHyl zo%m57iS3b8V0dZsHX9w!*Y6hRCVI`<)6%k}=)^oo+3k>Yx@@nPxn+ap!XSjtA(E$v z9mZznjRe#Zm|i_setNPgpUIbZCkmXlTOZn#LPA5GqislLv$5K_(;n#F#i;}MGobNz zuo){tKWx74K%_m|g})9K2FXwto>vZdjlF$D4;_RNyaJ&$uvB8A!i8 z$yie-Ekn0VHth*+i!OhmdfAJf zS2dz*u9P<`ZCO=9i=S)6B!H_JkjnUv6=~ZsFcUu>P7>VbbGjf#!hvM(*xLGpuZ_5t z1Hs&hdNGOvSc2gP`*)<-q-tX(>5agm!Xm$8mL zI3$!+EqitvzqNR_j5D7ScTmhW5}e{ogG?%z`w=$#Ef)yQX^KyVWu{uKrB8tl)_17@ zZqr&CK2!YpA|=i#BYoUujIp8vNRKYMmJx#%Ly^CsL9#kd?@On_5#1fBD?1QV*?+9y zTjtT~V3Rh2UMPz($TkR0fDGxY_Pjj_0Sm!}Qjxcfzru#o<=rWK^{dg9sAKW@2mcaK zHDr3Al^rWX%)Lxhn&OkBLbPY2!IWCO9eOn4rYDs(bRZZ(gTSxlnvJXMVSiy-^l>^F zBd{}2_=_@t15Kb=@CUkQ;%&dY=SNTx@X5kX{U?S=I!gxHMR^>H5RMDLvqFp$f^m;U z9%@}WcP9QTSEXt^M-u`uYnlJ<-yu6jR+*utse zf6Ic5*^aR-dUu-shu=mrV8o9KyT61TB-r5cN6xG?p4$m#=To1cIzL7mWs77O^E!|p z@d=+%hK!#5?9sNv_7i+Pt1pbUJ<&{w&fe*#q~2fZs7zL$smwenZ2Ru#vb~|HiEnJe z4>qJ${G@=ufuot)Dbaf<3)<_ZIgn`PN^1df6v{`@BCix|^{dNSEiwm1Ro+?#UR*hP zq4@K;s>CPP!=B1c2-!v+5a=?et%9jVbQU(YY-W-uWQG&BJwIssW{psoXw9@|5{ z)oF}ad-_rs;co4yq{B$GEZGS`{9_Im9+)+DP`^isQ~Vv>{39gpZh5@ViJ$u*e>;L5 z0-m;YwY^(ooQOZ~mOFJ1SexFR7yo*OTV<9t@Yg-z0W@D(7R)E}BTW z(?ROrdu9-5!mQoHL%t1>}xJ)fBt_dL63BW7y)m zGY9!`DKouE3#QUcixsV$^*0*7=iDXk!v_~g4*_EtE6}!^4*O-@qUY1@tzT8&SIb7E z2Dst{TUTuF-!`n6_Z?BjXH2pDx*l)@a1=3-n;JbYuwozC7N!pE#v!IO3-721?`nx} z(RXAJq<)n>yaCv}KYjf?_-(^$ng1ETJ`oijV~8{goIoCG!-iQYI-!3+j&zoNYuS2w zW@Z$}nD)MJFMW||X>D!D?5*5=&>!nL*Q|?Ejh24FJ1(%%-4GBc__=>@S^)WfMun?W z(v>fnaO)<`GI8r&sq0{gzx@miu-h0?jiU+MWGc8SZ!>+pQSytrt~Aq2WI>lNs3>HezwzMz09S?qc>n+a literal 0 HcmV?d00001 diff --git a/docs/static/img/blog/k8s-after.png b/docs/static/img/blog/k8s-after.png new file mode 100644 index 0000000000000000000000000000000000000000..0edcc3256a5a3306c85fa0f0c987ed8380a5450b GIT binary patch literal 103973 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 z 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

    f6APQ_oQ{bBjj8g@eg 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 h|L^}{1s+<}awWZUD%ATnb{W0gP~T)Afcc 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 {ym=N}f9X?Xg`kwM|tT55>Q-w}wC}Rb<|VxuZl6 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/blog/k8s-resources-after.png b/docs/static/img/blog/k8s-resources-after.png new file mode 100644 index 0000000000000000000000000000000000000000..e34a15a54aedc3e5ce365a393254af829dc2cff7 GIT binary patch literal 57621 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 G>%RcF4OG_v literal 0 HcmV?d00001 diff --git a/docs/static/img/blog/k8s-resources-before.png b/docs/static/img/blog/k8s-resources-before.png new file mode 100644 index 0000000000000000000000000000000000000000..af7e094297823d265076884582faedd132c8a708 GIT binary patch literal 83913 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 at!lXWUyO3;($d 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 IrUzEea0VBFnm$W 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
    (N3}SOMn~!q;m>zqE2+FPN|e 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 XYLGbbA9BJ^=tZz|{k_uW?6v;|jWvwV literal 0 HcmV?d00001 diff --git a/docs/static/img/blog/vector-top.png b/docs/static/img/blog/vector-top.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbe5c383b28c38d44db4812820d6adcf1240eec GIT binary patch literal 323512 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 z z8V`pl?f@wmUynifKEAUl0gG{-GturijlsP?E$&_dubQsRzkjQxJpc9+!HZg|@@qRz zBUaY2-Acu~zj=pwy`6uZ<`_Zt@21m;M7A&8elN{O=QO# zRSYZ*I2BK!vsv}Yq4OT=_t4nz+L4S1^ej@MU$HfJ*DIpyNR#q}xS*h8V=3e5=NzZ+ zs=V=({(15rxoBul6@kA4t`y->juL zuyiAH-T&0EAeLc1jVdr@?QQQVrnR^t#1Nj}I^<0n``RVK*s$zQ-w9-;F4}|>gZfhc zR~B9g>;2_>mCqHU4Y8&**ZVnBoq+;5f*;Ps4CwjHkl_?%5TMohf7{FdTAC~@KRe@^ z4bx~i@4zJYP`zE~W!HULjF;L2lq#_5p1iOW!f$)%G^NKV0X}KpH5ZpaQ=ck0kx@-K zUtq|K_5LNhB13Y;SZd%zS0F%s8rBzY((_IV z?Oyjl^2P1E5jUqGMOpKE{O2ZWE3KW_TC`CZMS+i{KfVXxjT)@1^EMza-eMm4`Z%cq z?Qs%q@t+A{Ei}zW+8KxiF3MBfey#N?qjG`G@EIqj^9Ly&RzTA#=|`||Ub@;}R>Sz1 zJipt6^I{P9B~c*Q!+)3Q$M4V?99#~Je0~7TJ&?&=*y{oh*cnjljA`lX>S`4rda32% z$|?DX;+)P>Y3>5uH>C2hwx~K=*DRlYYO$c)p1?vfybHKi4MF7{r`8Q6_vr4~9~~Zr zI4ix2@P~;+;G&R@q&qC<)UgT!ei0x2z^&EVgVRp@N#TCXr5uFre{~RuPff*noS~)Q z26*h!_l9%9BWvkPr1p#BIIeWqSucFxT0Ro7gjc+l0TH8{U3K$mH;OtuZN(SvS&Y3k z{$htj_>YKNzce)Lixp%*(7#x#^uRmoMH)rDIEj8}G#2S8O ztAmet9G5eEIW4tOWafv7aWEd}Lgv*E;h4$$*>9j}$NxY4xnrw;a!qF{4S(`!3KD92 zXp%zbYs}YmpII6e|9WaQv|kfhu(*Gp=HiB3s<4``{I2B}PjLpdrmSSxR_**|F)Zht ztcMvI`PF+rplq9qIP#p!q?f#Ov1B{D3a0Sz6&`sDQN!AR>%=Z!Dp4kzyv9@5w$|pG zLoCsz=^g!2(I%@O&(T^RH<>^Urk6%ZWTZ2>RS|BW3k^|+4LtWhh#!;dFLP)NdeS#c zMfs~id!hCvuh8p<2lDs42~nVX4u`u9BzJF%Fpu2g5o@Ta#ya+!&@Veg+16^mT7

    Dk63VM(`J75g%;&ZLszD8`p(#a)Vw15D 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