github.com/Jeffail/benthos/v3@v3.65.0/website/src/pages/index.js (about)

     1  import React from 'react';
     2  import classnames from 'classnames';
     3  import Layout from '@theme/Layout';
     4  import Link from '@docusaurus/Link';
     5  import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
     6  import useBaseUrl from '@docusaurus/useBaseUrl';
     7  import styles from './index.module.css';
     8  import CodeSnippet from "@site/src/theme/CodeSnippet";
     9  import Tabs from '@theme/Tabs';
    10  import TabItem from '@theme/TabItem';
    11  
    12  const installs = [
    13    {
    14      label: 'Curl',
    15      lang: 'bash',
    16      copyBit: `curl -Lsf https://sh.benthos.dev | bash`,
    17      config: `# Install
    18  curl -Lsf https://sh.benthos.dev | bash
    19  
    20  # Make a config
    21  benthos create nats/protobuf/aws_sqs > ./config.yaml
    22  
    23  # Run
    24  benthos -c ./config.yaml`
    25    },
    26    {
    27      label: 'Homebrew',
    28      lang: 'bash',
    29      copyBit: `brew install benthos`,
    30      config: `# Install
    31  brew install benthos
    32  
    33  # Make a config
    34  benthos create nats/protobuf/aws_sqs > ./config.yaml
    35  
    36  # Run
    37  benthos -c ./config.yaml`
    38    },
    39    {
    40      label: 'Docker',
    41      lang: 'bash',
    42      copyBit: `docker pull jeffail/benthos`,
    43      config: `# Pull
    44  docker pull jeffail/benthos
    45  
    46  # Make a config
    47  docker run --rm jeffail/benthos create nats/protobuf/aws_sqs > ./config.yaml
    48  
    49  # Run
    50  docker run --rm -v $(pwd)/config.yaml:/benthos.yaml jeffail/benthos`
    51    },
    52  ]
    53  
    54  const snippets = [
    55    {
    56      label: 'Mapping',
    57      further: '/docs/guides/bloblang/about',
    58      config: `input:
    59    gcp_pubsub:
    60      project: foo
    61      subscription: bar
    62  
    63  pipeline:
    64    processors:
    65      - bloblang: |
    66          root.message = this
    67          root.meta.link_count = this.links.length()
    68          root.user.age = this.user.age.number()
    69  
    70  output:
    71    redis_streams:
    72      url: tcp://TODO:6379
    73      stream: baz
    74      max_in_flight: 20`,
    75    },
    76    {
    77      label: 'Multiplexing',
    78      further: '/docs/components/outputs/about#multiplexing-outputs',
    79      config: `input:
    80    kafka:
    81      addresses: [ TODO ]
    82      topics: [ foo, bar ]
    83      consumer_group: foogroup
    84  
    85  output:
    86    switch:
    87      cases:
    88        - check: doc.tags.contains("AWS")
    89          output:
    90            aws_sqs:
    91              url: https://sqs.us-west-2.amazonaws.com/TODO/TODO
    92              max_in_flight: 20
    93  
    94        - output:
    95            redis_pubsub:
    96              url: tcp://TODO:6379
    97              channel: baz
    98              max_in_flight: 20`,
    99    },
   100    {
   101      label: 'Windowing',
   102      further: '/docs/configuration/windowed_processing',
   103      config: `input:
   104    nats_jetstream:
   105      urls: [ nats://TODO:4222 ]
   106      queue: myqueue
   107      subject: traffic.light.events
   108      deliver: all
   109  
   110  buffer:
   111    system_window:
   112      timestamp_mapping: root = this.created_at
   113      size: 1h
   114  
   115  pipeline:
   116    processors:
   117      - group_by_value:
   118          value: '\${! json("traffic_light_id") }'
   119      - bloblang: |
   120          root = if batch_index() == 0 {
   121            {
   122              "traffic_light_id": this.traffic_light_id,
   123              "created_at": meta("window_end_timestamp"),
   124              "total_cars": json("registration_plate").from_all().unique().length(),
   125              "passengers": json("passengers").from_all().sum(),
   126            }
   127          } else { deleted() }
   128  
   129  output:
   130    pulsar:
   131      url: pulsar://TODO:6650
   132      topic: traffic_windows`,
   133    },
   134    {
   135      label: 'Enrichments',
   136      further: '/cookbooks/enrichments',
   137      config: `input:
   138    mqtt:
   139      urls: [ tcp://TODO:1883 ]
   140      topics: [ foo ]
   141  
   142  pipeline:
   143    processors:
   144      - branch:
   145          request_map: |
   146            root.id = this.doc.id
   147            root.content = this.doc.body
   148          processors:
   149            - aws_lambda:
   150                function: sentiment_analysis
   151          result_map: root.results.sentiment = this
   152  
   153  output:
   154    aws_s3:
   155      bucket: TODO
   156      path: '\${! meta("partition") }/\${! timestamp_unix_nano() }.tar.gz'
   157      batching:
   158        count: 100
   159        period: 10s
   160        processors:
   161          - archive:
   162              format: tar
   163          - compress:
   164              algorithm: gzip`,
   165    },
   166  ];
   167  
   168  const features = [
   169    {
   170      title: 'Takes Care of the Dull Stuff',
   171      imageUrl: 'img/Blobboring.svg',
   172      description: (
   173        <>
   174          <p>
   175            Benthos solves common data engineering tasks such as transformations, integrations, and multiplexing with declarative and <a href="/docs/configuration/unit_testing">unit testable</a> configuration. This allows you to easily and incrementally adapt your data pipelines as requirements change, letting you focus on the more exciting stuff.
   176          </p>
   177          <p>
   178            It comes armed with a wide range of <a href="/docs/components/processors/about">processors</a>, a <a href="/docs/guides/bloblang/about">lit mapping language</a>, stateless <a href="/docs/configuration/windowed_processing">windowed processing capabilities</a> and an <a href="/blobfish">industry leading mascot</a>.
   179          </p>
   180        </>
   181      ),
   182    },
   183    {
   184      title: 'Well Connected',
   185      imageUrl: 'img/Blobborg.svg',
   186      description: (
   187        <>
   188          <p>
   189            Benthos is able to glue a wide range of <a href="/docs/components/inputs/about">sources</a> and <a href="/docs/components/outputs/about">sinks</a> together and hook into a variety of <a href="/docs/components/processors/sql">databases</a>, <a href="/docs/components/processors/cache">caches</a>, <a href="/docs/components/processors/http">HTTP APIs</a>, <a href="/docs/components/processors/aws_lambda">lambdas</a> and <a href="/docs/components/processors/about">more</a>, enabling you to seamlessly drop it into your existing infrastructure.
   190          </p>
   191          <p>
   192            Working with disparate APIs and services can be a daunting task, doubly so in a streaming data context. With Benthos it's possible to break these tasks down and automatically parallelize them as <a href="/cookbooks/enrichments">a streaming workflow</a>.
   193          </p>
   194        </>
   195      ),
   196    },
   197    {
   198      title: 'Reliable and Operationally Simple',
   199      imageUrl: 'img/Blobscales.svg',
   200      description: (
   201        <>
   202          <p>
   203            Benthos runs fast and processes messages using a transaction model, making it able to guarantee at-least-once delivery even in the event of crashes, disk corruption, or other unexpected server faults.
   204          </p>
   205          <p>
   206            It's completely stateless with no need for disk persisted state, allowing for easy deployment and liberal scaling. It also exposes <a href="/docs/components/metrics/about">metrics</a> and <a href="/docs/components/tracers/about">tracing</a> events to targets of your choice.
   207          </p>
   208          <p>
   209            At Meltwater it's enriching over 450 million documents per day with a network of more than 20 NLP services. It sounds very interesting but rest assured, <a href="https://underthehood.meltwater.com/blog/2019/08/26/enriching-450m-docs-daily-with-a-boring-stream-processor">it's totally drab</a>.
   210          </p>
   211        </>
   212      ),
   213    },
   214    {
   215      title: 'Extendable',
   216      imageUrl: 'img/Blobextended.svg',
   217      description: (
   218        <>
   219          <p>
   220            Sometimes the components that come with Benthos aren't enough. Luckily, Benthos has been designed to be easily plugged with whatever components you need.
   221          </p>
   222          <p>
   223            You can either write plugins <a href="https://pkg.go.dev/github.com/Jeffail/benthos/v3/public">directly in Go (recommended)</a> or you can have Benthos run your plugin as a <a href="/docs/components/processors/subprocess">subprocess</a>.
   224          </p>
   225        </>
   226      ),
   227    },
   228  ];
   229  
   230  function Feature({imageUrl, title, description}) {
   231    const imgUrl = useBaseUrl(imageUrl);
   232    return (
   233      <div className={classnames('col col--6', styles.feature)}>
   234        {imgUrl && (
   235          <div className="text--center">
   236            <img className={classnames('padding-vert--md', styles.featureImage)} src={imgUrl} alt={title} />
   237          </div>
   238        )}
   239        <h3>{title}</h3>
   240        {description}
   241      </div>
   242    );
   243  }
   244  
   245  function Home() {
   246    const context = useDocusaurusContext();
   247    const {siteConfig = {}} = context;
   248    return (
   249      <Layout
   250        title={`${siteConfig.title}`}
   251        description="Fancy stream processing made operationally mundane"
   252        keywords={["benthos","stream processor","data engineering","ETL","ELT","event processor","go","golang"]}>
   253        <header className={classnames('hero', styles.heroBanner)}>
   254          <div className="container">
   255            <div className="row">
   256              <div className={classnames('col col--5 col--offset-1')}>
   257                <h1 className="hero__title">{siteConfig.title}</h1>
   258                <p className="hero__subtitle">{siteConfig.tagline}</p>
   259                <div className={styles.buttons}>
   260                  <Link
   261                    className={classnames(
   262                      'button button--outline button--primary button--lg',
   263                      styles.getStarted,
   264                    )}
   265                    to={useBaseUrl('docs/guides/getting_started')}>
   266                    Get Started
   267                  </Link>
   268                </div>
   269              </div>
   270              <div className={classnames('col col--5')}>
   271                <img className={styles.heroImg} src="img/logo_hero.svg" />
   272              </div>
   273            </div>
   274          </div>
   275        </header>
   276        <main>
   277          <div className="container">
   278            <div className="row">
   279              <div className={classnames(`${styles.pitch} col col--6`)}>
   280                <h2>It's boringly easy to use</h2>
   281                <p>
   282                  Written in Go, deployed as a static binary, declarative configuration. <a href="https://github.com/Jeffail/benthos">Open source</a> and cloud native as utter heck.
   283                </p>
   284                {installs && installs.length && (
   285                  <Tabs defaultValue={installs[0].label} values={installs.map((props, idx) => {
   286                    return {label:props.label, value:props.label};
   287                  })}>
   288                    {installs.map((props, idx) => (
   289                      <TabItem key={idx} value={props.label}>
   290                        <CodeSnippet {...props}></CodeSnippet>
   291                      </TabItem>
   292                    ))}
   293                  </Tabs>
   294                )}
   295              </div>
   296              <div className={classnames('col col--6')}>
   297                  {snippets && snippets.length && (
   298                    <section className={styles.configSnippets}>
   299                      <Tabs defaultValue={snippets[0].label} values={snippets.map((props, idx) => {
   300                        return {label:props.label, value:props.label};
   301                      })}>
   302                        {snippets.map((props, idx) => (
   303                          <TabItem key={idx} value={props.label}>
   304                            <CodeSnippet className={styles.configSnippet} {...props}></CodeSnippet>
   305                          </TabItem>
   306                        ))}
   307                      </Tabs>
   308                    </section>
   309                  )}
   310              </div>
   311            </div>
   312          </div>
   313          {features && features.length && (
   314            <section className={styles.features}>
   315              <div className="container margin-vert--md">
   316                <div className="row">
   317                  {features.map((props, idx) => (
   318                    <Feature key={idx} {...props} />
   319                  ))}
   320                </div>
   321              </div>
   322            </section>
   323          )}
   324          <section className={styles.loveSection}>
   325            <div className="container">
   326              <div className="row">
   327                <div className={classnames('col col--6')}>
   328                  <h3 id="sponsored-by">Sponsored by the following heroes</h3>
   329                  <div className="container">
   330                    <div className={classnames("row")}>
   331                      <a href="https://www.meltwater.com/" className="col col--6"><img className={styles.meltwaterImg} src="/img/sponsors/mw_logo.png" /></a>
   332                      <a href="https://www.humansecurity.com" className="col col--6"><img className={styles.humanImg} src="/img/sponsors/HUMAN_logo.png" /></a>
   333                      <a href="https://www.infosum.com/" className="col col--6"><img className={styles.infosumImg} src="/img/sponsors/infosum_logo.png" /></a>
   334                      <a href="https://community.com/" className="col col--6"><img className={styles.communityImg} src="/img/sponsors/community.svg" /></a>
   335                      <a href="https://www.optum.com/" className="col col--6"><img className={styles.optumImg} src="/img/sponsors/optum_logo.png" /></a>
   336                      <a href="https://aurora.dev/" className="col col--6"><img className={styles.auroraImg} src="/img/sponsors/aurora.svg" /></a>
   337                      <a href="https://rudderstack.com/" className="col col--6"><img className={styles.rudderstackImg} src="/img/sponsors/rudderstack.svg" /></a>
   338                      <a href="http://wildbit.com" className="col col--6"><img className={styles.wildbitImg} src="/img/sponsors/wildbit.svg" /></a>
   339                    </div>
   340                  </div>
   341                </div>
   342                <div className={classnames('col col--6', styles.loveSectionPlea)}>
   343                  <div>
   344                    <a href="https://github.com/sponsors/Jeffail">
   345                      <img className={styles.loveImg} src="img/blobheart.svg" alt="Blob Heart" />
   346                    </a>
   347                  </div>
   348                  <Link
   349                    className={classnames('button button--danger')}
   350                    to="https://github.com/sponsors/Jeffail">
   351                    Become a sponsor
   352                  </Link>
   353                </div>
   354              </div>
   355            </div>
   356          </section>
   357        </main>
   358      </Layout>
   359    );
   360  }
   361  
   362  export default Home;