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;