{"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"templateName":"quickstart-page-template","cssClassNames":"page basicpage summit-page","language":"en","description":"Getting Started with Openflow Kafka Connector for Real-Time Log Streaming","title":"Getting Started with Openflow Kafka Connector","analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/getting-started-with-openflow-kafka-connector","analyticsContentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/platform","snowflake-site:taxonomy/snowflake-feature/transformation","snowflake-site:taxonomy/snowflake-feature/openflow","snowflake-site:taxonomy/snowflake-feature/ingestion"],"analyticsEnabled":true,"coveoConfig":{"searchHub":"snowflake.com","pipeline":"snowflake.com","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","organizationId":"snowflakecomputingproduction8neljofn"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/getting-started-with-openflow-kafka-connector","language":"en","category":"general","pageName":"Getting Started with Openflow Kafka Connector","contentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/platform","snowflake-site:taxonomy/snowflake-feature/transformation","snowflake-site:taxonomy/snowflake-feature/openflow","snowflake-site:taxonomy/snowflake-feature/ingestion"]},"isPasswordProtected":false,":mappedPath":"/en/developers/guides/getting-started-with-openflow-kafka-connector/",":type":"snowflake-site/components/structure/page",":items":{"root":{"columnClassNames":{"markup_editor_1950346551":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","modal_container":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-4a6e2d7cab","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-00f4460a00",":type":"snowflake-site/components/container",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-53732daec4","contentHeadline":"Snowflake World Tour hits your city","contentDescription":"See how leading teams deploy agents at scale. Find a stop near you. Register free.","contentJustifyContent":"center","linkStyle":"text-white","linkCTA":{"id":"link-cta","heapButtonClasses":["pushdown_banner"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"/en/world-tour/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Register now"},":type":"snowflake-site/components/pushdown-banner","appliedCssClassNames":"snowflake-pushdown-banner-text-white snowflake-pushdown-banner-background-black"}},":itemsOrder":["pushdown_banner_copy"]},"image":{":type":"nt:unstructured"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:metadata"],"classNames":"aem-xf"},"experiencefragment-header":{"id":"experiencefragment-cde0ad9cdf","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-87b86d4f94",":type":"snowflake-site/components/container",":items":{"markup_editor":{"id":"markup-editor-81e5280b22","title":" ","cssContent":".footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.mega-nav__sign-in.snowflake-button-container{display:none}@media screen and (min-width:768px){.mega-nav__sign-in.snowflake-button-container{display:inline-block;font-family:'Texta',sans-serif;font-weight:800 !important}}@media screen and (min-width:1024px) and (max-width:1199px){.snowflake-mega-nav-header-buttons-container .snowflake-button-blue .snowflake-button-container{font-size:13px !important}.snowflake-language-navigation .language-icon{width:18px !important;height:18px !important;margin-right:4px !important}}.mega-nav__sign-in svg{display:none}.nav-item__platform-parent-why-sf.snowflake-mega-nav-nav-item\u003Ea:hover,.nav-item__platform-parent.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent !important}.nav-platform-sidebar .snowflake-mega-nav-nav-item:hover.blue-icon .snowflake-mega-nav-nav-item-icon__inner{background-color:var(--ui-01) !important}@media screen and (min-width:1024px){.snowflake-mega-nav-navigation-dropdown{overflow:hidden}.meganav-platform-features{padding-left:64px}.meganav-platform-features::before{content:'';transform:translateX(-64px);display:block;z-index:0;width:100%;height:100%;position:absolute;top:0;background:#f7f9fa}.nav-item--si.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent}.nav-item--si{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:8px}.nav-item__platform-parent{border-bottom:1px solid #ccc;margin-bottom:8px;padding-bottom:16px}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description::after{content:'What Snowflake can do for you \u003E';display:block;color:var(--ui-01);margin-top:16px}.nav-item__platform-parent .snowflake-mega-nav-nav-item-description::after{content:'View the platform \u003E';display:block;color:var(--ui-01);margin-top:16px}}@media screen and (min-width:1367px){.snowflake-mega-nav-nav-item-description{font-size:13px !important;line-height:20px !important}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{font-size:17px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-title,.nav-item__platform-parent .snowflake-mega-nav-nav-item-title{font-size:24px !important;line-height:32px !important;margin-bottom:8px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description,.nav-item__platform-parent .snowflake-mega-nav-nav-item-description{font-size:14px !important;line-height:20px !important}}html.wf-texta-n9-loading .display-1-v2{font-size:48px!important;line-height:50px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-4-v2{font-size:18px!important;line-height:24px!important;font-family:sans-serif!important}@media screen and (min-width:768px){html.wf-texta-n9-loading .display-2-v2{font-size:48px!important;line-height:50px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:55.5px!important;line-height:54px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .heading-5-v2,html.wf-lato-n4-loading .snowflake-card-v2-advanced-text .snowflake-text p{font-size:15.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:34px!important;line-height:38px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-4,html.wf-texta-n8-loading .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-regular .snowflake-button-container{font-size:13px!important;line-height:20px!important;letter-spacing:.25px!important;font-family:sans-serif!important}}@media screen and (min-width:1024px){html.wf-lato-n4-loading .snowflake-mega-nav-nav-item-description{font-size:11.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .snowflake-button-compact .snowflake-button-container{font-size:12px!important;letter-spacing:0!important;line-height:18px!important}}@media screen and (min-width:1367px){html.wf-lato-n4-loading .hp-hero__eyebrow a\u003Eb:first-child{font-size:11px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .hp-hero__eyebrow a{font-size:13px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-2-v2{font-size:61px!important;line-height:60px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:74.5px!important;line-height:74px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:41px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-3-v2{font-family:sans-serif!important;letter-spacing:-.75px!important;font-size:33.75px!important}html.wf-texta-n9-loading .heading-4-v2{font-size:19.5px!important;line-height:26px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2{font-size:12px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:14px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-1,html.wf-lato-n4-loading .cq-Editable-dom[data-cq-data-path*=text] ol\u003Eli,html.wf-lato-n4-loading .snowflake-text li,html.wf-lato-n4-loading .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text li,html.wf-lato-n4-loading .text-size-large .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-large.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom span[data-testid=text-content],html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Ep,html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Eul\u003Eli{font-size:17.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content],html.wf-texta-n8-loading .snowflake-button-link .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-link-back .snowflake-button-container{font-size:15.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-3,html.wf-lato-n4-loading .text-size-small .snowflake-text li,html.wf-lato-n4-loading .text-size-small .snowflake-text p,html.wf-lato-n4-loading .text-size-small .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-small.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}}#industryPlatformSection,.sc-hero{background-position:top left;background-size:20% auto}.bwalignc,.bwalignr{list-style-position:inside}.snowflake-text p sup{font-size:10px}#industryPlatformSection .industry-platform__row .snowflake-flexible-column-container-items,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container,.snowflake-hero-system-content-container{gap:16px}.agenda-item p,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.partner-details p{margin:0!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::after,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::before,.hide-logo .snowflake-case-study-card-logo,.partner-page__powered-by-logo,.sc-hero div.code-toolbar\u003E.toolbar,.snowflake-card-v2-advanced.no-link .snowflake-card-v2-advanced-button,.snowflake-partner-hero-card-badge-container{display:none!important}.section--card-mobile-carousel .snowflake-flexible-column-container-items-with-carousel{max-width:100%!important}@media screen and (min-width:768px){.button-group-pair .snowflake-button-container.inline-button--desktop,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;display:inline-block!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:flex-start!important}.button-group-pair.center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center!important}.section--card-mobile-carousel{margin-left:var(--tablet-portrait-margin,48px)!important;margin-right:var(--tablet-portrait-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-portrait-margin) * 2)!important}}@media screen and (min-width:1024px){.section--card-mobile-carousel{margin-left:var(--tablet-horizontal-margin,48px)!important;margin-right:var(--tablet-horizontal-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-horizontal-margin) * 2)!important}.snowflake-mega-nav-header-mobile-icon{display:none!important}}@media screen and (min-width:1367px){.section--card-mobile-carousel{margin-left:var(--desktop-margin,6.5%)!important;margin-right:var(--desktop-margin,6.5%);width:87%!important;width:calc(100% - var(--desktop-margin) * 2)!important}.logo-container{min-width:143px}.sc-hero__headline .heading-1-v2{font-size:60px}.snowflake-mega-nav-navigation-title{font-size:17px}.snowflake-mega-nav-dropdown-footer-wrapper .snowflake-title-v2 .snowflake-title-v2-line:first-child{font-size:16px!important;line-height:24px!important}}.hero--home{overflow:hidden;background-color:var(--ui-01);z-index:2}.hp-hero__subheadline{width:90%}.hero--home .snowflake-button-container{transition:.3s}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-secondary a:hover,.hero--home .snowflake-button-white a:hover{transition:.3s;background-color:var(--ui-02)!important;color:var(--ui-05)!important}.hero--home .snowflake-button-secondary a:hover{border-color:var(--ui-05)!important}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-white a:hover{border-color:var(--ui-02)!important}.bwalignc,.hp-hero__eyebrow{text-align:center}.hp-hero__eyebrow a{display:inline-flex;flex-direction:column;justify-content:center;cursor:pointer;padding:8px;border-radius:var(--spacing-01);gap:8px;align-items:center;background-color:#45aee3;color:var(--ui-03);font-family:Texta,sans-serif;font-weight:800;font-size:16px;line-height:22px;transition:background-color .3s}.hp-hero__eyebrow a:hover{background-color:#7fc6ea;text-decoration:none;transition:background-color .3s}.hp-hero__eyebrow a\u003Eb:first-child{text-transform:uppercase;white-space:nowrap;display:inline-block;background-color:var(--ui-02);color:var(--ui-05);font-size:12px!important;line-height:16px!important;font-family:Lato,sans-serif;font-weight:500!important;padding:3px 6px;border-radius:2px;letter-spacing:1px}@media screen and (min-width:767px){.hp-hero__eyebrow{text-align:left}.hp-hero__eyebrow a{flex-direction:row;text-align:left}}.hero--home__inner .offset-video,.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{max-height:200px;overflow:hidden}.hero--home__inner .offset-video .wistia-responsive-padding{padding-top:100%}.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{position:absolute!important;top:0;left:0;width:100%}.offset-video__bg-image{z-index:-1}@media screen and (min-width:768px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{position:absolute!important;max-height:none;top:0;left:0;width:250%;padding-bottom:250%;transform:translate(0,-50%);height:0}.workloads_7.unistore{max-width:317px}}.promo-banner--homepage{z-index:2}.homepage-banner-offset-container::after{content:\"\";display:block;position:absolute;bottom:0;z-index:1;left:0;width:100%;height:80%;background:#fff}.section--quicklinks .snowflake-button-full-width a{padding-left:24px!important;padding-right:24px!important;transition:box-shadow .25s cubic-bezier(.4,0,.2,1);text-align:left;display:flex;justify-content:center;align-items:center}.section--quicklinks .snowflake-button-full-width a:hover{box-shadow:0 16px 16px 0 rgb(0 0 0 / .16);transition:box-shadow .25s cubic-bezier(.4,0,.2,1)}.section--quicklinks .snowflake-button-container:focus-visible a::before,.section--quicklinks .snowflake-button-full-width a::before{content:\"\";width:23px;height:23px;flex-shrink:0;margin-right:12px;display:inline-block;background-size:cover;background-repeat:no-repeat;background-position:center}#industryPartnerSlider .snowflake-navigation-icon.swiper-button-disabled,#partnerResources .section--resource-hub a svg,.button-tabs span.snowflake-tabs-navigation-item:after,.customer-card--hide-cta .snowflake-case-study-card-button,.dot-tabs span.snowflake-tabs-navigation-item::after,.partner-sidebar__mobile-expand,html:not(.aem-AuthorLayer-initial):not(.aem-AuthorLayer-Edit) .tab-content:not(.is-active){display:none}.section--quicklinks .snowflake-button-full-width a.pricing::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/decorative-icons/pricing-icon.svg)}.section--quicklinks .snowflake-button-full-width a.snowflake_on_snowflake::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon_snowflake-bug.svg)}.section--quicklinks .snowflake-button-full-width a.virtual_hands_on_labs::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__training.svg)}.section--quicklinks .snowflake-button-full-width a.weekly_demo::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__webinars.svg)}@media screen and (min-width:1024px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{left:-50%}.section--quicklinks .snowflake-flexible-column-container-items{gap:24px}.snowflake-quote-item-inner{padding:32px 24px 24px!important}}#communitiesOuter_overflowBottomGray::after{max-height:100px}#caseStudyOuter_overflowBottomMidBlue::after{max-height:180px}#caseStudyInner .snowflake-case-study-card .snowflake-wistia-video{border-radius:0!important}#caseStudyInner .snowflake-case-study-card{box-shadow:none!important;border-radius:0}#caseStudyInner{max-width:1200px;margin:0 auto;box-shadow:rgb(152 162 179 / .1) 0 10px 20px 0,rgb(152 162 179 / .25) 0 2px 6px 0;border-radius:8px;overflow:hidden;position:relative;z-index:1}.case-study__logo-bar\u003E.snowflake-flexible-column-container-items{background:#f7f9fa;padding:32px 16px 40px}.case-study__logo-bar .cmp-image__image{width:90%;margin:0 auto;max-width:240px}.hp-platform__text-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child),.sc-sidebar__group .snowflake-button-link{margin-top:8px}.workloads_7.unistore{margin-left:auto;margin-right:auto}#homepageFootnotesInner .snowflake-simple-stat-disclaimer .snowflake-text p{color:#fff!important}.snowflake-simple-stat-disclaimer .snowflake-text p\u003Ea{border-bottom:1px solid var(--ui-03);color:var(--text-03)}.snowflake-card-v2-advanced{color:inherit}#workloadCardGridOuter .snowflake-card-v2-base-front{gap:0}.video-modal.snowflake-modal-window-open-inner{background-color:#fff0;padding:8px;border:none}.snowflake-container-arrow-dotted-faded .snowflake-container-arrow-dotted-faded-image{width:40%!important;max-width:420px;top:4%!important}.list--blue-bullets ul{margin:0!important;padding:0!important;list-style-type:none}.list--blue-bullets li{margin:0;padding:0 0 0 32px;position:relative}.list--blue-bullets li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.list--blue-bullets li:not(:last-child){margin-bottom:1rem}.logo-tabs .snowflake-navigation-container,.snowflake-simple-stat-content:empty,.summit-speaker-card .snowflake-card-v2-advanced-text{margin-bottom:0}#techResourceInner,#techResourceOuter,div.overflow-bottom--blue,div.overflow-bottom--gray,div.overflow-bottom--mid-blue,div.overflow-bottom--white,div.overflow-top--blue,div.overflow-top--gray,div.overflow-top--mid-blue,div.overflow-top--white,div[id$=overflowBottomGray],div[id$=overflowBottomMidBlue],div[id$=overflowTopBlue],div[id$=overflowTopGray]{position:relative}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{content:\"\";display:block;position:absolute;left:0;width:100%;height:40%}div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{top:0}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after{bottom:0}div.overflow-bottom--white::after,div.overflow-top--white::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopWhite]::after{background:#fff!important}div.overflow-bottom--gray::after,div.overflow-top--gray::after,div[id$=overflowBottomGray]::after,div[id$=overflowTopGray]::after{background:#f6f9fa!important}div.overflow-bottom--mid-blue::after,div.overflow-top--mid-blue::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowTopMidBlue]::after{background:#11567f!important}div.overflow-bottom--blue::after,div.overflow-top--blue::after,div[id$=overflowBottomBlue]::after,div[id$=overflowTopBlue]::after{background:#259edc!important}.snowflake-premium-content-banner.promo-banner--no-shadow{box-shadow:none!important}#industryPartnerSlider .cmp-image__image,#industryPartnerSlider .section--partner-tabs .snowflake-image-container .cmp-image__image,#partnerSidebar,.has-shadow .cmp-image__image{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25)}.content-chip--has-desc{align-items:flex-start;padding:20px!important}.content-chip--has-desc .snowflake-content-chip-image{max-width:100px}.content-chip--has-desc .snowflake-content-chip-image__image{aspect-ratio:1}.content-chip--has-desc .snowflake-title-v2-line:first-child{font-size:18px!important}.content-chip--has-desc .snowflake-title-v2-line:nth-child(2){color:#000!important;font-weight:500!important;font-size:16px!important;line-height:22px!important;margin-top:2px!important}.content-chip--has-desc .snowflake-content-chip-button{margin-top:6px!important;font-size:18px!important;display:none}.square-image .snowflake-content-chip-image{aspect-ratio:1;max-width:120px}.section--logo-bar.smaller-logos .snowflake-image-container .cmp-image__image{max-width:200px;margin:0 auto}.snowflake-card-v2-advanced-tag,.snowflake-content-chip-tag{padding:3px 6px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-button,.snowflake-card-v2-advanced-title:first-child,.summit-pricing-block__aside ul{margin-top:0}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:40px;height:40px;display:flex;justify-content:center;align-items:center;margin:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{width:12px;height:12px;background:var(--ui-12);border-radius:100%}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p,.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{font-size:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{background:var(--ui-01)}.button-tabs .snowflake-navigation-container .swiper-wrapper{padding:8px 0}.button-tabs .snowflake-navigation-container .swiper-slide{margin:0 6px}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{padding:8px 24px;background-color:#f6f9fa;border-radius:48px;margin:0}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{text-transform:uppercase;font-family:Texta,sans-serif;font-weight:700}.button-tabs .border-top{border-top:1px solid #ccc}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{background-color:var(--ui-01);box-shadow:0 2px 6px 0 rgb(152 162 179 / .25),0 10px 20px 0 rgb(152 162 179 / .1)}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{color:#fff}.button-tabs.has-icons .snowflake-navigation-container .snowflake-tabs-navigation-item p::before{content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-position:center center;margin-right:12px;vertical-align:middle;margin-top:-3px}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:220px;padding-bottom:50%;height:0;margin:0 8px!important;background-size:cover;background-repeat:no-repeat;opacity:.5;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item:hover{opacity:.75;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{opacity:1;transition:opacity .3s}.dot-tabs .aem-container.cmp-tabs,.logo-tabs .aem-container.cmp-tabs{display:flex;flex-direction:column-reverse}.snowflake-icon.is-center{margin:0 auto;display:block}#industryPartnerSlider .snowflake-flexible-column-container-items,#partnerLogoSquare .snowflake-flexible-column-container-items{gap:24px}#techResourceOuter::after{content:\"\";display:block;position:absolute;top:0;left:0;width:100%;height:40%;background:#f6f9fa}#techResourceInner{z-index:1}.partner-tier-tag h6{display:inline-block!important;padding:2px 6px;border-radius:2px;color:#666}.partner-tier-tag.registered h6{background-color:#f6f9fa}.partner-tier-tag.elite h6{background-color:#11567f;color:#fff}.partner-tier-tag.premier h6{background-color:#b14c77;color:#fff}.partner-tier-tag.select h6{background-color:#5094a0;color:#fff}.partner-details\u003Espan{display:flex;gap:24px}.partner-details a{color:inherit!important;font-weight:400!important}.partner-details p::before{content:\"\";display:inline-block;vertical-align:middle;width:16px;height:16px;background-repeat:no-repeat;background-position:center;transform:translateY(-1px);background-size:auto 90%;margin-right:6px}.partner-details__location::before{background-image:url(\"data:image/svg+xml,%3Csvg width='13' height='18' viewBox='0 0 13 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.25 17.7531C6.4375 17.7531 6.6 17.6844 6.7375 17.5531C6.875 17.4219 6.95 17.2531 6.95 17.0531C6.95 16.8531 7.075 16.4281 7.3 15.7969C7.5875 15.0281 7.925 14.3156 8.30625 13.6406C8.8 12.7781 9.3125 12.1031 9.85 11.6094C10.75 10.7969 11.4125 9.96563 11.85 9.12188C12.2875 8.27813 12.5063 7.40313 12.5063 6.49063C12.5063 5.36563 12.2187 4.31563 11.6437 3.33438C11.0937 2.40313 10.3438 1.65938 9.4 1.10938C8.43125 .534376 7.375 .246876 6.24375 .246876C5.1125 .246876 4.06875 .534376 3.0875 1.10938C2.15625 1.65938 1.4125 2.40313 .862498 3.33438C.287498 4.31563 0 5.36563 0 6.49063C0 7.47188 .262499 8.42813 .787499 9.35938C1.14375 10.0031 1.65625 10.6656 2.3125 11.3344C2.75625 11.8031 3.24375 12.4781 3.78125 13.3656C4.225 14.0969 4.63125 14.8594 5 15.6656C5.35 16.3844 5.53125 16.8531 5.55625 17.0656C5.55625 17.2594 5.625 17.4156 5.7625 17.5531C5.9 17.6844 6.0625 17.7531 6.25 17.7531ZM6.16875 14.9156C5.775 14.0656 5.325 13.2469 4.825 12.4594C4.275 11.5594 3.7625 10.8719 3.28125 10.3969C2.625 9.71563 2.1375 9.05938 1.825 8.43438C1.5125 7.80313 1.35625 7.16563 1.35625 6.50313C1.35625 5.61563 1.575 4.80313 2.0125 4.05313C2.45 3.30313 3.04375 2.71563 3.7875 2.27813C4.5375 1.84063 5.35 1.62188 6.2375 1.62188C7.125 1.62188 7.9375 1.84063 8.6875 2.27813C9.4375 2.71563 10.0312 3.30313 10.475 4.04688C10.9187 4.80313 11.1375 5.62188 11.1375 6.50313C11.1375 7.90313 10.3937 9.26563 8.9125 10.5969C8.35 11.1094 7.8125 11.7906 7.3 12.6406C6.88125 13.3344 6.50625 14.0969 6.16875 14.9219V14.9156ZM6.26875 8.36563C6.65625 8.36563 7.01875 8.26563 7.35625 8.07188C7.69375 7.87813 7.95625 7.60938 8.14375 7.28438C8.3375 6.95313 8.43125 6.59063 8.43125 6.19688C8.43125 5.80313 8.33125 5.43438 8.1375 5.10313C7.9375 4.76563 7.675 4.50313 7.3375 4.31563C7 4.12813 6.6375 4.02813 6.24375 4.02813C5.85 4.02813 5.4875 4.12813 5.15625 4.32188C4.825 4.52188 4.56875 4.78438 4.375 5.12188C4.18125 5.45938 4.0875 5.82188 4.0875 6.20938C4.0875 6.59688 4.1875 6.95938 4.38125 7.29688C4.58125 7.63438 4.84375 7.89688 5.18125 8.08438C5.51875 8.27813 5.88125 8.37188 6.26875 8.37188V8.36563ZM6.24375 7.50313C5.8875 7.50313 5.575 7.37188 5.31875 7.11563C5.0625 6.85938 4.93125 6.55313 4.93125 6.19063C4.93125 5.82813 5.0625 5.52188 5.31875 5.26563C5.575 5.00938 5.88125 4.87813 6.24375 4.87813C6.60625 4.87813 6.9125 5.00938 7.16875 5.26563C7.425 5.52188 7.55625 5.82813 7.55625 6.19063C7.55625 6.55313 7.425 6.85938 7.16875 7.11563C6.9125 7.37188 6.60625 7.50313 6.24375 7.50313Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}.partner-details__website::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='16' viewBox='0 0 18 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.61587 2.96889C2.61587 2.75109 2.79633 2.57062 3.01413 2.57062C3.23192 2.57062 3.41238 2.75109 3.41238 2.96889C3.41238 3.18669 3.23192 3.36716 3.01413 3.36716C2.79633 3.36716 2.61587 3.18669 2.61587 2.96889ZM4.21512 2.96889C4.21512 2.75109 4.39558 2.57062 4.61338 2.57062C4.83117 2.57062 5.01163 2.75109 5.01163 2.96889C5.01163 3.18669 4.83117 3.36716 4.61338 3.36716C4.39558 3.36716 4.21512 3.18669 4.21512 2.96889ZM5.81438 2.96889C5.81438 2.75109 5.99484 2.57062 6.21264 2.57062C6.43043 2.57062 6.61089 2.75109 6.61089 2.96889C6.61089 3.18669 6.43043 3.36716 6.21264 3.36716C5.99484 3.36716 5.81438 3.18669 5.81438 2.96889ZM17.2518 .697559H1.19085C.811258 .697559 .506348 1.0025 .506348 1.38209V14.6179C.506348 14.9975 .811258 15.3024 1.19085 15.3024H17.2518C17.6314 15.3024 17.9363 14.9975 17.9363 14.6179V1.38209C17.9363 1.0025 17.6314 .697559 17.2518 .697559ZM16.5673 2.06035V3.90853H1.86914V2.06035H16.5673ZM1.86914 13.9334V4.78593H16.5673V13.9334H1.86914Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}#partnerSidebar{border-radius:4px;background-color:#fff;padding:24px 24px 32px;border-bottom:6px solid #29b5e8}#partnerSidebar h5,.newsletter-disclaimer p{font-size:14px!important}#partnerSidebar ul{margin-top:0;list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px}#partnerSidebar li{border:1px solid;border-radius:2px;padding:0 4px!important;font-size:11px!important;letter-spacing:.25px;text-transform:uppercase}div.snowflake-partner-hero-card{width:100%;margin:0}.partner-details__logo{max-width:380px;margin:0 auto}@media screen and (max-width:767px){.left-alignment .hp-hero__subheadline{margin-left:auto;margin-right:auto}.left-alignment .hp-hero__headline .snowflake-title-v2-line,.left-alignment .hp-hero__subheadline .snowflake-title-v2-line{text-align:center}.hero--home__inner .snowflake-flexible-column-container-items-top-padding-large{padding-top:var(--spacing-02)}.section--logo-bar\u003E.snowflake-flexible-column-container-items{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:center;gap:8px}.section--logo-bar\u003E.snowflake-flexible-column-container-items\u003Ediv{width:calc(33.33% - 8px)}.partner-sidebar__mobile-expand{display:inline-block;color:#249edc;border-color:#249edc!important}#partnerSidebar li:nth-child(n+6),.summit-nav__links .snowflake-button-tertiary{display:none}.sc-body__sidebar{background-color:#f6f9fa;padding:24px}.sc-body__content{padding:0 24px 24px}.summit-speaker-card .snowflake-card-v2-advanced-content{padding:24px}}#partnerResources h6,.snowflake-tabs-navigation-item p.body-1{font-size:16px!important}#partnerResources .section--resource-hub{padding:0 16px}#partnerResources .section--resource-hub a,.bwalignl{text-align:left}@media screen and (max-width:1023px){.hero--workload .snowflake-hero-system-media-container{width:100%}}.section--timely-content .snowflake-content-chip,.snowflake-mega-nav-dropdown-footer-wrapper{align-items:center}.section--timely-content .snowflake-content-chip-image{max-width:94px}.section--timely-content .snowflake-content-chip-image__inner{line-height:0}.section--timely-content .snowflake-content-chip-image__image{aspect-ratio:1;height:auto}.section--workload-overview .workload-overview__headline{max-width:280px;margin:0 auto}#industryPartnerSlider .swiper-slide{margin-top:0!important;padding:0 12px}#industryPartnerSlider .snowflake-tabs-navigation-item{margin-left:0!important;margin-right:0!important}#industryPartnerSlider .snowflake-premium-content-banner-background-grad-white .snowflake-premium-content-banner{box-shadow:none}#industryPartnerSlider .logo-slider__slide .aem-container{display:flex;padding:0 8px!important;flex-wrap:wrap;gap:16px!important;justify-content:center}#industryPartnerSlider .logo-slider__slide .aem-container\u003Ediv{width:48%;max-width:200px}#useCaseTabs{padding-top:24px;padding-bottom:24px;padding-right:24px}#useCaseTabs .tab-content.is-active{display:block}#useCaseTabs .vert-tab{border-bottom:1px solid #a0bbcc;padding-bottom:16px}#useCaseTabs .vert-tab p{display:inline-block}#useCaseTabs .vert-tab p:hover{cursor:pointer}#useCaseTabs .vert-tab p,#useCaseTabs .vert-tab.is-active p.not-active{color:#249edc}#useCaseTabs .vert-tab p.is-active,#useCaseTabs .vert-tab.is-active p{color:#000}#industryPlatformSection{background-image:url(/adobe/dynamicmedia/deliver/dm-aid--db074ad5-7122-4c51-87a3-76c3aa466182/double-arrow-bg%403x.png);background-repeat:no-repeat}.snowflake-text p.featured-quote__source{font-weight:900!important;text-transform:uppercase;font-size:16px!important;margin-top:2rem!important}.snowflake-text p.featured-quote__title{margin-top:0!important;font-size:16px!important}.snowflake-case-study-card-logo img{width:auto!important;height:100px!important;transform:translateX(-15%)}.snowflake-quote-item-quote-text{font-weight:600!important}#customerStoryStatsInner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row}#customerStoryStat1,#customerStoryStat2{max-width:240px}#storyHighlights{border-radius:4px;padding:1rem}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line,.summit-pricing-block__tile .black-blue-text-color .snowflake-title-v2-line{color:#000!important}.snowflake-youtube-embedded-wrapper{border-radius:var(--small-border-radius)}#arcticNavItem::before,#offset::before,#open-source::before{color:var(--text-05);font-family:Texta,sans-serif!important}#offset,.sc-architecture-caption{margin-top:16px}.hero--press .snowflake-title-v2-line{text-transform:none!important}@media screen and (min-width:768px){.subpage-timely-content__inner\u003E.snowflake-flexible-column-container-items{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25);padding:var(--spacing-04);border-radius:4px;overflow:hidden}#partnerLogoSquare{padding:0 0 0 48px}.hero--workload .snowflake-container{max-width:1440px;margin:0 auto!important;align-items:center}#industryPartnerSlider.snowflake-flexible-column-container-2-column-40-60\u003E.snowflake-flexible-column-container-items{grid-template-columns:minmax(40%,4fr) minmax(0,6fr)}#industryPartnerSlider .swiper-slide{padding:0 24px}.sc-body{padding:48px}.sc-body\u003E.snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:124px}}.snowflake-button-container.has-icon{display:inline-flex;justify-content:center;align-items:center;text-align:left}.snowflake-button-container.has-icon::before{content:\"\";display:inline-block;width:20px;height:20px;margin-right:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.snowflake-button-container.is-video::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 1.28663C13.2523 1.28663 16.7134 4.74768 16.7134 9C16.7134 13.2523 13.2523 16.7134 9 16.7134C4.74768 16.7198 1.28663 13.2588 1.28663 9C1.28663 4.74124 4.74768 1.28663 9 1.28663ZM9 0C4.0336 0 0 4.0336 0 9C0 13.9664 4.0336 18 9 18C13.9728 18 18 13.9664 18 9C18 4.0336 13.9728 0 9 0Z' fill='white'/%3E%3Cpath d='M7.75106 6.18211C7.42941 6.16925 7.16565 6.42658 7.16565 6.74823V11.2772C7.16565 11.7082 7.65457 11.9848 8.02126 11.7597L11.7975 9.4952C12.1578 9.27647 12.1578 8.74252 11.7975 8.52379L8.02126 6.25931C7.93763 6.21428 7.84756 6.18211 7.75106 6.18211Z' fill='white'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-github::before{background-image:url(\"data:image/svg+xml,%3Csvg width='20' height='21' viewBox='0 0 20 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 .651794C4.475 .651794 0 5.12679 0 10.6518C0 15.0768 2.8625 18.8143 6.8375 20.1393C7.3375 20.2268 7.525 19.9268 7.525 19.6643C7.525 19.4268 7.5125 18.6393 7.5125 17.8018C5 18.2643 4.35 17.1893 4.15 16.6268C4.0375 16.3393 3.55 15.4518 3.125 15.2143C2.775 15.0268 2.275 14.5643 3.1125 14.5518C3.9 14.5393 4.4625 15.2768 4.65 15.5768C5.55 17.0893 6.9875 16.6643 7.5625 16.4018C7.65 15.7518 7.9125 15.3143 8.2 15.0643C5.975 14.8143 3.65 13.9518 3.65 10.1268C3.65 9.03929 4.0375 8.13929 4.675 7.43929C4.575 7.18929 4.225 6.16429 4.775 4.78929C4.775 4.78929 5.6125 4.52679 7.525 5.81429C8.325 5.58929 9.175 5.47679 10.025 5.47679C10.875 5.47679 11.725 5.58929 12.525 5.81429C14.4375 4.51429 15.275 4.78929 15.275 4.78929C15.825 6.16429 15.475 7.18929 15.375 7.43929C16.0125 8.13929 16.4 9.02679 16.4 10.1268C16.4 13.9643 14.0625 14.8143 11.8375 15.0643C12.2 15.3768 12.5125 15.9768 12.5125 16.9143C12.5125 18.2518 12.5 19.3268 12.5 19.6643C12.5 19.9268 12.6875 20.2393 13.1875 20.1393C17.1375 18.8143 20 15.0643 20 10.6518C20 5.12679 15.525 .651794 10 .651794Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-quickstart::before{background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='21' viewBox='0 0 15 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8489 2.79368H11.6439V2.38493C11.6439 1.71368 11.1451 .967427 10.4251 .967427H8.94762C8.80887 .359927 8.37387 .299927 7.89762 .299927H7.23012C6.85512 .299927 6.26637 .299927 6.08637 .967427H4.68387C3.94887 .967427 3.35637 1.74368 3.35637 2.38493V2.79368H1.15137C.738867 2.79368 .401367 3.13118 .401367 3.54368V20.2537C.401367 20.6662 .738867 21.0037 1.15137 21.0037H13.8489C14.2614 21.0037 14.5989 20.6662 14.5989 20.2537V3.54368C14.5989 3.13118 14.2614 2.79368 13.8489 2.79368ZM4.29387 2.38493C4.29387 2.18243 4.54137 1.90493 4.68387 1.90493H6.50262C6.76137 1.90493 6.97137 1.69493 6.97137 1.43618C6.97137 1.33868 6.97887 1.27868 6.98637 1.24118C7.05012 1.23368 7.15512 1.23368 7.23387 1.23368H7.90137C7.95012 1.23368 8.00637 1.23368 8.05137 1.23368C8.05512 1.27868 8.05887 1.34243 8.05887 1.43243C8.05887 1.69118 8.26887 1.90118 8.52762 1.90118H10.4289C10.5301 1.90118 10.7101 2.14493 10.7101 2.38118V2.78993H4.29762V2.38118L4.29387 2.38493ZM13.0989 19.4999H1.90137V4.29368H13.0989V19.5037V19.4999Z' fill='%23249EDC'/%3E%3Cpath d='M3.82512 16.0424H11.1751C11.4339 16.0424 11.6439 15.8324 11.6439 15.5736V6.88486C11.6439 6.62611 11.4339 6.41611 11.1751 6.41611H3.82512C3.56637 6.41611 3.35637 6.62611 3.35637 6.88486V15.5736C3.35637 15.8324 3.56637 16.0424 3.82512 16.0424ZM4.29387 15.1049V13.3686H10.7064V15.1049H4.29387ZM10.7101 7.35361V12.4311H4.29762V7.35361H10.7101Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 9.35989H8.83887C9.09762 9.35989 9.30762 9.14989 9.30762 8.89114C9.30762 8.63239 9.09762 8.42239 8.83887 8.42239H6.16512C5.90637 8.42239 5.69637 8.63239 5.69637 8.89114C5.69637 9.14989 5.90637 9.35989 6.16512 9.35989Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 11.3624H8.83887C9.09762 11.3624 9.30762 11.1524 9.30762 10.8937C9.30762 10.6349 9.09762 10.4249 8.83887 10.4249H6.16512C5.90637 10.4249 5.69637 10.6349 5.69637 10.8937C5.69637 11.1524 5.90637 11.3624 6.16512 11.3624Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-download::before{background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='18' viewBox='0 0 16 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.2017 17.1637H.798265C.364425 17.1637 0 16.7993 0 16.3655V12.3568C0 11.923 .364425 11.5585 .798265 11.5585C1.2321 11.5585 1.59653 11.923 1.59653 12.3568V15.5498H14.4035V12.3568C14.4035 11.923 14.7679 11.5585 15.2017 11.5585C15.6356 11.5585 16 11.923 16 12.3568V16.3655C16 16.7993 15.6529 17.1637 15.2017 17.1637Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.84381 12.9642 7.73969 12.9468 7.63557 12.8947C7.34056 12.7733 7.14967 12.4783 7.14967 12.1485L7.18437 .938127C7.18437 .504287 7.5488 .139862 7.98264 .139862C8.41648 .139862 8.7809 .504287 8.7809 .938127L8.7462 10.257L12.8416 6.33509C13.154 6.02273 13.6746 6.04008 13.9696 6.35244C14.282 6.66481 14.2646 7.18542 13.9523 7.48043L8.50325 12.7386C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.73969 12.9642 7.54881 12.8947 7.39262 12.7386L2.03037 7.53249C1.718 7.22012 1.70065 6.71687 2.01301 6.40451C2.32538 6.09214 2.82863 6.07479 3.141 6.38715L8.50325 11.5932C8.81562 11.9056 8.83297 12.4088 8.52061 12.7212C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-expand::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64375 10.9125C6.9375 11.2062 6.93125 11.6812 6.64375 11.9687L2.57502 16H3.79375C4.20625 16 4.54376 16.3375 4.54376 16.75C4.54376 17.1625 4.20625 17.5 3.79375 17.5H.756264C.556264 17.5 .36876 17.4187 .22501 17.2812C.22501 17.2812 .206248 17.25 .193748 17.2375C.143748 17.1812 .100004 17.1125 .0625038 17.0437C.0375038 16.9687 .0187492 16.8937 .0187492 16.8187C.0187492 16.8 .0062561 16.7813 .0062561 16.7625V13.725C.0187561 13.3125 .356257 12.9875 .768757 12.9937C1.16876 13 1.48752 13.325 1.50002 13.725V14.9688L5.5875 10.9187C5.88125 10.6312 6.35 10.6312 6.64375 10.9187V10.9125ZM17.5063 .743732C17.5063 .543732 17.425 .356235 17.2875 .218735C17.2875 .218735 17.2562 .199998 17.2437 .193748C17.1875 .137498 17.1188 .0937347 17.0438 .0624847C16.9688 .0374847 16.8938 .0187492 16.8188 .0187492C16.8 .0187492 16.7813 .00623703 16.7625 .00623703H13.725C13.3125 .00623703 12.975 .343745 12.975 .756245C12.975 1.16874 13.3125 1.50623 13.725 1.50623H14.9688L11.1312 5.37498C10.8437 5.67498 10.8563 6.14999 11.1563 6.43124C11.45 6.71249 11.9063 6.70624 12.1938 6.43124L16.0125 2.575V3.79375C16.0125 4.20625 16.35 4.54372 16.7625 4.54372C17.175 4.54372 17.5125 4.20625 17.5125 3.79375V.756245L17.5063 .743732ZM16.7562 12.9688C16.3437 12.9688 16.0063 13.3063 16.0063 13.7188V14.8937L12.1938 10.925C11.9063 10.625 11.4375 10.6188 11.1375 10.9063C10.8375 11.1938 10.8313 11.6625 11.1188 11.9625L15 16.0062H13.7188C13.3063 16.0062 12.9688 16.3437 12.9688 16.7562C12.9688 17.1687 13.3063 17.5063 13.7188 17.5063H16.7562C16.85 17.5063 16.95 17.4875 17.0375 17.45C17.0875 17.425 17.1313 17.3937 17.175 17.3625C17.2063 17.3437 17.2438 17.325 17.275 17.3C17.3313 17.2375 17.375 17.1687 17.4125 17.1C17.4188 17.0875 17.4375 17.075 17.4438 17.0562C17.45 17.025 17.4563 16.9938 17.4625 16.9625C17.4813 16.9 17.5 16.8375 17.5 16.7687V13.725C17.5 13.3125 17.1687 12.975 16.7562 12.975V12.9688ZM.750008 4.53125C1.16251 4.53125 1.50002 4.19374 1.50002 3.78124V2.5L5.59376 6.43124C5.89376 6.71874 6.36251 6.70626 6.65001 6.41251C6.93751 6.11876 6.92501 5.64375 6.63126 5.35625L2.61251 1.49998H3.7875C4.2 1.49998 4.53751 1.16249 4.53751 .749989C4.53751 .337489 4.2 0 3.7875 0H.743752C.668752 0 .600004 .0187355 .531254 .0437355C.506254 .0499855 .481263 .0437477 .462513 .0562477C.443763 .0687477 .425015 .0812462 .406265 .0937462C.337515 .124996 .275004 .168741 .218754 .224991H.212498C.212498 .224991 .175 .28125 .15625 .3125C.11875 .3625 .0812477 .4125 .0562477 .46875C.0374977 .525 .0249992 .587499 .0187492 .643749C.0124992 .674999 0 .712482 0 .743732V3.78124C0 4.19374 .337508 4.53125 .750008 4.53125Z' fill='white'/%3E%3C/svg%3E%0A\")}@keyframes slow-scroll{100%{transform:translateY(-50%)}}.sc-hero{overflow:hidden;background-color:#212d35;background-repeat:repeat-y;background-image:url(\"data:image/svg+xml,%3Csvg width='389' height='17' viewBox='0 0 389 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M.638672 7.80824L.638672 9.2566C.638672 9.52364 .85538 9.74024 1.12262 9.74024H2.57204C2.83928 9.74024 3.05598 9.52364 3.05598 9.2566V7.80824C3.05598 7.54119 2.83928 7.32472 2.57204 7.32472L1.12262 7.32472C.85538 7.32472 .638672 7.54119 .638672 7.80824Z' fill='url(%23paint0_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.9639 7.80824V9.2566C10.9639 9.52364 11.1806 9.74024 11.4478 9.74024L12.8972 9.74024C13.1645 9.74024 13.3812 9.52364 13.3812 9.2566V7.80824C13.3812 7.54119 13.1645 7.32471 12.8972 7.32471L11.4478 7.32471C11.1806 7.32471 10.9639 7.54119 10.9639 7.80824Z' fill='url(%23paint1_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M21.2891 7.80823V9.2566C21.2891 9.52364 21.5058 9.74024 21.773 9.74024L23.2224 9.74024C23.4897 9.74024 23.7064 9.52364 23.7064 9.2566V7.80823C23.7064 7.54119 23.4897 7.32471 23.2224 7.32471L21.773 7.32471C21.5058 7.32471 21.2891 7.54119 21.2891 7.80823Z' fill='url(%23paint2_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M31.6143 7.80823V9.2566C31.6143 9.52364 31.831 9.74024 32.0982 9.74024H33.5476C33.8149 9.74024 34.0316 9.52364 34.0316 9.2566V7.80823C34.0316 7.54119 33.8149 7.32471 33.5476 7.32471L32.0982 7.32471C31.831 7.32471 31.6143 7.54119 31.6143 7.80823Z' fill='url(%23paint3_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M41.9395 7.80823V9.2566C41.9395 9.52364 42.1562 9.74024 42.4234 9.74024H43.8728C44.1401 9.74024 44.3568 9.52364 44.3568 9.2566V7.80823C44.3568 7.54119 44.1401 7.32471 43.8728 7.32471L42.4234 7.32471C42.1562 7.32471 41.9395 7.54119 41.9395 7.80823Z' fill='url(%23paint4_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M52.5076 7.80823V9.2566C52.5076 9.52364 52.7243 9.74024 52.9916 9.74024H54.441C54.7082 9.74024 54.9249 9.52364 54.9249 9.2566V7.80823C54.9249 7.54119 54.7082 7.32471 54.441 7.32471L52.9916 7.32471C52.7243 7.32471 52.5076 7.54119 52.5076 7.80823Z' fill='url(%23paint5_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M62.8331 7.80823V9.2566C62.8331 9.52364 63.0493 9.74024 63.3165 9.74024H64.7664C65.0332 9.74024 65.2504 9.52364 65.2504 9.2566V7.80823C65.2504 7.54119 65.0332 7.32471 64.7664 7.32471L63.3165 7.32471C63.0493 7.32471 62.8331 7.54119 62.8331 7.80823Z' fill='url(%23paint6_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M73.1583 7.80823V9.2566C73.1583 9.52364 73.3745 9.74024 73.6417 9.74024H75.0916C75.3584 9.74024 75.5756 9.52364 75.5756 9.2566V7.80823C75.5756 7.54119 75.3584 7.32471 75.0916 7.32471L73.6417 7.32471C73.3745 7.32471 73.1583 7.54119 73.1583 7.80823Z' fill='url(%23paint7_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M83.4835 7.80823V9.2566C83.4835 9.52364 83.6997 9.74024 83.9669 9.74024H85.4168C85.6836 9.74024 85.9008 9.52364 85.9008 9.2566V7.80823C85.9008 7.54119 85.6836 7.32471 85.4168 7.32471L83.9669 7.32471C83.6997 7.32471 83.4835 7.54119 83.4835 7.80823Z' fill='url(%23paint8_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M93.8087 7.80823V9.2566C93.8087 9.52364 94.0249 9.74024 94.2921 9.74024H95.742C96.0088 9.74024 96.226 9.52364 96.226 9.2566V7.80823C96.226 7.54119 96.0088 7.32471 95.742 7.32471L94.2921 7.32471C94.0249 7.32471 93.8087 7.54119 93.8087 7.80823Z' fill='url(%23paint9_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M104.134 7.80823V9.2566C104.134 9.52364 104.35 9.74024 104.617 9.74024H106.067C106.334 9.74024 106.551 9.52364 106.551 9.2566V7.80823C106.551 7.54119 106.334 7.32471 106.067 7.32471L104.617 7.32471C104.35 7.32471 104.134 7.54119 104.134 7.80823Z' fill='url(%23paint10_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M114.702 7.80823V9.2566C114.702 9.52364 114.918 9.74024 115.185 9.74024L116.635 9.74024C116.902 9.74024 117.119 9.52364 117.119 9.25659V7.80823C117.119 7.54119 116.902 7.32471 116.635 7.32471L115.185 7.32471C114.918 7.32471 114.702 7.54119 114.702 7.80823Z' fill='url(%23paint11_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M125.027 7.80823V9.25659C125.027 9.52364 125.243 9.74024 125.511 9.74024L126.961 9.74024C127.227 9.74024 127.445 9.52364 127.445 9.25659V7.80823C127.445 7.54119 127.227 7.32471 126.961 7.32471L125.511 7.32471C125.243 7.32471 125.027 7.54119 125.027 7.80823Z' fill='url(%23paint12_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M135.352 7.80823V9.25659C135.352 9.52364 135.569 9.74024 135.836 9.74024H137.286C137.553 9.74024 137.77 9.52364 137.77 9.25659V7.80823C137.77 7.54119 137.553 7.32471 137.286 7.32471L135.836 7.32471C135.569 7.32471 135.352 7.54119 135.352 7.80823Z' fill='url(%23paint13_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M145.678 7.80823V9.25659C145.678 9.52364 145.894 9.74024 146.161 9.74024H147.611C147.878 9.74024 148.095 9.52364 148.095 9.25659V7.80823C148.095 7.54119 147.878 7.32471 147.611 7.32471L146.161 7.32471C145.894 7.32471 145.678 7.54119 145.678 7.80823Z' fill='url(%23paint14_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M156.003 7.80823V9.25659C156.003 9.52364 156.219 9.74024 156.486 9.74024H157.936C158.203 9.74024 158.42 9.52364 158.42 9.25659V7.80823C158.42 7.54119 158.203 7.32471 157.936 7.32471L156.486 7.32471C156.219 7.32471 156.003 7.54119 156.003 7.80823Z' fill='url(%23paint15_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M166.328 7.80823V9.25659C166.328 9.52363 166.544 9.74024 166.811 9.74024H168.261C168.528 9.74024 168.745 9.52363 168.745 9.25659V7.80823C168.745 7.54119 168.528 7.32471 168.261 7.32471L166.811 7.32471C166.544 7.32471 166.328 7.54119 166.328 7.80823Z' fill='url(%23paint16_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M176.896 7.80823V9.25659C176.896 9.52363 177.112 9.74023 177.38 9.74023H178.83C179.096 9.74023 179.313 9.52363 179.313 9.25659V7.80823C179.313 7.54119 179.096 7.32471 178.83 7.32471L177.38 7.32471C177.112 7.32471 176.896 7.54119 176.896 7.80823Z' fill='url(%23paint17_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M187.221 7.80823V9.25659C187.221 9.52363 187.438 9.74023 187.705 9.74023H189.155C189.421 9.74023 189.639 9.52363 189.639 9.25659V7.80823C189.639 7.54119 189.421 7.32471 189.155 7.32471L187.705 7.32471C187.438 7.32471 187.221 7.54119 187.221 7.80823Z' fill='url(%23paint18_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M199.639 7.80824V9.2566C199.639 9.52364 199.855 9.74024 200.123 9.74024H201.572C201.839 9.74024 202.056 9.52364 202.056 9.2566V7.80824C202.056 7.54119 201.839 7.32472 201.572 7.32472L200.123 7.32472C199.855 7.32472 199.639 7.54119 199.639 7.80824Z' fill='url(%23paint19_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M209.964 7.80824V9.2566C209.964 9.52364 210.181 9.74024 210.448 9.74024L211.897 9.74024C212.164 9.74024 212.381 9.52364 212.381 9.2566V7.80824C212.381 7.54119 212.164 7.32471 211.897 7.32471L210.448 7.32471C210.181 7.32471 209.964 7.54119 209.964 7.80824Z' fill='url(%23paint20_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M220.289 7.80823V9.2566C220.289 9.52364 220.506 9.74024 220.773 9.74024L222.222 9.74024C222.49 9.74024 222.706 9.52364 222.706 9.2566V7.80823C222.706 7.54119 222.49 7.32471 222.222 7.32471L220.773 7.32471C220.506 7.32471 220.289 7.54119 220.289 7.80823Z' fill='url(%23paint21_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M230.614 7.80823V9.2566C230.614 9.52364 230.831 9.74024 231.098 9.74024H232.548C232.815 9.74024 233.032 9.52364 233.032 9.2566V7.80823C233.032 7.54119 232.815 7.32471 232.548 7.32471L231.098 7.32471C230.831 7.32471 230.614 7.54119 230.614 7.80823Z' fill='url(%23paint22_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M240.939 7.80823V9.2566C240.939 9.52364 241.156 9.74024 241.423 9.74024H242.873C243.14 9.74024 243.357 9.52364 243.357 9.2566V7.80823C243.357 7.54119 243.14 7.32471 242.873 7.32471L241.423 7.32471C241.156 7.32471 240.939 7.54119 240.939 7.80823Z' fill='url(%23paint23_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M251.508 7.80823V9.2566C251.508 9.52364 251.724 9.74024 251.992 9.74024H253.441C253.708 9.74024 253.925 9.52364 253.925 9.2566V7.80823C253.925 7.54119 253.708 7.32471 253.441 7.32471L251.992 7.32471C251.724 7.32471 251.508 7.54119 251.508 7.80823Z' fill='url(%23paint24_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M261.833 7.80823V9.2566C261.833 9.52364 262.049 9.74024 262.317 9.74024H263.766C264.033 9.74024 264.25 9.52364 264.25 9.2566V7.80823C264.25 7.54119 264.033 7.32471 263.766 7.32471L262.317 7.32471C262.049 7.32471 261.833 7.54119 261.833 7.80823Z' fill='url(%23paint25_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M272.158 7.80823V9.2566C272.158 9.52364 272.374 9.74024 272.642 9.74024H274.092C274.358 9.74024 274.576 9.52364 274.576 9.2566L274.576 7.80823C274.576 7.54119 274.358 7.32471 274.092 7.32471L272.642 7.32471C272.374 7.32471 272.158 7.54119 272.158 7.80823Z' fill='url(%23paint26_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M282.483 7.80823V9.2566C282.483 9.52364 282.7 9.74024 282.967 9.74024H284.417C284.684 9.74024 284.901 9.52364 284.901 9.2566V7.80823C284.901 7.54119 284.684 7.32471 284.417 7.32471L282.967 7.32471C282.7 7.32471 282.483 7.54119 282.483 7.80823Z' fill='url(%23paint27_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M292.809 7.80823L292.809 9.2566C292.809 9.52364 293.025 9.74024 293.292 9.74024H294.742C295.009 9.74024 295.226 9.52364 295.226 9.2566V7.80823C295.226 7.54119 295.009 7.32471 294.742 7.32471L293.292 7.32471C293.025 7.32471 292.809 7.54119 292.809 7.80823Z' fill='url(%23paint28_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M303.134 7.80823L303.134 9.2566C303.134 9.52364 303.35 9.74024 303.617 9.74024H305.067C305.334 9.74024 305.551 9.52364 305.551 9.2566V7.80823C305.551 7.54119 305.334 7.32471 305.067 7.32471L303.617 7.32471C303.35 7.32471 303.134 7.54119 303.134 7.80823Z' fill='url(%23paint29_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M313.702 7.80823L313.702 9.2566C313.702 9.52364 313.918 9.74024 314.185 9.74024L315.635 9.74024C315.902 9.74024 316.119 9.52364 316.119 9.25659V7.80823C316.119 7.54119 315.902 7.32471 315.635 7.32471L314.185 7.32471C313.918 7.32471 313.702 7.54119 313.702 7.80823Z' fill='url(%23paint30_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M324.027 7.80823V9.25659C324.027 9.52364 324.243 9.74024 324.511 9.74024L325.961 9.74024C326.227 9.74024 326.445 9.52364 326.445 9.25659V7.80823C326.445 7.54119 326.227 7.32471 325.961 7.32471L324.511 7.32471C324.243 7.32471 324.027 7.54119 324.027 7.80823Z' fill='url(%23paint31_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M334.352 7.80823V9.25659C334.352 9.52364 334.569 9.74024 334.836 9.74024H336.286C336.553 9.74024 336.77 9.52364 336.77 9.25659L336.77 7.80823C336.77 7.54119 336.553 7.32471 336.286 7.32471L334.836 7.32471C334.569 7.32471 334.352 7.54119 334.352 7.80823Z' fill='url(%23paint32_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M344.678 7.80823V9.25659C344.678 9.52364 344.894 9.74024 345.161 9.74024H346.611C346.878 9.74024 347.095 9.52364 347.095 9.25659L347.095 7.80823C347.095 7.54119 346.878 7.32471 346.611 7.32471L345.161 7.32471C344.894 7.32471 344.678 7.54119 344.678 7.80823Z' fill='url(%23paint33_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M355.003 7.80823V9.25659C355.003 9.52364 355.219 9.74024 355.486 9.74024H356.936C357.203 9.74024 357.42 9.52364 357.42 9.25659L357.42 7.80823C357.42 7.54119 357.203 7.32471 356.936 7.32471L355.486 7.32471C355.219 7.32471 355.003 7.54119 355.003 7.80823Z' fill='url(%23paint34_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M365.328 7.80823V9.25659C365.328 9.52363 365.544 9.74024 365.811 9.74024H367.261C367.528 9.74024 367.745 9.52363 367.745 9.25659V7.80823C367.745 7.54119 367.528 7.32471 367.261 7.32471L365.811 7.32471C365.544 7.32471 365.328 7.54119 365.328 7.80823Z' fill='url(%23paint35_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M375.896 7.80823V9.25659C375.896 9.52363 376.112 9.74023 376.38 9.74023H377.83C378.096 9.74023 378.313 9.52363 378.313 9.25659V7.80823C378.313 7.54119 378.096 7.32471 377.829 7.32471L376.38 7.32471C376.112 7.32471 375.896 7.54119 375.896 7.80823Z' fill='url(%23paint36_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M386.221 7.80823V9.25659C386.221 9.52363 386.438 9.74023 386.705 9.74023H388.155C388.421 9.74023 388.639 9.52363 388.639 9.25659V7.80823C388.639 7.54119 388.421 7.32471 388.155 7.32471L386.705 7.32471C386.438 7.32471 386.221 7.54119 386.221 7.80823Z' fill='url(%23paint37_linear_8295_70635)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint1_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint2_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint3_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint4_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint5_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint6_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint7_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint8_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint9_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint10_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint11_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint12_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint13_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint14_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint15_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint16_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint17_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint18_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint19_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint20_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint21_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint22_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint23_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint24_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint25_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint26_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint27_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint28_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint29_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint30_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint31_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint32_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint33_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint34_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint35_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint36_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint37_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E%0A\")}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:first-child{position:relative;z-index:3}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:absolute;height:100%;width:100%;top:0;left:-24px}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{content:\"\";display:block;z-index:1;position:absolute;top:-64px;left:0;width:150%;height:calc(100% + 160px);background-color:rgb(32 44 53 / .9)}.sc-body__content .heading-3-v2,.sc-hero__headline .heading-1-v2{text-transform:none}.sc-body__content span.snowflake-image-caption{display:block!important;font-style:italic}.sc-body__content .snowflake-text p+ul{margin-top:24px!important;padding-left:16px!important}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#e9eaeb!important;font-size:16px}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification.is-large .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#fff!important;font-size:18px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child{display:flex;justify-content:flex-start;align-items:center;gap:8px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child::before{content:\"\";display:inline-block;width:16px;height:16px;background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 0C3.58146 0 0 3.58146 0 8C0 12.4185 3.58146 16 8 16C12.4185 16 16 12.4185 16 8C16 3.58146 12.4185 0 8 0ZM12.7184 5.91984L7.33471 11.3026C7.31293 11.3244 7.31293 11.3454 7.29198 11.3454L7.20653 11.4308C6.94933 11.688 6.54132 11.7525 6.21962 11.6235C6.11238 11.5808 6.00514 11.5163 5.9197 11.4308L5.83425 11.3454C5.83425 11.3454 5.83425 11.3236 5.81246 11.3236L3.28149 8.79347C2.93799 8.44997 2.93799 7.87107 3.28149 7.50664L3.36694 7.42119C3.71044 7.07769 4.28934 7.07769 4.65377 7.42119L6.58401 9.35143L11.3877 4.5477C11.7312 4.2042 12.3101 4.2042 12.6746 4.5477L12.76 4.63315C13.0826 4.99758 13.0828 5.55541 12.7184 5.91984Z' fill='%230E8A16'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-color:#fff;border-radius:100%}.sc-hero__byline{padding-top:8px}.sc-hero__byline p{color:#e2e2e2;margin-top:0!important}.sc-hero pre[class*=language-]{overflow:visible}.snowflake-code-snippet,.snowflake-code-snippet code,.snowflake-code-snippet pre{font-size:16px}.sc-hero__code-snippet:not(pre)\u003Ecode[class*=language-],.sc-hero__code-snippet pre[class*=language-]{background:0 0}.sc-hero__code-snippet{opacity:.8;background-color:transparent!important;position:absolute;top:0;right:0;width:100%;animation:240s linear 1s forwards slow-scroll}.sc-hero__button-container .snowflake-flexible-column-container-items{padding:0 0 24px;margin-top:-8px;margin-left:24px}.sc-sidebar__partner-logo{width:100%;max-width:140px;margin-top:8px}.sc-sidebar__partner-logo .cmp-image__image{border-radius:0}.sc-tag-cluster.snowflake-text ul{list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px;margin:0}.sc-tag-cluster.snowflake-text li{color:#373f41;border-radius:4px;display:inline-block;padding:6px;text-transform:uppercase;letter-spacing:1px;font-size:12px!important;line-height:12px!important;margin:0!important;background-color:#f3f3f3}.sc-body .share-icon svg{height:24px;cursor:pointer}.sc-body .share-icon svg:hover path{fill:var(--ui-02)}.sc-overview__webinar-promo-banner{align-items:center;border:1px solid #ccc;padding:var(--spacing-02)}.sc-overview__webinar-promo-banner .snowflake-content-chip-image{max-width:32px;margin-right:var(--spacing-02);line-height:0}.sc-overview__webinar-promo-banner .snowflake-content-chip-image__image,.summit-speaker-card .snowflake-card-v2-advanced-image__image{aspect-ratio:1}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{font-size:14px;font-family:Lato,sans-serif}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child){font-weight:400}.sc-overview__webinar-promo-banner .snowflake-content-chip-button .snowflake-button-container{font-size:14px!important}.diagram-group__button{position:absolute;bottom:24px;right:24px;background-color:#212c35!important}.section--mountains-bottom,.summit-hp-hero{position:relative}.sc-cert-banner{background-color:#212d35;border-radius:8px;padding:24px;overflow:hidden}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;align-items:center}:root{--text-secondary:#706f6f;--summit-bg-ltblue:#eaf8fd;--summit-bg-blue:#249edc;--summit-border:#d2d1d4;--summit-border-radius:8px;--summit-card-padding:32px;--summit-card-padding-sm:28px}.section--mountains-bottom::after,.section--mountains-bottom::before{content:\"\";display:block;position:absolute;bottom:-1px;max-width:400px;background-size:100% auto;height:100%;width:30%;line-height:0;background-repeat:no-repeat}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center;align-items:center}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;margin:0 8px!important}.button-group .snowflake-button-container{font-family:Texta,sans-serif}.section--summit-bg-ltblue{background-color:var(--summit-bg-ltblue)}.section--summit-bg-blue,.summit-hero-secondary{background-color:var(--summit-bg-blue)}.section--mountains-bottom::before{left:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M401.523 308.761H0V0L181.63 182.431L228.479 135.531L401.523 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom left}.section--mountains-bottom::after{right:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 308.761H401.523V0L219.893 182.431L173.044 135.531L0 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom right}.summit-hp-hero{overflow:hidden}.summit-hero__bg-video{position:absolute;top:50%;left:50%;width:120%;height:100%;opacity:.3;transform:translate(-50%,-50%)}.summit-hero__bg-svg,.summit-prefooter__bg-image,.summit-secondary-hero__bg-image{position:absolute;bottom:0;left:0;width:100%}.summit-hp-promo-banner__headline .heading-4-v2{font-weight:900}.summit-hero-secondary .hero-lottie__left{position:absolute;bottom:0;left:0;width:30%;line-height:0}.summit-timeline__card::after,.summit-timeline__card::before{bottom:0;left:50%;position:absolute;display:block;background-color:var(--ui-01);content:\"\"}.summit-hero-secondary .snowflake-text p{font-size:24px!important;line-height:32px!important;max-width:720px;margin:0 auto}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:center}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;max-width:25%}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid #fff}.summit-timeline__card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding);position:relative;background-color:#fff}.summit-timeline__card::before{width:20px;height:20px;border-radius:100%;transform:translate(-50%,50%)}.summit-timeline__card::after{width:3px;height:50px;transform:translate(-50%,100%)}.summit-timeline-card__icon{width:48px;height:48px}.summit-timeline-card__headline .heading-3-v2{font-size:32px}.faq-group{border:1px solid var(--ui-12);border-radius:4px;background-color:#fff}.faq-group__question{padding:24px}.faq-group__question:hover{color:var(--ui-01);cursor:pointer}.faq-group__question .heading-4-v2,.faq-group__question .heading-5-v2{position:relative;padding-right:64px}.faq-group__question .heading-4-v2::after,.faq-group__question .heading-5-v2::after{content:\"\";display:block;width:32px;height:32px;background-image:url(\"data:image/svg+xml,%3Csvg width='29' height='16' viewBox='0 0 29 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M14.16 14.6807C14.2537 14.7957 14.3719 14.8884 14.506 14.952C14.64 15.0157 14.7866 15.0487 14.935 15.0487C15.0834 15.0487 15.2299 15.0157 15.3639 14.952C15.498 14.8884 15.6162 14.7957 15.71 14.6807V14.6807L28.51 2.00068C29.07 1.43068 29.07 .92068 28.51 .44068C27.95 -.0393204 27.43 -.11932 26.96 .44068L14.94 12.0007L2.99996 .45068C2.90725 .322624 2.7855 .218374 2.6447 .146483C2.50389 .0745926 2.34805 .0371094 2.18996 .0371094C2.03187 .0371094 1.87603 .0745926 1.73522 .146483C1.59442 .218374 1.47267 .322624 1.37996 .45068C.819961 .93068 .819961 1.45068 1.37996 2.01068L14.16 14.6807Z' fill='black'/%3E%3C/svg%3E%0A\");background-size:80% auto;background-repeat:no-repeat;background-position:center;position:absolute;top:-2px;right:0;transition:.3s 150ms}.faq-group__question .heading-5-v2::after{top:-4px}.faq-group__answer{max-height:0;overflow:hidden;width:95%;padding:0 24px;transition:.5s}.faq-group__answer\u003Espan{display:block;padding-bottom:24px}.is-open .faq-group__answer{max-height:600px;transition:1s}.is-open .faq-group__question .heading-4-v2::after,.is-open .faq-group__question .heading-5-v2::after{transform:rotate(180deg);transition:.3s}.summit-agenda{box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);border-radius:8px;background-color:#fff;max-width:980px;margin-left:auto;margin-right:auto;padding:40px;width:90%}.agenda-item{border-radius:8px;background-color:#d4f0fa;padding:16px;border-left:4px solid var(--ui-01);position:relative}.summit-pricing-block__tile.is-past,.summit-pricing-block__tile.is-upcoming{pointer-events:none;border-color:#d2d1d4}p.agenda-item__time{width:25%;font-family:Texta!important;font-size:32px!important;font-weight:900!important;text-transform:uppercase!important;max-width:140px}@media screen and (max-width:991px){#partnerResources .section--resource-hub .snowflake-button-link .snowflake-button-container{font-size:14px!important;line-height:20px!important;margin-top:4px}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items{display:flex;flex-direction:column}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items\u003Ediv{width:100%}.sc-cert-banner__left{text-align:center}.sc-cert-banner__left .solution-center-hero__certification .snowflake-title-v2-line{justify-content:center}.summit-hero__bg-video{width:200%}.summit-leadership-grid .snowflake-flexible-column-container-items{grid-template-columns:repeat(2,1fr)}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:50%!important;max-width:50%!important}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:none!important}.summit-agenda{padding:24px}p.agenda-item__time{font-size:24px!important;width:auto;white-space:nowrap;padding-right:24px}}.agenda-item\u003Espan{display:flex;align-items:center}.summit-add-on-block,.summit-pricing-block{border:1px solid #d2d1d4;border-radius:8px;overflow:hidden;box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);background-color:#fff}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 20px 20px}.summit-pricing-block__tile{padding:24px 20px;border-radius:4px;background:#fff;border:1px solid var(--ui-01);position:relative;transition:background-color .3s}.summit-pricing-block__tile:hover{background-color:var(--ui-01);transition:background-color .3s}.summit-pricing-block__tile.is-past{background-color:#d4f0fa}.summit-pricing-block__tile:hover .black-blue-text-color .snowflake-title-v2-line{color:#fff!important;transition:color .3s}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::after,.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::after,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-pricing-block__tile.is-past .snowflake-content-chip-button,.summit-pricing-block__tile.is-upcoming .snowflake-content-chip-button,.summit-speaker-card .snowflake-card-v2-advanced-tag-indicator{display:none}.summit-pricing-block__tile.is-past .black-blue-text-color .snowflake-title-v2-line{color:#7cc7eb!important}.summit-pricing-block__tile.is-upcoming .black-blue-text-color .snowflake-title-v2-line{color:#8c8c8c!important}.summit-pricing-block__aside{background-color:#d4f0fa;border:1px solid #d2d1d4;border-radius:8px;padding:24px;width:100%}.summit-pricing-block__aside li::marker{color:var(--ui-01)}.summit-pricing-block__aside-headline .heading-5-v2{font-weight:900;margin-bottom:12px}.summit-pricing-block__header{background:#000;padding:24px 40px}.summit-pricing-block__header .heading-4-v2{font-weight:900;letter-spacing:.5px}.bwwidth100,.snowflake-mega-nav-dropdown-footer-content,.summit-pricing-block__tile .black-blue-text-color{width:100%}.summit-pricing-block__tile .heading-5-v2{position:static}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:first-child{text-transform:uppercase;font-weight:900!important;letter-spacing:.25px;font-size:24px!important}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:nth-child(2){margin-top:8px;font-family:Lato,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:16px}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{font-weight:900!important;font-size:40px!important}.snowflake-mega-nav-nav-item\u003Ea:hover .snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title,.summit-pricing-block__tile:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:var(--ui-01)!important}.summit-pricing-block__tile:hover:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:#fff!important}.summit-pricing-block__tile.is-past .heading-5-v2 span.snowflake-title-v2-line:last-child{text-decoration:line-through}.summit-pricing-block__tile .snowflake-content-chip-button{margin-top:0;white-space:nowrap;display:none}.snowflake-card-v2-advanced.no-link{pointer-events:none!important}.snowpro-card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding-sm);display:flex;height:100%}.snowpro-card__headline{margin:24px 0 12px}.snowpro-card__pricing{margin-top:48px}.snowpro-card .snowflake-text .snowpro-card__price{color:var(--ui-01);font-weight:900;font-size:40px!important;font-family:Texta,sans-serif}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid var(--summit-border)}.summit-stat-card{padding:0 40px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:first-child{font-size:64px;line-height:52px;margin-bottom:8px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:last-child{font-size:32px;line-height:30px;margin-bottom:16px}.summit-speaker-card .snowflake-card-v2-advanced-title{margin-bottom:var(--spacing-01)}.summit-add-on-card{padding:24px;border:1px solid #d2d1d4;border-radius:8px}.summit-add-on__subhead{padding-left:40px;padding-right:40px}.partner-card__logo-grid,.partner-card__logo-single{padding:40px}.partner-card__logo-grid .snowflake-image-container .cmp-image__image,.partner-card__logo-single .snowflake-image-container .cmp-image__image{border-radius:0;max-width:240px;margin:0 auto}.partner-card\u003E.container,.partner-card\u003E.container\u003E.aem-container,.partner-card\u003E.container\u003E.cmp-container{height:100%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;gap:24px;align-items:stretch}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:40px 24px;justify-content:center;align-items:center}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important}.partner-card{border-radius:8px;border:1px solid #d2d1d4;overflow:hidden;height:100%;background-color:#fff}.partner-card__header{padding:16px 24px;border-bottom:1px solid #d2d1d4}.partner-card__header.is-purple{background-color:#7d44cf}.partner-card__header h4{display:flex;flex-direction:row!important;align-items:center;gap:12px}.partner-card__header h4::before{vertical-align:middle;content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='black'/%3E%3C/svg%3E%0A\")}.partner-card__header.is-purple h4::before{background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='white'/%3E%3C/svg%3E%0A\")}.sf-blue-mountains{background-size:90% auto;background-repeat:no-repeat;background-position:center bottom;background-image:url(\"data:image/svg+xml,%3Csvg width='1361' height='410' viewBox='0 0 1361 410' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1360.25 410L1065.53 114.309L976.256 203.875L773.049 0L364.393 410H1360.25Z' fill='%233AA8DF'/%3E%3Cpath d='M274.778 410L137.467 272.238L.15625 410H274.778Z' fill='%233AA8DF'/%3E%3C/svg%3E%0A\")}.bwalignr,.main-pr-body .bwalignr{text-align:right}.bwblockalignl{margin-left:0;margin-right:auto}.bwcellpmargin{margin-top:0;margin-bottom:0}.bwlistdisc{list-style-type:disc}.bwpadb3{padding-bottom:4px}.bwpadb4{padding-bottom:5px}.bwpadl0{padding-left:0}.bwpadl3{padding-left:15px}.bwpadl6{padding-left:30px}.bwpadl9{padding-left:45px}.bwpadl12{padding-left:60px}.bwpadr0{padding-right:0}.bwtablemarginb{margin-bottom:10px}.bwvertalignb{vertical-align:bottom}.bwvertalignt{vertical-align:top}.bwsinglebottom{border-bottom:1pt solid #000}.bwdoublebottom{border-bottom:2.25pt double #000}.bwwidth1{width:1%}.bwwidth2{width:2%}.bwwidth6{width:6%}.bwwidth7{width:7%}.bwwidth8{width:8%}.bwwidth10{width:10%}.bwwidth12{width:12%}.bwwidth32{width:32%}.bwwidth44{width:44%}.bwwidth72{width:72%}.bwwidth97{width:97%}.main-pr-body{font-size:18px;line-height:26px}.main-pr-body img{display:block;width:100%;height:auto!important;border-radius:var(--small-border-radius)}.main-pr-body table{width:100%;display:block}.main-pr-body tbody{background-color:#f7f7f7}.main-pr-body .bwsinglebottom{border-bottom:1pt solid #000!important}.main-pr-body td.bwwidth44{padding-right:40px}.main-pr-body .bw-release-story{font-family:Lato,sans-serif}.main-pr-body .bw-release-story sup,.snowflake-mega-nav-dropdown-header-content-right a{white-space:nowrap}.main-pr-body .bw-release-story\u003E*,.main-pr-body\u003Espan\u003E*{margin-bottom:2rem!important}.snowflake-text.main-pr-body tbody,.snowflake-text.main-pr-body tbody p{font-size:14px!important;line-height:20px!important;width:100%;display:block}.press-body .snowflake-flexible-column-container-items{gap:var(--spacing-08)}.about-snowflake{border:1px solid #ccc;background-color:var(--ui-background-05);padding:24px;border-radius:8px;margin-top:0}.about-snowflake__logo{max-width:140px;margin-top:16px}.hero--press .snowflake-hero-system-inner{max-width:1408px;margin:0 auto!important}#arcticNavItem{flex-direction:column}#arcticNavItem::before{content:\"Featured Open Source Technologies\";display:block;margin-top:48px;margin-bottom:24px;font-size:16px!important;line-height:16px!important;font-weight:800!important;text-transform:uppercase}@media screen and (min-width:768px){.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:relative;height:100%;top:auto;left:auto;width:auto}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{background:linear-gradient(180deg,#202c35 -7.5%,#fff0 51.25%,#202c35 107.69%)}.sc-hero__byline\u003Espan{display:flex;flex-wrap:wrap}.sc-hero__byline p:not(:last-child)::after{content:\"|\";margin:0 12px;opacity:.5}.sc-hero__button-container .snowflake-flexible-column-container-items{position:absolute;bottom:0;padding:0;margin:0 24px 0 0}.sc-hero__button-container .hero-watch-the-demo{padding:12px 16px!important;float:right;margin-bottom:48px;background-color:rgb(35 45 54 / .8)}.summit-overview-stat{padding:0 40px}.summit-timeline{border-bottom:3px solid var(--ui-01);margin-bottom:64px}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 40px 40px}#arcticNavItem::before{font-size:12px!important;margin-bottom:8px;margin-top:16px}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{line-height:20px!important}.snowflake-card .heading-2.snowflake-title-line{font-size:24px!important;line-height:28px!important}}@media screen and (min-width:992px){.hp-hero__eyebrow a{gap:12px;margin-left:0;margin-right:0}.hp-hero__eyebrow a::after{content:\"\";background-image:url(\"data:image/svg+xml,%3Csvg width='6' height='11' viewBox='0 0 6 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5.49134 5.79438C5.53447 5.75922 5.56923 5.71489 5.5931 5.66463C5.61697 5.61436 5.62935 5.55941 5.62935 5.50376C5.62935 5.44811 5.61697 5.39316 5.5931 5.34289C5.56923 5.29263 5.53447 5.2483 5.49134 5.21314L.736339 .413136C.522589 .203135 .331339 .203135 .151339 .413136C-.0286612 .623135 -.0586612 .818135 .151339 .994386L4.48634 5.50188L.155089 9.97938C.107068 10.0142 .0679743 10.0598 .0410153 10.1126C.0140562 10.1654 0 10.2238 0 10.2831C0 10.3424 .0140562 10.4009 .0410153 10.4537C.0679743 10.5065 .107068 10.5521 .155089 10.5869C.335089 10.7969 .530089 10.7969 .740089 10.5869L5.49134 5.79438Z' fill='black'/%3E%3C/svg%3E%0A\");display:inline-block;width:12px;height:12px;background-repeat:no-repeat;background-size:auto 100%;background-position:left center}.promo-banner--homepage{padding-top:32px}.homepage-banner-offset-container::after{height:50%}#storyHighlights{padding:2rem}.body-display-v2.snowflake-quote-item-quote-text{line-height:28px!important}.snowflake-hero-system-headline .heading-1-v2{line-height:48px;font-size:54px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-content{flex-direction:row;justify-content:space-between;align-items:center;width:100%}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{flex-direction:row}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child)::before{content:\"|\";margin:0 6px}.sc-cert-banner{padding:40px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{margin:0!important;width:50%}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;padding-right:24px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:240px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{width:70%;padding-left:40px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{width:30%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important;display:flex}.summit-pricing-block__tile .snowflake-content-chip-content{display:flex;flex-direction:row;align-items:center;width:calc(100% - 200px)}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{position:absolute;top:50%;transform:translate(0,-50%);right:40px}.press-body\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:sticky;top:120px}.snowflake-mega-nav-navigation-title:hover{color:var(--ui-01)}}@media screen and (min-width:1024px){.about-snowflake{padding:28px}.about-snowflake__logo{max-width:none;padding:0 0 0 48px;margin-bottom:0}.hero--press .snowflake-hero-system-layout-70-30 .snowflake-hero-system-content-container{width:85%}.snowflake-hero-system{padding-bottom:var(--spacing-04);padding-top:var(--spacing-07)}.hero--press .display-2-v2{font-size:64px;line-height:56px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container{flex-direction:row;flex-wrap:nowrap;align-items:center}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:280px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;margin-bottom:0!important}#polarisNavItem{margin-top:40px}.snowflake-mega-nav-nav-item-description{line-height:18px!important}.snowflake-mega-nav-column-items{gap:var(--spacing-01);grid-gap:var(--spacing-01)}.snowflake-mega-nav-navigation-title{text-transform:none}}div[id*=blueIcon] .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01);padding:8px}div[id*=blueIcon]:hover .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01)!important}.snowflake-mega-nav-nav-item-icon__inner{border-radius:4px;background:var(--ui-background-05);padding:6px}.snowflake-mega-nav-nav-item:hover .snowflake-mega-nav-nav-item-icon__inner{background:#fff!important}.snowflake-mega-nav-nav-item-icon.snowflake-image-container{height:40px;width:40px}.snowflake-mega-nav-dropdown-footer-links\u003E.snowflake-button-link\u003E.snowflake-button-container{font-size:16px!important;font-family:Texta!important;font-weight:800!important}.snowflake-mega-nav-dropdown-footer-icon.snowflake-image-container{margin-right:8px;width:40px!important;height:40px!important}#viewAllCapabilities a:hover{background:0 0!important}#platformFooter .snowflake-title-v2 .snowflake-title-v2-line:last-child{font-family:Lato;font-size:14px;font-weight:500}#platformFooter .snowflake-mega-nav-dropdown-footer-links{flex-grow:1;justify-content:flex-end;align-items:center}#platformFooter .snowflake-mega-nav-dropdown-footer-content{flex-direction:row}#offset,#open-source{flex-direction:column;border-top:1px solid #ccc}#offset::before,#open-source::before{content:\" \";display:block;width:100%;font-weight:800!important;font-size:12px!important;line-height:14px;text-transform:uppercase;white-space:nowrap;margin-top:16px;margin-bottom:8px}#open-source::before{content:\"Open Source Technologies\"}.snowflake-mega-nav-dropdown-menu-close-button{margin:var(--spacing-04) 0 var(--spacing-03)}.snowflake-mega-nav-column{gap:var(--spacing-02)!important}.snowflake-mega-nav-nav-item\u003Ea{width:100%;margin-left:-8px;padding:8px;border-radius:4px}.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:var(--ui-background-05)}.snowflake-mega-nav-nav-item-description{margin-top:2px;display:block}#promobanner_overflowBottomDarkBlue::before{content:'';display:block;position:absolute;bottom:0;left:0;width:100%;height:50%;background:#212d35}#promobanner_overflowTopDarkBlue::before{content:'';display:block;position:absolute;top:0;left:0;width:100%;height:50%;background:#212d35}.overview-card\u003Ediv{box-shadow:0 0 14px 0 rgba(0,0,0,.10);background-color:#fff;border-radius:16px;overflow:hidden}.overview-card-text{padding:40px}.overview-card-image img{border-radius:0 !important}.overview-card-text h3,.overview-card-text .heading-3-v2{font-size:18px;line-height:1.1;margin-top:0}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"mega_header":{"additionalClasses":"heap-nav-header","layout":"SIMPLE","id":"container-173bef415f",":type":"snowflake-site/components/mega-header",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-03c8ef3e33",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-3e7ba23783","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-d323041a35",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"additionalClasses":"nav-platform-sidebar","numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-27734a8d76",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-46c472e9fc","additionalClasses":"nav-item__platform-parent is-platform","linkDescription":"Develop AI products, apps and more on a fully managed platform that securely connects businesses globally — across any type or scale of data.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/platform/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"The Snowflake Platform"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-c9a652d79c","additionalClasses":"nav-item nav-item--si is-si","linkDescription":"All your knowledge. One trusted enterprise agent.","flag":"NOW GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-cowork/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake CoWork"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_836345186":{"id":"nav-item-44421d3cb4","additionalClasses":"blue-icon is-analytics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/analytics/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Analytics"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2":{"id":"nav-item-3ff5bf474b","additionalClasses":"blue-icon is-ai","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/ai/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_1314771042":{"id":"nav-item-a9d8d1a193","additionalClasses":"blue-icon is-data-eng","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/data-engineering/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Data Engineering"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634":{"id":"nav-item-1225994be9","additionalClasses":"blue-icon is-apps-collab","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/applications-and-collaboration/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Applications & Collaboration"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_2013333117":{"id":"nav-item-a9643d5158","additionalClasses":"blue-icon is-transactions","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/transactions/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Transactions"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646","nav_item","nav_item_copy_copy_2_836345186","nav_item_copy_copy_2","nav_item_copy_copy_2_1314771042","nav_item_copy_144634","nav_item_copy_144634_2013333117"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","navColumnTitle":"Featured Capabilities","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-97a83b1b31",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_212715":{"id":"nav-item-93900e4fc0","additionalClasses":"is-cortex-code","linkDescription":"Snowflake-native AI coding agent ","flag":"New","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-coco/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake CoCo"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-dbe54fa3e4","additionalClasses":"is-cortex-ai","linkDescription":"Instant access to industry-leading LLMs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/cortex/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Cortex AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590635":{"id":"nav-item-154a70500f","additionalClasses":"is-marketplace","linkDescription":"Third-party data sources connected within minutes","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/marketplace/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Marketplace"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-9f88290356","additionalClasses":"is-snowpark","linkDescription":"Libraries and code execution environments that run Python and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/snowpark/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowpark"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_983061516":{"id":"nav-item-ba61f89f74","additionalClasses":"is-streamlit","linkDescription":"Framework for transforming Python scripts into web apps","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/streamlit-in-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Streamlit"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_212715","nav_item","nav_item_copy_660590635","nav_item_copy_660590","nav_item_copy_660590_983061516"]},"nav_column_692142673":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-a00f9cd386",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_660590_1739526127":{"id":"nav-item-dc3b607f36","additionalClasses":"is-postgres","linkDescription":"Fully compatible open source Postgres running on Snowflake","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/postgres/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Postgres"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-9edb56db4b","additionalClasses":"is-dcr","linkDescription":"Streamlined model development and MLOps from a centralized UI","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/end-to-end-ml-workflows/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake ML"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_212715":{"id":"nav-item-cfe9787446","additionalClasses":"is-openflow","linkDescription":"Effortless data movement for integrations","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/openflow/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Openflow"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-3ccbc2c0c3","additionalClasses":"is-notebooks","linkDescription":"Interactive dev environment for data and AI teams","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/notebooks/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Notebooks"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-422e1f28f8","propertiesId":"workload-nav-1","additionalClasses":"is-native-apps","linkDescription":"End-to-end, Snowflake-native app creation and distribution","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/native-apps/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Native Apps"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_660590_1739526127","nav_item_copy_185565","nav_item_copy_212715","nav_item_copy_660590","nav_item_258535199"]},"nav_column_782221091":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-2dcc972566",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-e70b25d507","additionalClasses":"is-light-gray-icon is-horizon-catalog","linkDescription":"Universal AI catalog","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Horizon Catalog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_1293798742":{"id":"nav-item-fe17d1780f","additionalClasses":"is-snowflake-ml","linkDescription":"Governed context layer that keeps AI, BI and data apps working from one truth","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon-context/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Horizon Context"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c":{"id":"nav-item-2aff16610e","additionalClasses":"is-unistore","linkDescription":"Unify transactional and analytical workloads in Snowflake for enhanced simplicity","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/unistore/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Unistore"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1443811525":{"id":"nav-item-f56ee93225","additionalClasses":"is-observe","linkDescription":"AI-powered observability for faster production troubleshooting","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/observe/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Observe"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1006104884":{"id":"nav-item-7928bc8299","additionalClasses":"is-observe","linkDescription":"Use any engine on a single governed data copy","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/use-cases/interoperable-lakehouse/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Interoperable Lakehouse"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item_copy_660590_1293798742","nav_item_511717659_c","nav_item_511717659_c_1443811525","nav_item_511717659_c_1006104884"]}},":itemsOrder":["nav_column","nav_column_copy_copy","nav_column_692142673","nav_column_782221091"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Product"},"nav_dropdown_menu_2":{"id":"nav-dropdown-menu-4e4d094d93","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-b57e52c2cc",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"navColumnTitle":"INDUSTRIES","numberOfSubColumns":"one-column","minWidth":"280","layout":"SIMPLE","id":"container-1f22b43355",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_361384_2056203141":{"id":"nav-item-b2402d0862","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"All Industries"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-4073d1c65b","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/advertising-media-entertainment/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Advertising, Media & Entertainment"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-1cd5244b25","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/financial-services/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Financial Services"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-baa16c85a4","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/healthcare-and-life-sciences/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Healthcare & Life Sciences"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1533429516":{"id":"nav-item-c2739145b6","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/manufacturing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Manufacturing"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1444458226":{"id":"nav-item-e1517456a0","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/public-sector/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Public Sector"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1149488919":{"id":"nav-item-8813bade79","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/retail-consumer-goods/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Retail & Consumer Goods"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_57417040":{"id":"nav-item-08d977b405","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Technology"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384674":{"id":"nav-item-611d857b94","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/telecom/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Telecom"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384":{"id":"nav-item-efc0681fab","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/travel-hospitality/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Travel & Hospitality"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_361384_2056203141","nav_item","nav_item_copy","nav_item_copy_1970515619","nav_item_copy_1533429516","nav_item_copy_1444458226","nav_item_copy_1149488919","nav_item_copy_57417040","nav_item_copy_361384674","nav_item_copy_361384"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"nav_column_copy":{"navColumnTitle":"DEPARTMENTS","numberOfSubColumns":"one-column","minWidth":"160","layout":"SIMPLE","id":"container-026a862b58",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-ff489b4479","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/finance/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Finance"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-93914e58fb","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/information-technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"IT"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-ad5c61c240","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/marketing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Marketing"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]},"nav_column_833417450":{"navColumnTitle":"Enablement Solutions","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-3c335c60c3",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_107772":{"id":"nav-item-d5eb94ff32","linkDescription":"Confident migration to a unified platform","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/migrate-to-the-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Migrate to the AI Data Cloud"},"icon":{"id":"icon","alt":"Cloud icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_107772/icon.coreimg.svg/1723828484100/nav-icon-cloud.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-703e0a364c","linkDescription":"Snowflake experts to help you accelerate and achieve business goals","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/services-delivery/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Services Delivery"},"icon":{"id":"icon","alt":"Migrate icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_copy/icon.coreimg.svg/1768354429188/nav-icon--migrate.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_107772","nav_item_copy_copy"]},"nav_column_copy_copy":{"navColumnTitle":"PARTNER SOLUTIONS","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-859665f2f5",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-71cdd3511c","linkDescription":"Programs with product, solutions and cloud partners","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Partner Network"},"icon":{"id":"icon","alt":"Partner Network icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1723828498700/nav-icon--partner-network.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-f517cc88e6","linkDescription":"Partners, apps and solutions for enhanced deployment","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/all-partners/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Partner Finder"},"icon":{"id":"icon","alt":"Partner Finder icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1726173927645/nav-icon--partner-finder.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-f86465211d","linkDescription":"Live and virtual events","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/event-partnership-opportunities/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Event Partnership Opportunities"},"icon":{"id":"icon","alt":"Calendar icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy_1970515619/icon.coreimg.svg/1726173935655/nav-icon--events.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]}},":itemsOrder":["nav_column","nav_column_copy","nav_column_833417450","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Solutions"},"item_1719963657751_c":{"id":"nav-dropdown-menu-58f16e9b23","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-bdfca39a9d",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-0985aab60f",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-660ead83ef","additionalClasses":"nav-item__platform-parent-why-sf","linkDescription":"Collaborate locally and globally to reveal new insights, create previously unforeseen business opportunities, and identify your customers with seamless experiences.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Why Snowflake"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","numberOfSubColumns":"two-columns","maxWidth":"1200","layout":"SIMPLE","id":"container-0159323ba0",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-e327b25531","propertiesId":"testID","linkDescription":"Case studies and videos showcasing how global organizations use Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/customers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Customers"},"icon":{"id":"icon","alt":"Customer icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1739839279367/nav-icon--partner-network.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-eabdf20bee","propertiesId":"workload-nav-1","linkDescription":"Learn how to connect, share and integrate the data and apps on the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/what-is-data-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"The AI Data Cloud Explained"},"icon":{"id":"icon","alt":"Cloud icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_258535199/icon.coreimg.svg/1739840490955/nav-icon-cloud.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-94afb2bc54","linkDescription":"Comprehensive security through built-in features, robust cloud infrastructure protection, and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/snowflake-security-hub/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Security Hub"},"icon":{"id":"icon","alt":"User with security lock icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565/icon.coreimg.svg/1758909528089/user-security-admins-ciso-icon.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-10a13bc584","additionalClasses":"is-light-gray-icon","linkDescription":"Maximize economic value through minimizing TCO and continuously optimizing price for performance","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/pricing-options/cost-and-performance-optimization/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Cost and Performance Optimization"},"icon":{"id":"icon","alt":"Cost Optimization icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1758909542267/nav-icon-cost-optimization-performance.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_903555964":{"id":"nav-item-b6a15286fc","linkDescription":"Startups building applications in the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/startup-program/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake for Startups"},"icon":{"id":"icon","alt":"Launch","lazyEnabled":true,"height":"64","width":"65","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565_903555964/icon.coreimg.svg/1758732224323/launch.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_258535199","nav_item_copy_185565","nav_item_copy","nav_item_copy_185565_903555964"]}},":itemsOrder":["nav_column","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Why Snowflake"},"item_1719961362824":{"id":"nav-dropdown-menu-709d792250","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-43bb5bb338",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","minWidth":"124","layout":"SIMPLE","id":"container-7098f3d253",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-0f3a512cbd","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Blog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_180298689":{"id":"nav-item-df9f3d9a38","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/events/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Events"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_1639361946":{"id":"nav-item-656f195d48","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/support/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Support"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_680912746":{"id":"nav-item-faaf98f38b","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/contact/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Contact us"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_180298689","nav_item_1639361946","nav_item_680912746"]},"nav_column_44600420__826130542":{"navColumnTitle":"Learn","numberOfSubColumns":"two-columns","layout":"SIMPLE","id":"container-cbf82e9d25",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-14f5931a45","linkDescription":"Ebooks, videos, white papers and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Resource Library"},"icon":{"id":"icon","alt":"Notebooks icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy/icon.coreimg.svg/1736877128196/nav-icon--notebooks.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-17090cda27","linkDescription":"Overview of Snowflake's educational offerings","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/training/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Training"},"icon":{"id":"icon","alt":"Training icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item/icon.coreimg.svg/1722385094416/nav-icon--training.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-d73d5239b7","linkDescription":"Expert-led discussions and demos across industries and use cases","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Webinars"},"icon":{"id":"icon","alt":"Webinars icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_144634_1984107859/icon.coreimg.svg/1759424691990/nav-icon--webinars.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-c2f9d673a8","linkDescription":"Snowflake's technical industry professional certifications","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/certifications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Certifications"},"icon":{"id":"icon","alt":"Certification icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_1438098918/icon.coreimg.svg/1722382780833/nav-icon--cert.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-06ac52b953","linkDescription":"Weekly product demos showcasing key features and live Q&A ","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/demo/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Live Demos"},"icon":{"id":"icon","alt":"Live Demo icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_143809/icon.coreimg.svg/1759424359543/nav-icon--live-demo.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-36b8d43025","linkDescription":"Training courses for all levels, on-demand or instructor-led","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://learn.snowflake.com/en/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowflake University"},"icon":{"id":"icon","alt":"Education icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890638/icon.coreimg.svg/1722382769808/nav-icon--education.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945":{"id":"nav-item-8b3807a797","linkDescription":"Instructor-led virtual workshops for exploring key Snowflake features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/virtual-hands-on-lab/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Hands-On Labs"},"icon":{"id":"icon","alt":"Hands-on Labs icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_189945/icon.coreimg.svg/1759388182903/nav-icon--labs.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890":{"id":"nav-item-2d5a309feb","linkDescription":"Academic papers written by Snowflake researchers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/publications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Research Publications"},"icon":{"id":"icon","alt":"Copy","lazyEnabled":true,"height":"64","width":"65","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890/icon.coreimg.svg/1756326371387/copy.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890_930852828":{"id":"nav-item-eeb1edb500","linkDescription":"Informative articles about AI and data topics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/fundamentals/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Fundamentals"},"icon":{"id":"icon","alt":"Document with list","lazyEnabled":true,"height":"64","width":"65","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890_930852828/icon.coreimg.svg/1756853637155/data-sheet.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item","nav_item_copy_144634_1984107859","nav_item_copy_1438098918","nav_item_copy_143809","nav_item_copy_333890638","nav_item_copy_189945","nav_item_copy_333890","nav_item_copy_333890_930852828"]}},":itemsOrder":["nav_column_copy","nav_column_44600420__826130542"]},"nav_promo_section":{"id":"nav-promo-section-46bc2bbc68","experience_fragment_1":{"id":"experiencefragment-30347dacac","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master1/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-3dcf7ca6e3",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-0bf0164802","openInNewWindow":true,"layout":"horizontal","headline":"The Modern Marketing Data Stack 5th Edition","description":"AI agents are changing the marketing stack. See how to govern the shift. ","linkTitle":"Learn more","linkUrl":"/en/the-modern-marketing-data-stack-report/","image":{"id":"image","alt":"MMDS report 5th edition","lazyEnabled":true,"height":"540","width":"960","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--b3030d24-fd50-45e6-bfe6-9520d3eb46d8/web-inside-the-mmds-5th-960x540.png?quality=85&preferwebp=true",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-67f9533d39","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-2/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-45347f0078",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-26a7137c1e","openInNewWindow":true,"layout":"horizontal","headline":"The ROI of Gen AI and Agents 2026","description":"Discover how 92% of early adopters are achieving positive ROI with gen AI.","linkTitle":"Learn More","linkUrl":"/en/lp/radical-roi-generative-ai/","image":{"id":"image","alt":"roi of gen ai and agents","lazyEnabled":true,"height":"540","width":"960","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--0c15edae-1a97-4739-8b16-c7f3941a6d9e/web-roi-of-gen-ai-and-agents-2026-r02-960x540.png?quality=85&preferwebp=true",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_3":{"id":"experiencefragment-1a88bc2dc9","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-3/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-2336fc156f",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-7d9aa8e6f8","openInNewWindow":true,"layout":"horizontal","headline":"Startup 2026: AI Agents Mean Business","description":"Venture leaders weigh in on agentic AI. ","linkTitle":"Learn more","linkUrl":"/en/lp/building-startup-ai-age/","image":{"id":"image","alt":"alt","lazyEnabled":true,"height":"540","width":"960","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--a320b404-dca1-4477-b033-c79708538657/web-startup-2026-960x540.png?quality=85&preferwebp=true",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Resources"},"item_1719963657751":{"id":"nav-dropdown-menu-1ab5dc6477","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-2b4dfc82d4",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-abce39447d",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-f27318f08a","propertiesId":"testID","linkDescription":"Overview of the dev resources you need to build and scale","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake for Developers"},"icon":{"id":"icon","alt":"Developers icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1731362494574/nav-icon--devs.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-2f07a7759c","linkDescription":"Reference architectures, use cases and best practices","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/guides/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Developer Guides"},"icon":{"id":"icon","alt":"Solution Center icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy_1855651246/icon.coreimg.svg/1761677891705/nav-icon--solution-center.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-9996f2e5f7","additionalClasses":"is-light-gray-icon","linkDescription":"The latest software versions, drivers, libraries and relevant docs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/downloads/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Downloads"},"icon":{"id":"icon","alt":"Download icon","lazyEnabled":true,"height":"28","width":"28","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1731362660050/nav-icon-download.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246","nav_item_copy"]},"nav_column_copy_copy_1367930678":{"navColumnTitle":"Learn","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-fc61d4d8ac",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-494f764bb9","propertiesId":"testID","linkDescription":"Reference docs, guides, tutorials and announcements","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://docs.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Documentation"},"icon":{"id":"icon","alt":"Docs icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item/icon.coreimg.svg/1731361950527/nav-icon--docs.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-0811327257","additionalClasses":"is-light-gray-icon","linkDescription":"Key projects Snowflake engineers maintain and support","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/open-source/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Open Source"},"icon":{"id":"icon","alt":"Open Source icon","lazyEnabled":true,"height":"32","width":"32","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy/icon.coreimg.svg/1731365437016/nav-icon-open-source.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-76099401be","additionalClasses":"is-light-gray-icon","linkDescription":"Online and in-person classes and workshops to upskill on Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/northstar/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Builder Education"},"icon":{"id":"icon","alt":"Northstar logo","lazyEnabled":true,"height":"32","width":"32","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy_copy/icon.coreimg.svg/1731362475640/nav-icon--northstar.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_copy"]},"nav_column_copy_copy_1101894776":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-aa9046c634",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-8b3b991b22","propertiesId":"testID","linkDescription":"Snowflake’s technical leaders on what, why and how they build features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/engineering-blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Engineering Blog"},"icon":{"id":"icon","alt":"Developers icon","lazyEnabled":true,"height":"32","width":"32","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item/icon.coreimg.svg/1757101368571/nav-icon--developer-center.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-282ca3a480","linkDescription":"Tips, tricks and discussion with fellow Snowflake developers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://community.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Community"},"icon":{"id":"icon","alt":"Partner Network icon","lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item_copy_1855651246/icon.coreimg.svg/1731362644348/nav-icon--partner-network.svg",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246"]}},":itemsOrder":["nav_column_copy_copy","nav_column_copy_copy_1367930678","nav_column_copy_copy_1101894776"]},"nav_promo_section":{"id":"nav-promo-section-22c35483fe","experience_fragment_1":{"id":"experiencefragment-30f3776a82","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-5/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-07361f15a0",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-48f5182424","openInNewWindow":false,"layout":"horizontal","headline":"Get started with your first Snowflake Notebook","description":"Write and execute code, visualize results, and tell the story of your analysis all in one place.","linkTitle":"Learn More","linkUrl":"/en/developers/solutions-center/getting-started-with-your-first-snowflake-notebook-project/","image":{"id":"image","alt":"alt","lazyEnabled":true,"height":"210","width":"415","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--dc7e334a-c38b-4283-b1de-fcf829952eef/nav-promo-first-notebook.jpg?quality=85&preferwebp=true",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-51b5c3af1f","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-0bf875d5f6",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-cb742d890a","openInNewWindow":true,"layout":"horizontal","headline":"Northstar Builder Workshops","description":"Join other developers as you roll up your sleeves and explore the possibilities of Snowflake.","linkTitle":"Learn More","linkUrl":"/en/nav-promos/northstar-builders-workshop/","image":{"id":"image","alt":"Snowflake Northstar logo","lazyEnabled":true,"height":"700","width":"1440","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14341ced-bc5e-4a29-9762-b7857f6cadfc/nav-promo-northstar.jpg?quality=85&preferwebp=true",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],"classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Developers"},"item_1718247180324":{"id":"nav-dropdown-menu-599e2c5650","enableDropdown":false,"link_url":"/en/pricing-options/",":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Pricing"}},":itemsOrder":["item_1719963657751_c_663444255","nav_dropdown_menu_2","item_1719963657751_c","item_1719961362824","item_1719963657751","item_1718247180324"]},"languagenavigation":{"id":"language-navigation-d3c4989b94","languageNavItems":[{"title":"English","path":"/en/developers/guides/getting-started-with-openflow-kafka-connector/","locale":"en","active":true},{"title":"日本語","path":"/ja/","locale":"ja","active":false},{"title":"한국어","path":"/ko/","locale":"ko","active":false},{"title":"中文（简体）","path":"/zh_cn/","locale":"zh-cn","active":false},{"title":"Português","path":"/pt_br/","locale":"pt-br","active":false},{"title":"Deutsch","path":"/de/","locale":"de","active":false},{"title":"Français","path":"/fr/","locale":"fr","active":false},{"title":"Español","path":"/es/","locale":"es","active":false},{"title":"Italiano","path":"/it/","locale":"it","active":false}],":type":"snowflake-site/components/nav/language-navigation"},"button_1177328691":{"id":"button-e3d783d18c","heapButtonClasses":["mega-nav__sign-in"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-link snowflake-button-black snowflake-button-compact","text":"Sign in"},"button":{"id":"button-9a504c71ce","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/en/contact-sales/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","text":"CONTACT SALES"},"button_288358396":{"id":"button-bd5b26b40e","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","text":"start for free"}},":itemsOrder":["nav_mega","languagenavigation","button_1177328691","button","button_288358396"],"appliedCssClassNames":"snowflake-header-container white"}},":itemsOrder":["markup_editor","mega_header"]},"image":{":type":"nt:unstructured"},"cq:targetMetadata":{"cq:targetStatus":"OUT_OF_SYNC","cq:exportTime":1781280015540,"cq:targetOfferId":860250,":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:targetMetadata"],"classNames":"aem-xf"},"markup_editor_1950346551":{"id":"markup-editor-a493ce38fd","title":" ","cssContent":".snowflake-markdown-table code[class*=language-],.snowflake-markdown-table code[class*=language-],.snowflake-markdown .snowflake-text code[class*=language-],.snowflake-markdown .snowflake-text pre[class*=language-]{background-color:rgba(var(--ui-12-rgb),.5);color:var(--text-01);text-shadow:none;padding:var(--spacing-00);border-radius:var(--spacing-00);font-size:smaller}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"responsivegrid":{"columnClassNames":{"quickstart_hero":"aem-GridColumn aem-GridColumn--default--12","flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-e5fd2e6fe8","isDeveloperGuidesPage":false,"quickstartHeroFirstCertifiedTag":{"tagText":"Quickstart","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/quickstart","tagIcon":""},":type":"snowflake-site/components/quickstart/quickstart-hero","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/getting-started-with-openflow-kafka-connector","quickstartHeroTitle":{"lines":["Getting Started with Openflow Kafka Connector"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroAuthor":"Kamesh Sampath","quickstartHeroFirstSnowflakeFeatureTag":{"tagText":"Ingestion","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/snowflake-feature/ingestion","tagIcon":""},"quickstartHeroForkRepoLink":{"id":"button-78a1c08418","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/getting-started-with-openflow-kafka-connector"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fork Repo"},"quickstartHeroBreadcrumbs":[{"title":"Getting Started with Openflow Kafka Connector","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides/getting-started-with-openflow-kafka-connector","currentPage":true},{"title":"Guides","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides","currentPage":false},{"title":"Snowflake for Developers","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers","currentPage":false}]},"flexible_column_cont":{"id":"flexible-column-container-41d9dc6def","propertiesId":"quickstart-template-main-flexible-container","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-c9381a463c",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"contentfragment":{"id":"contentfragment-ea47b15864","paragraphs":["&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EOverview\u003C/h2\u003E\n","\u003Cp\u003EThis quickstart demonstrates how to build a real-time streaming pipeline from Apache Kafka to Snowflake using Openflow. You'll learn how to capture application and system logs in real-time, enabling immediate analytics and insights on operational data.\u003C/p\u003E\n","\u003Ch3\u003EDemo: Application Log Streaming\u003C/h3\u003E\n","\u003Cp\u003EYou'll stream realistic application and system logs including web API requests, authentication events, database operations, system metrics, and error tracking.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESample Log Structure:\u003C/strong\u003E\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-json\"\u003E{\n  &quot;timestamp&quot;: &quot;2025-10-15T10:23:45.123Z&quot;,\n  &quot;level&quot;: &quot;INFO&quot;,\n  &quot;service&quot;: &quot;web-api&quot;,\n  &quot;host&quot;: &quot;api-server-01&quot;,\n  &quot;message&quot;: &quot;Request processed successfully&quot;,\n  &quot;request_id&quot;: &quot;req-abc123&quot;,\n  &quot;duration_ms&quot;: 45,\n  &quot;status_code&quot;: 200\n}\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis demonstrates a common pattern: centralizing logs from distributed systems for real-time monitoring, historical analysis, and incident investigation using Snowflake's SQL analytics instead of expensive log platforms.\u003C/p\u003E\n","\u003Cp\u003EBy completing this guide, you will build an end-to-end streaming pipeline that ingests logs from Kafka in real-time and enables powerful analytics in Snowflake.\u003C/p\u003E\n","\u003Ch3\u003EWhat is Openflow\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/about\"\u003ESnowflake Openflow\u003C/a\u003E is Snowflake's integration service built on Apache NiFi. Think of it as a universal connector that can pipe data from practically anywhere into Snowflake&mdash;structured tables, unstructured documents, images, videos, sensor data, you name it.\u003C/p\u003E\n","\u003Cp\u003EWhat makes Openflow powerful:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EHundreds of connectors\u003C/strong\u003E out of the box, with the flexibility to build custom ones if needed\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EHandles both batch and streaming\u003C/strong\u003E at virtually any scale&mdash;perfect for real-time use cases like this log streaming demo\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFully managed\u003C/strong\u003E by Snowflake, so you get built-in security, compliance, and monitoring without the operational overhead\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EBi-directional data flows\u003C/strong\u003E&mdash;not just loading data in, but also sending data out to other systems when needed\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThe best part? It's all powered by Apache NiFi under the hood, which is battle-tested and used by thousands of companies for mission-critical data pipelines.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOpenflow Deployment Models\u003C/strong\u003E:\u003C/p\u003E\n","\u003Cp\u003EOpenflow is available in two deployment options, both supporting the same connectors and features:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake Deployment (SPCS)\u003C/strong\u003E: Streamlined and integrated solution using Snowpark Container Services. Native integration with Snowflake's security model for seamless authentication, authorization, and network security. \u003Cem\u003EThis quickstart uses SPCS deployment.\u003C/em\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EBring Your Own Cloud (BYOC)\u003C/strong\u003E: Data processing engine runs within your own cloud environment (AWS, Azure, GCP) while Snowflake manages the overall service and control plane. Ideal for handling sensitive data preprocessing locally within your organization's cloud environment.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003ELearn more at the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/about\"\u003EOpenflow documentation\u003C/a\u003E and \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/about-byoc\"\u003EBYOC deployments\u003C/a\u003E.\u003C/p\u003E\n","\u003Ch3\u003EAbout the Openflow Kafka Connector\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/about\"\u003EOpenflow Connector for Kafka\u003C/a\u003E reads messages from Kafka topics and writes them into Snowflake tables using Snowpipe Streaming for low-latency ingestion.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIn this quickstart\u003C/strong\u003E, we'll use the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/kafka-json-avro\"\u003EJSON/AVRO data format connector\u003C/a\u003E which provides:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EAutomatic Schema Detection\u003C/strong\u003E: Message fields become table columns automatically\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESchema Evolution\u003C/strong\u003E: Tables adapt when new fields are added\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESimple Configuration\u003C/strong\u003E: Easy to get started\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAdvanced Option\u003C/strong\u003E: For production scenarios requiring Kafka metadata (partition, offset), dead letter queues, or Iceberg table support, see the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/kafka-dlq-metadata\"\u003EDLQ and metadata connector\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EWhat You Will Learn\u003C/h3\u003E\n","\u003Cp\u003EYou'll configure a Kafka topic, set up the Openflow Kafka connector, and stream log data in real-time to Snowflake. Then you'll use SQL to perform real-time analytics on your streaming logs.\u003C/p\u003E\n","\u003Ch3\u003EWhat You Will Build\u003C/h3\u003E\n","\u003Cp\u003EA real-time log streaming and analytics platform with an automated pipeline from Kafka to Snowflake, complete with monitoring and sample analytics queries.\u003C/p\u003E\n","\u003Ch3\u003EPrerequisites\u003C/h3\u003E\n","\u003Cp\u003EBefore we dive in, here's what you'll need:\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESnowflake Setup:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EEnterprise account with Openflow Snowflake Deployments enabled (AWS, Azure, or GCP Commercial Regions)\u003C/li\u003E\u003Cli\u003EACCOUNTADMIN access (or someone who can help with the initial setup&mdash;we'll need to create network rules and external access integrations)\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKafka Cluster:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EAccess to a Kafka cluster&mdash;could be Confluent Cloud, AWS MSK, GCP Managed Kafka, Azure Event Hubs with Kafka API, or self-hosted\u003C/li\u003E\u003Cli\u003EAbility to create topics and produce messages (we'll create one called \u003Ccode\u003Eapplication-logs\u003C/code\u003E)\u003C/li\u003E\u003Cli\u003ENetwork connectivity from Snowflake to your Kafka brokers (we'll walk you through the network rule setup&mdash;it's easier than it sounds!)\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDon't have Kafka yet?\u003C/strong\u003E We tested this with \u003Cstrong\u003EConfluent Cloud\u003C/strong\u003E, which has a free tier perfect for this quickstart. You can spin up a cluster in about 5 minutes. Other managed options like AWS MSK or GCP Managed Kafka work great too.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUsing Openflow BYOC?\u003C/strong\u003E This quickstart focuses on \u003Cstrong\u003ESPCS deployment\u003C/strong\u003E (Snowflake-managed), but the connector setup and concepts are identical for \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/about-byoc\"\u003EBYOC deployments\u003C/a\u003E&mdash;only the runtime deployment steps differ.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EClone Repository\u003C/h2\u003E\n","\u003Cp\u003ELet's grab the \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector\"\u003Ecompanion code\u003C/a\u003E which has everything you need&mdash;SQL scripts, sample data, and helpful utilities to make your life easier.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Egit clone https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector.git\ncd sfguide-getting-started-openflow-kafka-connector\nexport QUICK_START_REPO=$PWD\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe \u003Ccode\u003EQUICK_START_REPO\u003C/code\u003E environment variable will help us reference files easily throughout this guide.\u003C/p\u003E\n","\u003Ch3\u003EWhat's in the Repository?\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESQL Scripts\u003C/strong\u003E (Run these in Snowsight):\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003Esql/1.snowflake_setup.sql\u003C/code\u003E - Sets up your Snowflake environment (role, database, warehouse, network rules)\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esql/2.verify_ingestion.sql\u003C/code\u003E - Checks that data is flowing correctly\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esql/2a.verify_base_schema.sql\u003C/code\u003E - Validates your initial schema (11 fields)\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esql/2b.verify_schema_evolution.sql\u003C/code\u003E - Confirms new columns appeared automatically (29 fields)\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esql/3.analytics_queries.sql\u003C/code\u003E - Real-world analytics examples you can run on your log data\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esql/4.cortex_search.sql\u003C/code\u003E - Semantic search queries with natural language\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esql/5.cleanup.sql\u003C/code\u003E - Clean up when you're done\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESample Data\u003C/strong\u003E (Pre-generated for testing):\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003Esample-data/sample_logs.json\u003C/code\u003E - 50 realistic log events (base schema)\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esample-data/sample_logs_evolved.json\u003C/code\u003E - 80 log events with extra fields (evolved schema)\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003Esample-data/generate_logs.py\u003C/code\u003E - Python script to generate custom logs or test your Kafka connection\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHelper Tools\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003ETaskfile.yml\u003C/code\u003E - Automates common tasks (optional but handy!)\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003E.env.template\u003C/code\u003E - Template for your Kafka connection settings\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003ERPK_CLI_README.md\u003C/code\u003E - Detailed rpk CLI setup guide\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPrefer Notebooks?\u003C/strong\u003E If you're more comfortable with Jupyter notebooks, you can follow along using our \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector/blob/main/notebooks/OPENFLOW_KAFKA_CONNECTOR_QS.ipynb\"\u003Einteractive notebook version\u003C/a\u003E instead. It contains the same content in a notebook-friendly format.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuick Tip\u003C/strong\u003E: The \u003Ccode\u003Egenerate_logs.py\u003C/code\u003E script has a \u003Ccode\u003E--test-connection\u003C/code\u003E flag that's super helpful for verifying your Kafka setup works before we start. We'll use this later!\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EConfigure Kafka\u003C/h2\u003E\n","\u003Cp\u003ETime to get Kafka ready! We'll install the Kafka CLI tools (rpk), create our topic, and make sure everything's connected properly before we start streaming logs.\u003C/p\u003E\n","\u003Ch3\u003EKafka Requirements\u003C/h3\u003E\n","\u003Cp\u003EThis guide assumes you have a Kafka cluster already created and available. Before proceeding, ensure your cluster meets these requirements:\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERequired Kafka Configuration\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EKafka cluster available\u003C/strong\u003E: You have a running Kafka cluster (GCP Managed Kafka, AWS MSK, Confluent Cloud, or self-hosted) with network accessibility from Snowflake.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETopic creation permissions\u003C/strong\u003E: Ability to create topics or use existing topics\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EProducer access\u003C/strong\u003E: Ability to produce messages to topics (for testing)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EBroker endpoints\u003C/strong\u003E: Note down your Kafka broker addresses (e.g., \u003Ccode\u003Ebroker1:9092,broker2:9092\u003C/code\u003E)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESecurity protocol\u003C/strong\u003E: Know your security configuration (SASL_SSL)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESASL mechanism\u003C/strong\u003E: Know your SASL mechanism (PLAIN)\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThis quickstart was tested with \u003Cstrong\u003EConfluent Cloud\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ESetup Redpanda CLI (rpk)\u003C/h3\u003E\n","\u003Cp\u003EWe'll use \u003Ca href=\"https://docs.redpanda.com/current/reference/rpk/\"\u003E\u003Ccode\u003Erpk\u003C/code\u003E (Redpanda CLI)\u003C/a\u003E for Kafka operations. Don't let the name fool you&mdash;despite being called &quot;Redpanda CLI,&quot; it works perfectly with \u003Cstrong\u003Eany\u003C/strong\u003E Kafka cluster (Confluent, AWS MSK, GCP, self-hosted, etc.).\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhy rpk instead of traditional kafka-topics.sh?\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E✅ \u003Cstrong\u003ESimpler commands\u003C/strong\u003E - Much easier to remember and type\u003C/li\u003E\u003Cli\u003E✅ \u003Cstrong\u003EBetter error messages\u003C/strong\u003E - Actually tells you what went wrong\u003C/li\u003E\u003Cli\u003E✅ \u003Cstrong\u003EWorks everywhere\u003C/strong\u003E - One tool for all your Kafka clusters\u003C/li\u003E\u003Cli\u003E✅ \u003Cstrong\u003EModern UX\u003C/strong\u003E - Helpful output, color coding, progress indicators\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThink of rpk as the &quot;kubectl for Kafka&quot;&mdash;it's what the kafka-topics.sh tool should have been!\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EInstall rpk\u003C/strong\u003E:\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EmacOS (Homebrew)\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ebrew install redpanda-data/tap/redpanda\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELinux (Debian/Ubuntu)\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecurl -1sLf 'https://dl.redpanda.com/nzc4ZYQK3WRGd9sy/redpanda/cfg/setup/bash.deb.sh' | sudo -E bash\nsudo apt install redpanda -y\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELinux (RHEL/CentOS)\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecurl -1sLf 'https://dl.redpanda.com/nzc4ZYQK3WRGd9sy/redpanda/cfg/setup/bash.rpm.sh' | sudo -E bash\nsudo yum install redpanda -y\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EVerify installation\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Erpk version\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAlternative\u003C/strong\u003E: If you prefer traditional Kafka CLI tools, they work too. Just replace \u003Ccode\u003Erpk\u003C/code\u003E commands with equivalent \u003Ccode\u003Ekafka-topics.sh\u003C/code\u003E commands. However, we recommend \u003Ccode\u003Erpk\u003C/code\u003E for its improved usability.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EConfigure rpk Profile\u003C/h3\u003E\n","\u003Cp\u003ELet's create an rpk \u003Cstrong\u003Eprofile\u003C/strong\u003E&mdash;think of it as a saved connection shortcut. Instead of typing your broker address and credentials every single time you run a command, we'll save them once in a profile and rpk will remember them.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhat's a profile?\u003C/strong\u003E It's like saving a WiFi password&mdash;you configure it once, and it just works from then on. No more typing \u003Ccode\u003E--brokers\u003C/code\u003E, \u003Ccode\u003E--username\u003C/code\u003E, \u003Ccode\u003E--password\u003C/code\u003E over and over!\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EImportant - Kafka Credentials Required\u003C/strong\u003E: Before proceeding, ensure you have obtained the following from your Kafka cluster administrator or cloud console:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EKafka Broker Address(es)\u003C/strong\u003E: Public endpoint(s) of your Kafka brokers (e.g., \u003Ccode\u003Ebroker-1.example.com:9092\u003C/code\u003E)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EUsername\u003C/strong\u003E: Your SASL authentication username (e.g. &quot;api-key&quot; in Confluent Cloud)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EPassword\u003C/strong\u003E: Your SASL authentication password (e.g. &quot;api-secret&quot; in Confluent Cloud)\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EFor this quickstart, we assume:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESecurity Protocol\u003C/strong\u003E: \u003Ccode\u003ESASL_SSL\u003C/code\u003E (encrypted connection with authentication)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESASL Mechanism\u003C/strong\u003E: \u003Ccode\u003EPLAIN\u003C/code\u003E (username/password authentication)\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EProfile Setup (SASL_SSL with PLAIN)\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Create a profile for this quickstart\nrpk profile create quickstart-kafka\n\n# Set broker and security settings\n# Replace YOUR-KAFKA-BROKER, YOUR-USER-NAME, and YOUR-PASSWORD with your actual Kafka broker, username, and password\nrpk profile set kafka_api.tls.enabled=&quot;true&quot;\nrpk profile set brokers=&quot;YOUR-KAFKA-BROKER:9092&quot;\nrpk profile set sasl.mechanism=&quot;PLAIN&quot;\nrpk profile set user=&quot;YOUR-USER-NAME&quot;\nrpk profile set pass=&quot;YOUR-PASSWORD&quot;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConfluent Cloud Users\u003C/strong\u003E: Use your Confluent Cloud \u003Cstrong\u003EAPI Key\u003C/strong\u003E as the username and \u003Cstrong\u003EAPI Secret\u003C/strong\u003E as the password. These can be created in the Confluent Cloud Console under &quot;Data Integration&quot; &rarr; &quot;API Keys&quot;.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EVerify profile configuration\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# View current profile\nrpk profile print\n\n# Test connection\nrpk cluster info\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EYou should see your cluster information displayed, confirming connectivity.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EProfile Benefits\u003C/strong\u003E: With a configured profile, you don't need to specify \u003Ccode\u003E--brokers\u003C/code\u003E or authentication details in subsequent rpk commands. The profile stores all connection settings securely.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EKafka Service Options\u003C/h3\u003E\n","\u003Cp\u003EThis quickstart works with any Kafka service. Ensure you have:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EBroker Endpoints\u003C/strong\u003E: The connection string(s) for your Kafka cluster\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ENetwork Access\u003C/strong\u003E: Kafka brokers must be accessible from Snowflake\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECredentials\u003C/strong\u003E: API keys/passwords if using SASL authentication\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETopic Permissions\u003C/strong\u003E: Ability to create topics and produce messages\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECommon Kafka Services\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EConfluent Cloud\u003C/strong\u003E: Fully managed Kafka service\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EGCP Managed Kafka\u003C/strong\u003E: Cloud Pub/Sub with Kafka API enabled\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAWS MSK\u003C/strong\u003E: Managed Streaming for Apache Kafka\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAzure Event Hubs\u003C/strong\u003E: With Kafka protocol support\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESelf-Hosted Kafka\u003C/strong\u003E: Your own Kafka cluster\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETested Environment\u003C/strong\u003E: This quickstart was tested with \u003Cstrong\u003EConfluent Cloud\u003C/strong\u003E using SASL_SSL security protocol and PLAIN authentication mechanism.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ECreate Kafka Topic\u003C/h3\u003E\n","\u003Cp\u003ECreate a topic for streaming application logs using rpk. Since we configured the profile, we don't need to specify \u003Ccode\u003E--brokers\u003C/code\u003E in commands.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Create topic with 3 partitions for scalability\nrpk topic create application-logs \\\n  --partitions 3 \\\n  --replicas 3\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExpected output\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003ETOPIC            STATUS\napplication-logs  OK\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETopic Naming\u003C/strong\u003E: You can use any topic name you prefer. If you use a different name, make sure to update the connector configuration accordingly. The default setup assumes \u003Ccode\u003Eapplication-logs\u003C/code\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EVerify Kafka Cluster and Topic\u003C/h3\u003E\n","\u003Cp\u003EUse rpk to verify your cluster configuration and the newly created topic:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# List all topics\nrpk topic list\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EYou should see \u003Ccode\u003Eapplication-logs\u003C/code\u003E in the topic list.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Describe the topic details\nrpk topic describe application-logs\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis shows partition count, replication factor, and other configuration.\u003C/p\u003E\n","\u003Ch3\u003ERecord Cluster Information\u003C/h3\u003E\n","\u003Cp\u003ERun \u003Ccode\u003Erpk cluster info\u003C/code\u003E to get your Kafka broker details. \u003Cstrong\u003EYou'll need these broker endpoints for the Snowflake network rule configuration in the next chapter.\u003C/strong\u003E\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Display cluster information\nrpk cluster info\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExpected output\u003C/strong\u003E:\u003C/p\u003E\n","\u003Cp\u003EThe output will look like this and may vary depending on your Kafka cluster.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003ECLUSTER\n=======\nlkc-ddwwmo\n\nBROKERS\n=======\nID    HOST                          PORT\n0     broker-1.example.com          9092\n1     broker-2.example.com          9092\n2     broker-3.example.com          9092\n...\n\nTOPICS\n======\nNAME              PARTITIONS  REPLICAS\napplication-logs  3           3\ntopic_0           6           3\n...\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E⚠️ Important&mdash;don't skip this:\u003C/strong\u003E Grab all those broker endpoints from the output (like \u003Ccode\u003Ebroker-1.example.com:9092\u003C/code\u003E, \u003Ccode\u003Ebroker-2.example.com:9092\u003C/code\u003E, etc.). You'll need them in the next chapter when we configure Snowflake's network rules. Think of it as telling Snowflake &quot;these Kafka brokers are safe to talk to.&quot;\u003C/p\u003E\n","\u003Ch3\u003ESetup Log Generator\u003C/h3\u003E\n","\u003Cp\u003ENow that your Kafka environment is configured, verify your connection and credentials using the helper script from the cloned repository.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESetup Python environment using uv\u003C/strong\u003E (recommended):\u003C/p\u003E\n","\u003Cp\u003EThe repository includes a \u003Ccode\u003Epyproject.toml\u003C/code\u003E for dependency management. We'll use \u003Ccode\u003Euv\u003C/code\u003E for faster package installation:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Install uv (if not already installed)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# Create virtual environment and install dependencies\nuv venv\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\nuv sync\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAlternative - using pip\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Epip install kafka-python python-dotenv\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConfigure environment variables\u003C/strong\u003E:\u003C/p\u003E\n","\u003Cp\u003EThe \u003Ccode\u003Egenerate_logs.py\u003C/code\u003E script requires environment variables. Copy the template and update it with your Kafka credentials:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Copy template to .env\ncp $QUICK_START_REPO/.env.template .env\n\n# Edit .env with your Kafka credentials\n# Update the following values:\n#   KAFKA_BOOTSTRAP_SERVERS - Your Kafka broker endpoint(s)\n#   KAFKA_SASL_USERNAME - Your API Key/username\n#   KAFKA_SASL_PASSWORD - Your API Secret/password\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERequired Configuration\u003C/strong\u003E: The \u003Ccode\u003E.env\u003C/code\u003E file is required for the \u003Ccode\u003Egenerate_logs.py\u003C/code\u003E script to work. Update \u003Ccode\u003EKAFKA_BOOTSTRAP_SERVERS\u003C/code\u003E, \u003Ccode\u003EKAFKA_SASL_USERNAME\u003C/code\u003E, and \u003Ccode\u003EKAFKA_SASL_PASSWORD\u003C/code\u003E with your actual Kafka credentials from the rpk profile setup. The template already has \u003Ccode\u003EKAFKA_SECURITY_PROTOCOL=SASL_SSL\u003C/code\u003E and \u003Ccode\u003EKAFKA_SASL_MECHANISM=PLAIN\u003C/code\u003E set correctly.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETest connection\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Epython $QUICK_START_REPO/sample-data/generate_logs.py --test-connection\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExpected output for successful connection\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E============================================================\nKAFKA CONNECTION TEST\n============================================================\n\n[1/4] Testing connection to Kafka brokers...\n      Brokers: pkc-n98pk.us-west-2.aws.confluent.cloud:9092\n      Security: SASL_SSL\n      SASL Mechanism: PLAIN\n      SASL Username: FNEI67I3U52IIGG5\n      ✓ Successfully connected to Kafka brokers\n\n[2/4] Fetching cluster metadata...\n      ✓ Connected to cluster\n\n[3/4] Checking topic accessibility...\n      Topic: application-logs\n      ✓ Topic 'application-logs' exists and is accessible\n      ✓ Topic has 3 partition(s): [0, 1, 2]\n\n[4/4] Testing write permissions...\n      Sending test message to topic 'application-logs'...\n      ✓ Successfully sent test message\n      ✓ Written to partition 2 at offset 6\n\n============================================================\nCONNECTION TEST RESULT: ✓ SUCCESS\n============================================================\n\nYour Kafka configuration is working correctly!\nYou can now produce logs with:\n  python generate_logs.py --count 100\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETroubleshooting\u003C/strong\u003E: If the connection test fails, verify:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EYour \u003Ccode\u003E.env\u003C/code\u003E file has correct values matching your rpk profile\u003C/li\u003E\u003Cli\u003EThe broker endpoints are accessible from your network\u003C/li\u003E\u003Cli\u003EYour API Key and API Secret are correct\u003C/li\u003E\u003Cli\u003ESecurity protocol and SASL mechanism match your cluster's configuration\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ENext Steps\u003C/h3\u003E\n","\u003Cp\u003EWith your Kafka environment validated, you're ready to configure Snowflake to access your Kafka cluster. The broker endpoints from \u003Ccode\u003Erpk cluster info\u003C/code\u003E will be added to Snowflake's network rules in the next chapter.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EConfigure Snowflake\u003C/h2\u003E\n","\u003Cp\u003EPerfect! Kafka's configured. Now let's get Snowflake ready to receive those logs. We'll create a dedicated database, warehouse, and&mdash;here's the important part&mdash;network rules that tell Snowflake &quot;these Kafka brokers are safe to connect to.&quot;\u003C/p\u003E\n","\u003Ch3\u003ERun Snowflake Setup Script\u003C/h3\u003E\n","\u003Cp\u003EOpen \u003Cstrong\u003ESnowsight\u003C/strong\u003E (Snowflake's web UI) or your preferred SQL client and run the setup script located in \u003Ccode\u003Esql/1.snowflake_setup.sql\u003C/code\u003E from the cloned repository.\u003C/p\u003E\n","\u003Cp\u003EThe script will create:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ERole\u003C/strong\u003E: \u003Ccode\u003EQUICKSTART_ROLE\u003C/code\u003E - Runtime role for Openflow operations (reused if already exists)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDatabase\u003C/strong\u003E: \u003Ccode\u003EQUICKSTART_KAFKA_CONNECTOR_DB\u003C/code\u003E - Database for storing Kafka streaming data\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EWarehouse\u003C/strong\u003E: \u003Ccode\u003EQUICKSTART_KAFKA_CONNECTOR_WH\u003C/code\u003E (XS size) - Compute for queries\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESchema\u003C/strong\u003E: \u003Ccode\u003ENETWORKS\u003C/code\u003E - Schema for network rules\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ENetwork Rule\u003C/strong\u003E: \u003Ccode\u003Ekafka_network_rule\u003C/code\u003E - Allow network access to Kafka brokers\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EExternal Access Integration\u003C/strong\u003E: \u003Ccode\u003Equickstart_kafka_connector_access\u003C/code\u003E - Enable Openflow to connect to Kafka\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003ECustomize Network Rule\u003C/h3\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIMPORTANT - Get Your Kafka Broker List\u003C/strong\u003E: Before customizing the network rule, extract your broker endpoints from the Kafka cluster info you recorded earlier.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuick Extract Command\u003C/strong\u003E (if you have jq installed):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Erpk cluster info --format=json | jq -r '[.brokers[].host] | map(&quot;'&quot;'&quot;'&quot; + . + &quot;'&quot;'&quot;'&quot;) | join(&quot;,&quot;)'\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExample output\u003C/strong\u003E: \u003Ccode\u003E'broker-1.example.com','broker-2.example.com','broker-3.example.com'\u003C/code\u003E\u003C/p\u003E\n","\u003Cp\u003EThis formatted list is ready to paste into the network rule's \u003Ccode\u003EVALUE_LIST\u003C/code\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E⚠️ Don't skip this step!\u003C/strong\u003E The network rule is like a firewall allowlist&mdash;you need to tell Snowflake exactly which Kafka brokers it's allowed to connect to.\u003C/p\u003E\n","\u003Cp\u003EIn the script, find this section:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- IMPORTANT: Update the network rule with your Kafka broker endpoints\nCREATE OR REPLACE NETWORK RULE QUICKSTART_KAFKA_CONNECTOR_DB.NETWORKS.kafka_network_rule\n  MODE = EGRESS\n  TYPE = HOST_PORT\n  VALUE_LIST = (\n    'YOUR-KAFKA-BROKER-1:9092',  -- Replace with your actual Kafka broker\n    'YOUR-KAFKA-BROKER-2:9092',  -- Add additional brokers if available\n    'YOUR-KAFKA-BROKER-3:9092'   -- Remove if you have fewer brokers\n  );\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EReplace \u003Ccode\u003EYOUR-KAFKA-BROKER-X\u003C/code\u003E with your actual Kafka broker hostnames or IP addresses.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExamples\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGCP Managed Kafka\u003C/strong\u003E: \u003Ccode\u003E'34.123.45.67:9092'\u003C/code\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAWS MSK\u003C/strong\u003E: \u003Ccode\u003E'b-1.mycluster.kafka.us-east-1.amazonaws.com:9092'\u003C/code\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EConfluent Cloud\u003C/strong\u003E: \u003Ccode\u003E'pkc-xxxxx.us-east-1.aws.confluent.cloud:9092'\u003C/code\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESelf-hosted\u003C/strong\u003E: \u003Ccode\u003E'kafka.mycompany.com:9092'\u003C/code\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EMultiple Brokers\u003C/h4\u003E\n","\u003Cp\u003EIf your Kafka cluster has multiple brokers (recommended for production), add all broker endpoints to the \u003Ccode\u003EVALUE_LIST\u003C/code\u003E. This ensures high availability and proper load balancing.\u003C/p\u003E\n","\u003Cp\u003EFor example:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EVALUE_LIST = (\n  'broker-1.kafka.example.com:9092',\n  'broker-2.kafka.example.com:9092',\n  'broker-3.kafka.example.com:9092'\n)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EUsing Wildcards for Similar Domains\u003C/h4\u003E\n","\u003Cp\u003EIf your Kafka brokers follow a similar naming pattern (e.g., \u003Ccode\u003Ebroker-1.kafka.example.com\u003C/code\u003E, \u003Ccode\u003Ebroker-2.kafka.example.com\u003C/code\u003E), you can simplify your network rule using wildcards:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EVALUE_LIST = ('*.kafka.example.com:9092')\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis pattern matches all subdomains under \u003Ccode\u003Ekafka.example.com\u003C/code\u003E, making it easier to maintain when brokers are added or removed.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFor more information\u003C/strong\u003E on wildcard patterns and \u003Ccode\u003EHOST_PORT\u003C/code\u003E type rules, see the \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/sql/create-network-rule\"\u003ECREATE NETWORK RULE\u003C/a\u003E documentation.\u003C/p\u003E\n","\u003Ch3\u003EExecute the Setup Script\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003EOpen Snowsight and sign in with ACCOUNTADMIN or equivalent role\u003C/li\u003E\u003Cli\u003EOpen a new SQL worksheet\u003C/li\u003E\u003Cli\u003ECopy the contents of \u003Ccode\u003Esql/1.snowflake_setup.sql\u003C/code\u003E (after updating network rule)\u003C/li\u003E\u003Cli\u003EExecute the entire script\u003C/li\u003E\u003Cli\u003EVerify objects were created:\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Verify objects\nUSE ROLE QUICKSTART_ROLE;\nSHOW DATABASES LIKE 'QUICKSTART_KAFKA_CONNECTOR_DB';\nSHOW SCHEMAS IN DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\nSHOW WAREHOUSES LIKE 'QUICKSTART_KAFKA_CONNECTOR_WH';\nSHOW NETWORK RULES IN SCHEMA QUICKSTART_KAFKA_CONNECTOR_DB.NETWORKS;\nSHOW EXTERNAL ACCESS INTEGRATIONS LIKE 'quickstart_kafka_connector_access';\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EYou should see all objects created successfully.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESetup Openflow Runtime\u003C/h2\u003E\n","\u003Cp\u003EBefore you can use the Kafka connector, you need an active Openflow Snowflake Deployments runtime. If you've already set up Openflow Snowflake Deployments for another quickstart, you can skip this section and reuse your existing runtime.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENew to Openflow Snowflake Deployments?\u003C/strong\u003E For more comprehensive coverage, see the dedicated \u003Ca href=\"https://quickstarts.snowflake.com/guide/getting_started_with_openflow_spcs/index.html\"\u003EGetting Started with Openflow Snowflake Deployments\u003C/a\u003E quickstart. The steps below provide everything you need to get started quickly.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ECreate Openflow Deployment\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003EIn Snowsight, navigate to \u003Cstrong\u003EData &gt; Integrations &gt; Openflow\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003E+ Deployment\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EEnter deployment name: \u003Ccode\u003EQUICKSTART_KAFKA_DEPLOYMENT\u003C/code\u003E\u003C/li\u003E\u003Cli\u003ESelect region matching your account region\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003ECreate Deployment\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EWait for status to show \u003Cstrong\u003EActive\u003C/strong\u003E (2-3 minutes)\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003ECreate Openflow Runtime\u003C/h3\u003E\n","\u003Cp\u003EOnce your deployment is active:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EClick on your deployment name (\u003Ccode\u003EQUICKSTART_KAFKA_DEPLOYMENT\u003C/code\u003E)\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003E+ Runtime\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EConfigure the runtime:\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EName\u003C/strong\u003E: \u003Ccode\u003EQUICKSTART_KAFKA_RUNTIME\u003C/code\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESize\u003C/strong\u003E: Small (sufficient for this quickstart)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERuntime Role\u003C/strong\u003E: Select \u003Ccode\u003EQUICKSTART_ROLE\u003C/code\u003E (created in previous step)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EExternal Access Integrations\u003C/strong\u003E: Select \u003Ccode\u003Equickstart_kafka_connector_access\u003C/code\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003ECreate Runtime\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EWait for status to show \u003Cstrong\u003EActive\u003C/strong\u003E (2-5 minutes)\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_runtime_create.gif\" alt=\"Creating Openflow Snowflake Deployments Runtime\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EImportant\u003C/strong\u003E: Make sure to attach the \u003Ccode\u003Equickstart_kafka_connector_access\u003C/code\u003E external access integration when creating the runtime. This allows the runtime to connect to your Kafka brokers through Snowflake's network rules.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EYou're now ready to configure the Kafka connector!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EAdd Kafka Connector\u003C/h2\u003E\n","\u003Cp\u003EPerfect! Both Kafka and Snowflake are set up. Now comes the fun part&mdash;connecting them together with Openflow. We'll add the Kafka connector to our runtime and configure it through the Openflow Canvas (web UI).\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_add_connector_to_runtime.gif\" alt=\"Adding Kafka Connector to Openflow Runtime\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENew Tab &amp; Authentication\u003C/strong\u003E: Adding the connector to your runtime will open a new runtime tab in your browser with the canvas showing the \u003Cstrong\u003EOpenflow Kafka; JSON + SASL + Schema evolution\u003C/strong\u003E (abbreviated as \u003Cstrong\u003EKafka JSON SASL SCHEMAEV\u003C/strong\u003E) processor group. If prompted, authenticate/authorize access to allow the canvas to access the runtime. You'll configure this connector in the next section.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EOpenflow Kafka; JSON + SASL + Schema evolution\u003C/strong\u003E connector is now on your canvas. It includes all the processors and services needed to stream data from Kafka to Snowflake.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EConfigure Kafka Connector\u003C/h2\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EOpenflow Kafka; JSON + SASL + Schema evolution\u003C/strong\u003E connector uses three parameter contexts to organize its configuration:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003EKafka JSON SASL SCHEMAEV Source Parameters\u003C/strong\u003E - Kafka connection details including brokers, security settings, and topic configuration\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EKafka JSON SASL SCHEMAEV Destination Parameters\u003C/strong\u003E - Snowflake target database and schema configuration\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EKafka JSON SASL SCHEMAEV Ingestion Parameters\u003C/strong\u003E - Kafka-specific settings like topic names, consumer group, and auto-offset reset\u003C/li\u003E\u003C/ol\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAbout the Connector Name\u003C/strong\u003E: &quot;Kafka JSON SASL SCHEMAEV&quot; is the abbreviated form of \u003Cstrong\u003EOpenflow Kafka; JSON + SASL + Schema evolution\u003C/strong\u003E. This name indicates the connector supports JSON data format, SASL authentication, and automatic schema evolution.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003ETo access parameter contexts:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_paramc_list.png\" alt=\"Access Parameter Contexts\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EConfigure Kafka Source Parameters\u003C/h3\u003E\n","\u003Cp\u003EConfigure the Kafka connection details including broker endpoints, security protocol, and authentication.\u003C/p\u003E\n","\u003Ch4\u003EAccess Kafka Source Parameters\u003C/h4\u003E\n","\u003Cp\u003EFrom the Parameter contexts list, click the \u003Cstrong\u003Ethree dots menu (⋮)\u003C/strong\u003E next to \u003Cstrong\u003EKafka JSON SASL SCHEMAEV Source Parameters\u003C/strong\u003E and select \u003Cstrong\u003EEdit\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_edit_src_params.png\" alt=\"Edit Kafka Source Parameters\"\u003E\u003C/p\u003E\n","\u003Cp\u003EClick on the \u003Cstrong\u003EParameters\u003C/strong\u003E tab and configure the following values:\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EParameter\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EValue\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka Bootstrap Servers\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003Epkc-n98px.us-west-2.aws.confluent.cloud:9092\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EYour Kafka broker endpoint(s). Replace with your actual broker address from the \u003Ccode\u003Erpk cluster info\u003C/code\u003E output. For multiple brokers, use comma-separated list (e.g., \u003Ccode\u003Ebroker1:9092,broker2:9092,broker3:9092\u003C/code\u003E).\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka SASL Mechanism\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003EPLAIN\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESASL authentication mechanism. Use \u003Ccode\u003EPLAIN\u003C/code\u003E for username/password authentication (Confluent Cloud uses this).\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka SASL Password\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003E&lt;YOUR-API-SECRET&gt;\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EYour Kafka SASL password (called &quot;API Secret&quot; in Confluent Cloud). This will be stored as a sensitive value.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka SASL Username\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003E&lt;YOUR-API-KEY&gt;\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EYour Kafka SASL username (called &quot;API Key&quot; in Confluent Cloud).\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka Security Protocol\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003ESASL_SSL\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESecurity protocol for Kafka connection. \u003Ccode\u003ESASL_SSL\u003C/code\u003E provides encrypted connection with authentication.\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConnection Details\u003C/strong\u003E: These values should match the credentials you configured in the \u003Ccode\u003Erpk profile\u003C/code\u003E during the \u003Ca href=\"#setup-kafka-environment\"\u003ESetup Kafka Environment\u003C/a\u003E section. If you're using Confluent Cloud, these are your API Key (username) and API Secret (password).\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EYour completed configuration should look like this:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_set_src_parameters.png\" alt=\"Set Kafka Source Parameters\"\u003E\u003C/p\u003E\n","\u003Cp\u003EClick \u003Cstrong\u003EApply\u003C/strong\u003E to save your Kafka source parameters configuration.\u003C/p\u003E\n","\u003Ch3\u003EConfigure Kafka Destination Parameters\u003C/h3\u003E\n","\u003Cp\u003EConfigure the Snowflake destination connection where Kafka data will be streamed.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIMPORTANT\u003C/strong\u003E: Ensure you have completed the \u003Ca href=\"#setup-snowflake-environment\"\u003ESetup Snowflake Environment\u003C/a\u003E section before proceeding. The Kafka connector requires the database, warehouse, and role to be created in advance.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EAccess Kafka Destination Parameters\u003C/h4\u003E\n","\u003Cp\u003EFrom the Parameter contexts list, click the \u003Cstrong\u003Ethree dots menu (⋮)\u003C/strong\u003E next to \u003Cstrong\u003EKafka JSON SASL SCHEMAEV Destination Parameters\u003C/strong\u003E and select \u003Cstrong\u003EEdit\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_edit_dest_params.png\" alt=\"Edit Kafka Destination Parameters\"\u003E\u003C/p\u003E\n","\u003Cp\u003EClick on the \u003Cstrong\u003EParameters\u003C/strong\u003E tab and configure the following values:\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EParameter\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EValue\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EDestination Database\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003EQUICKSTART_KAFKA_CONNECTOR_DB\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESnowflake database where tables will be created (created in \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector/blob/main/sql/1.snowflake_setup.sql\"\u003Esql/1.snowflake_setup.sql\u003C/a\u003E)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EDestination Schema\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003EPUBLIC\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESnowflake schema where tables will be created\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Account Identifier\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELeave empty\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENot required when using session token authentication\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Authentication Strategy\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003ESNOWFLAKE_SESSION_TOKEN\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EUses the runtime's session for authentication (recommended for SPCS deployments)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Private Key\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELeave empty\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENot required when using session token authentication\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Private Key File\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELeave empty\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENot required when using session token authentication\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Private Key Password\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELeave empty\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENot required when using session token authentication\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Role\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003EQUICKSTART_ROLE\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERuntime role with permissions to create tables and write data (created in \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector/blob/main/sql/1.snowflake_setup.sql\"\u003Esql/1.snowflake_setup.sql\u003C/a\u003E)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESnowflake Username\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELeave empty\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ENot required when using session token authentication\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003EYour completed configuration should look like this:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_set_dest_params.png\" alt=\"Set Kafka Destination Parameters\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESession Token Authentication\u003C/strong\u003E: When using \u003Ccode\u003ESNOWFLAKE_SESSION_TOKEN\u003C/code\u003E, the connector authenticates using the Openflow runtime's Snowflake session. This is the recommended approach for SPCS deployments as it eliminates the need to manage separate credentials.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EClick \u003Cstrong\u003EApply\u003C/strong\u003E to save your Kafka destination parameters configuration.\u003C/p\u003E\n","\u003Ch3\u003EConfigure Kafka Ingestion Parameters\u003C/h3\u003E\n","\u003Cp\u003EConfigure Kafka-specific ingestion settings including topics, consumer group, and offset behavior. This parameter context inherits values from both \u003Cstrong\u003EKafka Source Parameters\u003C/strong\u003E and \u003Cstrong\u003EKafka Destination Parameters\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EAccess Kafka Ingestion Parameters\u003C/h4\u003E\n","\u003Cp\u003EFrom the Parameter contexts list, click the \u003Cstrong\u003Ethree dots menu (⋮)\u003C/strong\u003E next to \u003Cstrong\u003EKafka JSON SASL SCHEMAEV Ingestion Parameters (1)\u003C/strong\u003E and select \u003Cstrong\u003EEdit\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_edit_ingestion_params.png\" alt=\"Edit Kafka Ingestion Parameters\"\u003E\u003C/p\u003E\n","\u003Cp\u003EClick on the \u003Cstrong\u003EParameters\u003C/strong\u003E tab. By default, all parameters including inherited ones are visible. You can toggle the visibility of inherited parameters using the \u003Cstrong\u003EShow inherited parameters\u003C/strong\u003E checkbox at the bottom.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_show_hide_inheritence_props.gif\" alt=\"Toggle Inherited Parameters\"\u003E\u003C/p\u003E\n","\u003Cp\u003EConfigure the following key parameters:\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EParameter\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EValue\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka Auto Offset Reset\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003Elatest\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDetermines where to start reading when no offset exists. Use \u003Ccode\u003Elatest\u003C/code\u003E to read new messages only, or \u003Ccode\u003Eearliest\u003C/code\u003E to read from the beginning of the topic.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka Group Id\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003Eopenflow_qs_kafka_connector\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EKafka consumer group ID. This identifies the consumer group and tracks consumed offsets.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka Topic Format\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003Enames\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESpecifies whether to use topic names (as opposed to regex patterns). Use \u003Ccode\u003Enames\u003C/code\u003E for explicit topic list.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EKafka Topics\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ccode\u003Eapplication-logs\u003C/code\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EComma-separated list of Kafka topics to consume. This should match the topic(s) you created in \u003Ca href=\"#setup-kafka-environment\"\u003ESetup Kafka Environment\u003C/a\u003E.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ETopic To Table Map\u003C/strong\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELeave empty\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EOptional mapping to customize table names. If empty, table names will match topic names exactly but converted to uppercase with double quotes (e.g., topic \u003Ccode\u003Eapplication-logs\u003C/code\u003E &rarr; table \u003Ccode\u003E&quot;APPLICATION-LOGS&quot;\u003C/code\u003E).\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Cp\u003E\u003Cstrong\u003EInherited Parameters\u003C/strong\u003E (visible when &quot;Show inherited parameters&quot; is checked):\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_ingestion_params_all.png\" alt=\"Kafka Ingestion Parameters with All Inherited Properties\"\u003E\u003C/p\u003E\n","\u003Cp\u003EFrom \u003Cstrong\u003EKafka Source Parameters\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EKafka Bootstrap Servers\u003C/li\u003E\u003Cli\u003EKafka SASL Mechanism (\u003Ccode\u003EPLAIN\u003C/code\u003E)\u003C/li\u003E\u003Cli\u003EKafka SASL Username (API Key)\u003C/li\u003E\u003Cli\u003EKafka SASL Password (API Secret)\u003C/li\u003E\u003Cli\u003EKafka Security Protocol (\u003Ccode\u003ESASL_SSL\u003C/code\u003E)\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EFrom \u003Cstrong\u003EKafka Destination Parameters\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EDestination Database\u003C/li\u003E\u003Cli\u003EDestination Schema\u003C/li\u003E\u003Cli\u003ESnowflake Role\u003C/li\u003E\u003Cli\u003ESnowflake Authentication Strategy\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EYour completed configuration should look like this:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_set_ingestion_params.png\" alt=\"Set Kafka Ingestion Parameters\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConfiguration Notes\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EAuto Offset Reset\u003C/strong\u003E: Use \u003Ccode\u003Elatest\u003C/code\u003E for real-time streaming (only new messages), or \u003Ccode\u003Eearliest\u003C/code\u003E to replay all existing messages in the topic.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EConsumer Group\u003C/strong\u003E: The group ID allows Kafka to track which messages have been consumed. If you restart the connector, it will resume from where it left off.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETable Naming\u003C/strong\u003E: By default, Openflow creates tables matching your topic names exactly but converted to uppercase with double quotes following Snowflake standards (e.g., topic \u003Ccode\u003Eapplication-logs\u003C/code\u003E &rarr; table \u003Ccode\u003E&quot;APPLICATION-LOGS&quot;\u003C/code\u003E).\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EClick \u003Cstrong\u003EApply\u003C/strong\u003E to save your Kafka ingestion parameters configuration.\u003C/p\u003E\n","\u003Ch3\u003ENavigate Back to Process Group\u003C/h3\u003E\n","\u003Cp\u003EAfter configuring all three parameter contexts, navigate back to the main Process Group canvas to start the connector. Click the \u003Cstrong\u003ENavigate Up to Process Group\u003C/strong\u003E button in the breadcrumb navigation at the bottom left of the canvas.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_navigate_back_to_pg.png\" alt=\"Navigate Back to Process Group\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThis returns you to the main canvas where you'll see the \u003Cstrong\u003EKafka JSON SASL SCHEMAEV\u003C/strong\u003E connector ready to be started.\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EStart the Connector\u003C/h2\u003E\n","\u003Cp\u003EWith all three parameter contexts configured, you're now ready to start the Kafka connector and begin streaming data from Kafka to Snowflake.\u003C/p\u003E\n","\u003Ch3\u003EStart Process Group\u003C/h3\u003E\n","\u003Cp\u003ETo start the Kafka connector:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ERight-click on the canvas\u003C/strong\u003E (on an empty area)\u003C/li\u003E\u003Cli\u003ESelect \u003Cstrong\u003EStart\u003C/strong\u003E to start all process groups\u003C/li\u003E\u003Cli\u003EThe connector will begin consuming messages from your Kafka topic\u003C/li\u003E\u003Cli\u003EWatch the flow metrics update as data flows from Kafka to Snowflake\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_connector_running.gif\" alt=\"Kafka Connector Running and Streaming Data\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E: You may see an error message about &quot;Snowflake Private Key Service&quot; failing to enable. This error can be safely ignored since this quickstart uses \u003Ccode\u003ESNOWFLAKE_SESSION_TOKEN\u003C/code\u003E authentication instead of private key authentication. The connector will function normally with session token authentication.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhat's Happening?\u003C/strong\u003E The connector:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003EConnects to Kafka\u003C/strong\u003E: Establishes a connection to your Kafka brokers using the configured credentials\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESubscribes to Topics\u003C/strong\u003E: Begins consuming messages from the \u003Ccode\u003Eapplication-logs\u003C/code\u003E topic\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EStreams to Snowflake\u003C/strong\u003E: Writes records to Snowflake in near real-time using Snowpipe Streaming\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETracks Offsets\u003C/strong\u003E: Maintains consumer group offsets so it can resume from where it left off if restarted\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EOnce the connector is running, you should see:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EActive processors\u003C/strong\u003E (green indicators)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EMessages flowing\u003C/strong\u003E through the connections\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EMetrics updating\u003C/strong\u003E (messages consumed, bytes transferred, etc.)\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EYour Kafka connector is now configured and running!\u003C/p\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESchema Evolution\u003C/h2\u003E\n","\u003Cp\u003EIn this section, you'll witness the power of \u003Cstrong\u003Eautomatic schema evolution\u003C/strong\u003E by:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003EPhase 1\u003C/strong\u003E: Produce base log messages and verify initial schema\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EPhase 2\u003C/strong\u003E: Produce evolved log messages with new fields and watch new columns appear automatically!\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EThis demonstrates a key advantage of the Openflow Kafka connector&mdash;your schema evolves automatically as your application adds new fields.\u003C/p\u003E\n","\u003Ch3\u003EUnderstanding Automatic Schema Detection\u003C/h3\u003E\n","\u003Cp\u003EThe Openflow Kafka JSON/AVRO connector uses \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/kafka-json-avro#schema-detection-and-evolution\"\u003Eautomatic schema detection\u003C/a\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ETables are auto-created\u003C/strong\u003E from Kafka topic names\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EMessage fields become table columns\u003C/strong\u003E - Each JSON field becomes an individual column\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EData types are inferred\u003C/strong\u003E automatically from your data\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESchema evolves automatically\u003C/strong\u003E - New fields in messages add new columns transparently\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ENo manual DDL required\u003C/strong\u003E - The connector handles all schema changes\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKey Benefit\u003C/strong\u003E: As your application evolves and adds new fields to log messages, corresponding columns are added automatically&mdash;no pipeline reconfiguration or manual ALTER TABLE statements needed!\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Chr\u003E\n","\u003Ch2\u003EGenerate Base Logs\u003C/h2\u003E\n","\u003Cp\u003ELet's start by producing logs with the base schema and examining the auto-created table structure.\u003C/p\u003E\n","\u003Ch3\u003EInstall Dependencies (If Not Already Done)\u003C/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Install kafka-python library (skip if already installed)\npip install kafka-python python-dotenv\n\n# Or if you prefer conda\nconda install -c conda-forge kafka-python python-dotenv\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EProduce Base Schema Logs\u003C/h3\u003E\n","\u003Ch4\u003EUsing Python Generator (Recommended)\u003C/h4\u003E\n","\u003Cp\u003EGenerate 50 log events with the \u003Cstrong\u003Ebase schema\u003C/strong\u003E (core fields only):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Produce base logs (WITHOUT evolved fields)\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 50\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EYou should see output like:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003EConnecting to Kafka brokers: pkc-xxxxx.aws.confluent.cloud:9092\n✓ Connected to Kafka\nProducing 50 log events (base schema) to topic 'application-logs'...\n  Sent 10/50 events (partition: 0, offset: 125)\n  Sent 20/50 events (partition: 1, offset: 89)\n  ...\n✓ Successfully produced 50 log events (base schema)\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAbout Record Counts\u003C/strong\u003E: Both methods (Python generator and sample file) produce exactly \u003Cstrong\u003E50 base schema records\u003C/strong\u003E for consistency.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EIf you ran \u003Ccode\u003E--test-connection\u003C/code\u003E earlier, you'll have 51 total records\u003C/li\u003E\u003Cli\u003EMultiple runs will accumulate records (not replace them)\u003C/li\u003E\u003Cli\u003EAll records include the same 11 base schema fields (some with NULL values where not applicable)\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EUsing rpk with Sample File\u003C/h4\u003E\n","\u003Cp\u003EAlternatively, you can use the provided sample file with rpk (contains 50 base schema records):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Erpk topic produce application-logs -f '%v{json}\\n' &lt; $QUICK_START_REPO/sample-data/sample_logs.json\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch5\u003EGenerate Custom Sample Files\u003C/h5\u003E\n","\u003Cp\u003EYou can also create custom JSONL sample files without connecting to Kafka:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Generate custom base schema file\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 100 --output my_logs.json\n\n# Generate custom evolved schema file\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 50 --evolved --output my_evolved_logs.json\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis is useful for testing, creating custom datasets, or regenerating the sample files with updated logic.\u003C/p\u003E\n","\u003Ch3\u003EVerify Table Creation\u003C/h3\u003E\n","\u003Cp\u003EOpen Snowsight and verify the table was auto-created:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Set context\nUSE ROLE QUICKSTART_ROLE;\nUSE DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\nUSE SCHEMA PUBLIC;\nUSE WAREHOUSE QUICKSTART_KAFKA_CONNECTOR_WH;\n\n-- Check that table was created\nSHOW TABLES LIKE 'APPLICATION-LOGS';\n\n-- Count records\nSELECT COUNT(*) as TOTAL_RECORDS FROM &quot;APPLICATION-LOGS&quot;;\n-- Expected: ~50 records (or 51 if you ran --test-connection earlier)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003E📸 Capture Initial Schema (Important!)\u003C/h3\u003E\n","\u003Cp\u003EThis is crucial for seeing the &quot;WOW moment&quot; in Phase 2. Run this query and \u003Cstrong\u003Enote the columns\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Show initial schema columns with data types (sorted alphabetically)\nSELECT \n  COLUMN_NAME, \n  DATA_TYPE\nFROM QUICKSTART_KAFKA_CONNECTOR_DB.INFORMATION_SCHEMA.COLUMNS \nWHERE TABLE_NAME ILIKE 'APPLICATION-LOGS'\nORDER BY COLUMN_NAME;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExpected Base Columns\u003C/strong\u003E (sorted alphabetically):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003EAMOUNT          NUMBER\nDURATION_MS     NUMBER\nERROR           TEXT\nHOST            TEXT\nLEVEL           TEXT\nMESSAGE         TEXT\nREQUEST_ID      TEXT\nSERVICE         TEXT\nSTATUS_CODE     NUMBER\nTIMESTAMP       TEXT\nUSER_ID         TEXT\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThat's \u003Cstrong\u003E11 base columns\u003C/strong\u003E in Phase 1.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERemember These 11 Columns\u003C/strong\u003E: We'll run this query again in Phase 2 and see many NEW columns appear automatically!\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E: Some columns like \u003Ccode\u003EAMOUNT\u003C/code\u003E, \u003Ccode\u003EUSER_ID\u003C/code\u003E, and \u003Ccode\u003EERROR\u003C/code\u003E may contain NULL values for records where those fields don't apply. For example, only payment-related logs will have \u003Ccode\u003EAMOUNT\u003C/code\u003E values, and only ERROR-level logs will have the \u003Ccode\u003EERROR\u003C/code\u003E field populated.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EQuery Base Schema Data\u003C/h3\u003E\n","\u003Cp\u003EExplore the data using direct column access (no JSON parsing needed!):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- View sample records\nSELECT \n  TIMESTAMP,\n  LEVEL,\n  SERVICE,\n  MESSAGE,\n  STATUS_CODE,\n  DURATION_MS\nFROM &quot;APPLICATION-LOGS&quot;\nORDER BY TIMESTAMP DESC\nLIMIT 10;\n\n-- Log level distribution\nSELECT \n  LEVEL,\n  COUNT(*) as LOG_COUNT\nFROM &quot;APPLICATION-LOGS&quot;\nGROUP BY LEVEL\nORDER BY LOG_COUNT DESC;\n\n-- Error analysis (ERROR field only appears in ERROR logs)\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  ERROR,\n  STATUS_CODE\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE ERROR IS NOT NULL\nORDER BY TIMESTAMP DESC\nLIMIT 10;\n\n-- Service health summary\nSELECT \n  SERVICE,\n  COUNT(*) as TOTAL_LOGS,\n  SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) as ERROR_COUNT,\n  SUM(CASE WHEN LEVEL = 'WARN' THEN 1 ELSE 0 END) as WARN_COUNT,\n  ROUND(AVG(DURATION_MS), 2) as AVG_DURATION_MS\nFROM &quot;APPLICATION-LOGS&quot;\nGROUP BY SERVICE\nORDER BY ERROR_COUNT DESC;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFull Verification Script\u003C/strong\u003E: Run \u003Ccode\u003Esql/2a.verify_base_schema.sql\u003C/code\u003E for comprehensive Phase 1 verification queries including performance analysis, error summaries, and payment transactions.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Chr\u003E\n","\u003Ch2\u003EGenerate Evolved Logs\u003C/h2\u003E\n","\u003Cp\u003ENow for the \u003Cstrong\u003EWOW moment\u003C/strong\u003E! Let's produce logs with evolved fields and watch new columns appear automatically.\u003C/p\u003E\n","\u003Ch3\u003EProduce Evolved Schema Logs\u003C/h3\u003E\n","\u003Ch4\u003EUsing Python Generator with --evolved Flag (Recommended)\u003C/h4\u003E\n","\u003Cp\u003EGenerate logs with \u003Cstrong\u003Eadditional fields\u003C/strong\u003E (region, auth_method, currency, etc.):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Epython $QUICK_START_REPO/sample-data/generate_logs.py --count 80 --evolved\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EYou should see:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003EProducing 80 log events (evolved schema) to topic 'application-logs'...\n  Sent 10/80 events (partition: 0, offset: 175)\n  Sent 20/80 events (partition: 1, offset: 89)\n  ...\n  Sent 80/80 events (partition: 2, offset: 201)\n✓ Successfully produced 80 log events (evolved schema)\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EUsing rpk with Evolved Sample File\u003C/h4\u003E\n","\u003Cp\u003EAlternatively, use the pre-generated evolved sample file with rpk (contains 80 evolved schema records):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Erpk topic produce application-logs -f '%v{json}\\n' &lt; $QUICK_START_REPO/sample-data/sample_logs_evolved.json\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003E🎯 Compare Schemas - NEW Columns Appeared\u003C/h3\u003E\n","\u003Cp\u003ERun the same INFORMATION_SCHEMA query again and compare with Phase 1:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Show columns NOW - compare with Phase 1!\nSELECT \n  COLUMN_NAME, \n  DATA_TYPE\nFROM QUICKSTART_KAFKA_CONNECTOR_DB.INFORMATION_SCHEMA.COLUMNS \nWHERE TABLE_NAME ILIKE 'APPLICATION-LOGS'\nORDER BY COLUMN_NAME;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E🆕 NEW Columns That Appeared\u003C/strong\u003E (sorted alphabetically):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003EAUTH_METHOD           TEXT\nAVAILABLE_GB          NUMBER\nAVAILABLE_MB          NUMBER\nCONTENT_TYPE          TEXT\nCURRENCY              TEXT\nDISK_USAGE_PERCENT    NUMBER\nFILE_SIZE_BYTES       NUMBER\nMEMORY_PERCENT        NUMBER\nMETRICS_COUNT         NUMBER\nPAYMENT_METHOD        TEXT\nPRODUCT_ID            TEXT\nPROVIDER              TEXT\nQUERY_PARAMS          VARIANT\nRATING                NUMBER\nRECIPIENT             TEXT\nREGION                TEXT\nRESULT_COUNT          NUMBER\nRETRY_COUNT           NUMBER\nSESSION_DURATION      NUMBER\nSMTP_CODE             NUMBER\nSTATUS                TEXT\nTEST                  BOOLEAN\nTIME_WINDOW           TEXT\nTRACE_ID              TEXT\nVALIDATION_ERRORS     VARIANT\nVERSION               TEXT\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThat's 26 new columns automatically added!\u003C/strong\u003E (from 11 &rarr; 37 total columns)\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003E🎉 WOW!\u003C/strong\u003E These columns were added \u003Cstrong\u003Eautomatically\u003C/strong\u003E without any DDL changes, pipeline reconfiguration, or downtime! This is automatic schema evolution in action!\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EQuery Evolved Schema Fields\u003C/h3\u003E\n","\u003Cp\u003ELet's explore the new fields:\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003E1. Records with REGION field\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  REGION,\n  TRACE_ID\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE REGION IS NOT NULL\nORDER BY TIMESTAMP DESC\nLIMIT 10;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E2. Auth logs with new authentication fields\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT \n  TIMESTAMP,\n  SERVICE,\n  USER_ID,\n  AUTH_METHOD,\n  PROVIDER,\n  REGION\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE AUTH_METHOD IS NOT NULL\nORDER BY TIMESTAMP DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E3. Payment logs with currency information\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT \n  TIMESTAMP,\n  SERVICE,\n  AMOUNT,\n  CURRENCY,\n  PAYMENT_METHOD,\n  USER_ID,\n  REGION\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE CURRENCY IS NOT NULL\nORDER BY TIMESTAMP DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E4. File uploads with metadata\u003C/strong\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  FILE_SIZE_BYTES,\n  CONTENT_TYPE,\n  REGION\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE FILE_SIZE_BYTES IS NOT NULL\nORDER BY TIMESTAMP DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003E5. System metrics\u003C/strong\u003E (appears in WARN logs with memory/disk issues):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  MEMORY_PERCENT,\n  AVAILABLE_MB,\n  DISK_USAGE_PERCENT,\n  AVAILABLE_GB,\n  REGION\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE MEMORY_PERCENT IS NOT NULL \n   OR DISK_USAGE_PERCENT IS NOT NULL\nORDER BY TIMESTAMP DESC;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E: System metrics only appear in WARN level logs with messages like &quot;Memory usage above 80%&quot; or &quot;Disk space running low&quot;. If this query returns no results, produce more evolved logs to generate system metrics:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Produce additional evolved logs\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 100 --evolved\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFull Schema Evolution Queries\u003C/strong\u003E: Run \u003Ccode\u003Esql/2b.verify_schema_evolution.sql\u003C/code\u003E for comprehensive queries exploring all evolved fields including API parameters, error retries, email delivery, analytics metrics, and more!\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EUnderstanding What Just Happened\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKey Takeaways\u003C/strong\u003E:\u003C/p\u003E\n","\u003Cp\u003E✅ \u003Cstrong\u003EAutomatic Column Addition\u003C/strong\u003E - New fields in JSON &rarr; New columns in table (no manual intervention)\u003Cbr\u003E\n✅ \u003Cstrong\u003EZero Downtime\u003C/strong\u003E - Schema evolved while pipeline continued running\u003Cbr\u003E\n✅ \u003Cstrong\u003EBackward Compatible\u003C/strong\u003E - Old records have NULL for new columns\u003Cbr\u003E\n✅ \u003Cstrong\u003ENo Pipeline Changes\u003C/strong\u003E - Same connector configuration handles both schemas\u003Cbr\u003E\n✅ \u003Cstrong\u003EType Inference\u003C/strong\u003E - New columns got appropriate data types automatically\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EReal-World Benefits\u003C/strong\u003E: This schema evolution capability is ideal for:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EMicroservices with evolving log formats\u003C/li\u003E\u003Cli\u003EA/B testing with different instrumentation\u003C/li\u003E\u003Cli\u003EGradual feature rollouts\u003C/li\u003E\u003Cli\u003EMulti-tenant systems with varying schemas\u003C/li\u003E\u003Cli\u003EDevOps teams that don't want to manage schema migrations\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EIf you don't see data in Snowflake after producing logs:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECheck Kafka Topic\u003C/strong\u003E - Verify messages exist:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Erpk topic consume application-logs --num 5\n\u003C/code\u003E\u003C/pre\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECheck Openflow Canvas\u003C/strong\u003E - Ensure all processors are running (green status)\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECheck Offset Reset\u003C/strong\u003E - If using \u003Ccode\u003Elatest\u003C/code\u003E, only new messages after connector start are consumed\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETip\u003C/strong\u003E: See the \u003Ca href=\"#monitoring-the-pipeline\"\u003EMonitoring the Pipeline\u003C/a\u003E chapter for detailed monitoring guidance.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ELog Analytics\u003C/h2\u003E\n","\u003Cp\u003ENow that logs are streaming into Snowflake, let's perform powerful analytics that would be difficult or expensive in traditional log platforms.\u003C/p\u003E\n","\u003Ch3\u003EBasic Log Analytics\u003C/h3\u003E\n","\u003Cp\u003ERun the analytics queries from \u003Ccode\u003Esql/3.analytics_queries.sql\u003C/code\u003E:\u003C/p\u003E\n","\u003Ch4\u003ECount by Log Level\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Distribution of log levels\nSELECT \n  LEVEL as LOG_LEVEL,\n  COUNT(*) as EVENT_COUNT,\n  ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as PERCENTAGE\nFROM &quot;APPLICATION-LOGS&quot;\nGROUP BY LOG_LEVEL\nORDER BY EVENT_COUNT DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExample Output\u003C/strong\u003E (actual counts will vary based on the logs you've generated):\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode\u003ELOG_LEVEL | EVENT_COUNT | PERCENTAGE\n----------|-------------|------------\nINFO      | 350         | 70.00\nWARN      | 100         | 20.00\nERROR     | 50          | 10.00\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E: The actual counts and percentages will vary depending on how many log events you've produced and the random distribution of log levels generated by the script.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003ETop Error Messages\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Most common error messages\nSELECT \n  MESSAGE as ERROR_MESSAGE,\n  SERVICE,\n  COUNT(*) as ERROR_COUNT\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE LEVEL = 'ERROR'\nGROUP BY ERROR_MESSAGE, SERVICE\nORDER BY ERROR_COUNT DESC\nLIMIT 10;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThis helps identify the most frequent errors to prioritize fixing.\u003C/p\u003E\n","\u003Ch4\u003EService Health Overview\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Event count and error rate by service\nSELECT \n  SERVICE as SERVICE_NAME,\n  COUNT(*) as TOTAL_EVENTS,\n  SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) as ERROR_COUNT,\n  SUM(CASE WHEN LEVEL = 'WARN' THEN 1 ELSE 0 END) as WARN_COUNT,\n  ROUND(ERROR_COUNT * 100.0 / NULLIF(TOTAL_EVENTS, 0), 2) as ERROR_RATE_PCT\nFROM &quot;APPLICATION-LOGS&quot;\nGROUP BY SERVICE_NAME\nORDER BY ERROR_RATE_PCT DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EQuickly identify which services have the highest error rates.\u003C/p\u003E\n","\u003Ch3\u003ETime-Series Analysis\u003C/h3\u003E\n","\u003Ch4\u003EEvents Per Minute\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Event volume over time (per minute)\nSELECT \n  DATE_TRUNC('minute', TO_TIMESTAMP(TIMESTAMP)) as TIME_BUCKET,\n  COUNT(*) as EVENTS_PER_MINUTE,\n  SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) as ERRORS_PER_MINUTE\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE TO_TIMESTAMP(TIMESTAMP) &gt;= DATEADD('hour', -1, CURRENT_TIMESTAMP())\nGROUP BY TIME_BUCKET\nORDER BY TIME_BUCKET DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EVisualize event volume trends and error spikes over time.\u003C/p\u003E\n","\u003Ch4\u003EPeak Traffic Hours\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Hourly event distribution\nSELECT \n  HOUR(TO_TIMESTAMP(TIMESTAMP)) as HOUR_OF_DAY,\n  COUNT(*) as EVENT_COUNT,\n  AVG(DURATION_MS) as AVG_DURATION_MS\nFROM &quot;APPLICATION-LOGS&quot;\nWHERE TO_TIMESTAMP(TIMESTAMP) &gt;= DATEADD('day', -1, CURRENT_TIMESTAMP())\n  AND DURATION_MS IS NOT NULL\nGROUP BY HOUR_OF_DAY\nORDER BY HOUR_OF_DAY;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EIdentify peak usage hours for capacity planning.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E: The \u003Ccode\u003ETIMESTAMP\u003C/code\u003E column is stored as TEXT. We use \u003Ccode\u003ETO_TIMESTAMP()\u003C/code\u003E to convert it to TIMESTAMP type for time-based analysis. If your quickstart was just completed, you may see limited data in the last hour/day time windows.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EPerformance Analytics\u003C/h3\u003E\n","\u003Ch4\u003ESlowest Requests\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Slowest requests\nSELECT\n  SERVICE,\n  REQUEST_ID,\n  DURATION_MS,\n  MESSAGE,\n  TIMESTAMP AS REQUEST_TIME,\n  LEVEL,\n  STATUS_CODE\nFROM\n  QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.&quot;APPLICATION-LOGS&quot;\nWHERE\n  NOT DURATION_MS IS NULL\n  AND DURATION_MS &gt; 0\nORDER BY\n  DURATION_MS DESC\nLIMIT 20;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch4\u003EPerformance by Service\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Average performance metrics by service\nSELECT\n  SERVICE,\n  COUNT(*) as TOTAL_REQUESTS,\n  ROUND(AVG(DURATION_MS), 2) as AVG_DURATION_MS,\n  MIN(DURATION_MS) as MIN_DURATION_MS,\n  MAX(DURATION_MS) as MAX_DURATION_MS,\n  SUM(\n    CASE\n      WHEN STATUS_CODE &gt;= 400 THEN 1\n      ELSE 0\n    END\n  ) as ERROR_COUNT,\n  ROUND(\n    AVG(\n      CASE\n        WHEN STATUS_CODE &gt;= 400 THEN 1\n        ELSE 0\n      END\n    ) * 100,\n    2\n  ) as ERROR_RATE_PCT\nFROM\n  QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.&quot;APPLICATION-LOGS&quot;\nWHERE\n  DURATION_MS IS NOT NULL\n  AND DURATION_MS &gt; 0\nGROUP BY\n  SERVICE\nORDER BY\n  AVG_DURATION_MS DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003ECalculate average, min, and max latency along with error rates by service&mdash;essential SRE metrics!\u003C/p\u003E\n","\u003Ch3\u003EAdvanced Analytics\u003C/h3\u003E\n","\u003Ch4\u003EError Correlation\u003C/h4\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Find correlated errors (errors occurring together)\nWITH ERROR_WINDOWS AS (\n  SELECT\n    SERVICE,\n    CAST(TIMESTAMP AS TIMESTAMP) AS ERROR_TIME,\n    REQUEST_ID,\n    STATUS_CODE,\n    DURATION_MS,\n    DATE_TRUNC ('MINUTE', CAST(TIMESTAMP AS TIMESTAMP)) AS TIME_WINDOW\n    /* Create 5-minute time windows */\n  FROM\n    QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.&quot;APPLICATION-LOGS&quot;\n  WHERE\n    LEVEL ILIKE '%ERROR%'\n),\nSERVICE_PAIRS AS (\n  SELECT\n    a.SERVICE AS SERVICE_A,\n    b.SERVICE AS SERVICE_B,\n    a.TIME_WINDOW,\n    COUNT(DISTINCT a.REQUEST_ID) AS ERRORS_SERVICE_A,\n    COUNT(DISTINCT b.REQUEST_ID) AS ERRORS_SERVICE_B,\n    AVG(a.DURATION_MS) AS AVG_DURATION_A,\n    AVG(b.DURATION_MS) AS AVG_DURATION_B\n  FROM\n    ERROR_WINDOWS AS a\n    JOIN ERROR_WINDOWS AS b ON a.TIME_WINDOW = b.TIME_WINDOW\n    AND a.SERVICE &lt; b.SERVICE\n    /* Avoid duplicate pairs */\n  GROUP BY\n    a.SERVICE,\n    b.SERVICE,\n    a.TIME_WINDOW\n  HAVING\n    ERRORS_SERVICE_A &gt; 0\n    AND ERRORS_SERVICE_B &gt; 0\n)\nSELECT\n  SERVICE_A,\n  SERVICE_B,\n  COUNT(*) AS CONCURRENT_ERROR_WINDOWS,\n  SUM(ERRORS_SERVICE_A) AS TOTAL_ERRORS_A,\n  SUM(ERRORS_SERVICE_B) AS TOTAL_ERRORS_B,\n  ROUND(AVG(AVG_DURATION_A), 2) AS AVG_DURATION_A,\n  ROUND(AVG(AVG_DURATION_B), 2) AS AVG_DURATION_B\nFROM\n  SERVICE_PAIRS\nGROUP BY\n  SERVICE_A,\n  SERVICE_B\nHAVING\n  CONCURRENT_ERROR_WINDOWS &gt; 1\nORDER BY\n  CONCURRENT_ERROR_WINDOWS DESC,\n  TOTAL_ERRORS_A + TOTAL_ERRORS_B DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EDiscover when errors in one service correlate with errors in another&mdash;great for finding cascading failures!\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhy This Matters\u003C/strong\u003E: Traditional log platforms charge premium prices for long retention and complex queries. With Snowflake, you can keep years of logs at low storage costs and run sophisticated SQL analytics without specialized query languages or expensive log indexing.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESemantic Search\u003C/h2\u003E\n","\u003Cp\u003EEnable natural language search over your log messages using Snowflake Cortex Search. This allows you to query logs using plain English through Snowflake CoWork or programmatically.\u003C/p\u003E\n","\u003Cp\u003EAll queries in this section are available in \u003Ccode\u003Esql/4.cortex_search.sql\u003C/code\u003E.\u003C/p\u003E\n","\u003Ch3\u003ECreate Cortex Search Service\u003C/h3\u003E\n","\u003Cp\u003ECreate a search service on your log messages with critical attributes as filters:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EUSE ROLE QUICKSTART_ROLE;\nUSE DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\nUSE SCHEMA PUBLIC;\n\n-- Create Cortex Search service on log messages\n-- Includes both base and evolved schema attributes for comprehensive filtering\nCREATE OR REPLACE CORTEX SEARCH SERVICE application_logs_search\n  ON MESSAGE\n  ATTRIBUTES LEVEL, SERVICE, ERROR, STATUS_CODE, DURATION_MS, MEMORY_PERCENT, DISK_USAGE_PERCENT, REGION\n  WAREHOUSE = QUICKSTART_KAFKA_CONNECTOR_WH\n  TARGET_LAG = '1 minute'\n  AS (\n    SELECT \n      MESSAGE,\n      LEVEL,\n      SERVICE,\n      ERROR,\n      STATUS_CODE,\n      DURATION_MS::NUMBER as DURATION_MS,\n      TIMESTAMP,\n      REQUEST_ID,\n      HOST,\n      USER_ID,\n      MEMORY_PERCENT::NUMBER as MEMORY_PERCENT,\n      AVAILABLE_MB::NUMBER as AVAILABLE_MB,\n      DISK_USAGE_PERCENT::NUMBER as DISK_USAGE_PERCENT,\n      AVAILABLE_GB::NUMBER as AVAILABLE_GB,\n      REGION\n    FROM &quot;APPLICATION-LOGS&quot;\n  );\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhat This Does\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EON MESSAGE\u003C/strong\u003E: Indexes the MESSAGE field for semantic search\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EATTRIBUTES\u003C/strong\u003E: LEVEL, SERVICE, ERROR, STATUS_CODE, DURATION_MS, MEMORY_PERCENT, DISK_USAGE_PERCENT, REGION become filterable dimensions\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETARGET_LAG\u003C/strong\u003E: Search index updates within 1 minute of new data\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESemantic Understanding\u003C/strong\u003E: Understands concepts, not just exact text matches\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EEvolved Schema Support\u003C/strong\u003E: Includes both base and evolved schema columns for comprehensive filtering\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EType Casting\u003C/strong\u003E: Numeric columns (DURATION_MS, MEMORY_PERCENT, AVAILABLE_MB, DISK_USAGE_PERCENT, AVAILABLE_GB) are cast to NUMBER for proper filter operations\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EPerformance Filtering\u003C/strong\u003E: DURATION_MS is indexed as an attribute, enabling fast filtering for performance-related searches (e.g., slow requests, timeout issues)\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EQuery Using Snowflake CoWork\u003C/h3\u003E\n","\u003Cp\u003EOnce the search service is created, you can use \u003Cstrong\u003ESnowflake CoWork\u003C/strong\u003E for natural language queries:\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExample questions you can ask\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E&quot;Show me all payment errors from the last hour&quot;\u003C/li\u003E\u003Cli\u003E&quot;Find authentication failures&quot;\u003C/li\u003E\u003Cli\u003E&quot;What database timeouts occurred?&quot;\u003C/li\u003E\u003Cli\u003E&quot;Show warnings from the inventory service&quot;\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003ESnowflake CoWork will automatically use your Cortex Search service to find relevant logs!\u003C/p\u003E\n","\u003Ch3\u003EQuery Programmatically\u003C/h3\u003E\n","\u003Cp\u003EYou can also query the search service using SQL with the \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/search_preview-snowflake-cortex\"\u003E\u003Ccode\u003ESNOWFLAKE.CORTEX.SEARCH_PREVIEW\u003C/code\u003E function\u003C/a\u003E:\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENote\u003C/strong\u003E: \u003Ccode\u003ESEARCH_PREVIEW\u003C/code\u003E is designed for testing and validation. For production applications requiring low latency, use the Python API or the service's native REST endpoint.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Semantic search for authentication errors\n-- Returns MESSAGE, LEVEL, SERVICE, TIMESTAMP, and ERROR columns\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      &quot;query&quot;: &quot;authentication failed&quot;,\n      &quot;columns&quot;: [&quot;MESSAGE&quot;, &quot;LEVEL&quot;, &quot;SERVICE&quot;, &quot;TIMESTAMP&quot;, &quot;ERROR&quot;],\n      &quot;filter&quot;: {&quot;@eq&quot;: {&quot;LEVEL&quot;: &quot;ERROR&quot;}},\n      &quot;limit&quot;: 10\n    }'\n  ) AS search_results;\n\n-- Search for payment issues with base schema columns\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      &quot;query&quot;: &quot;payment declined timeout&quot;,\n      &quot;columns&quot;: [&quot;MESSAGE&quot;, &quot;SERVICE&quot;, &quot;STATUS_CODE&quot;, &quot;TIMESTAMP&quot;, &quot;REQUEST_ID&quot;],\n      &quot;filter&quot;: {&quot;@eq&quot;: {&quot;SERVICE&quot;: &quot;payment-service&quot;}},\n      &quot;limit&quot;: 10\n    }'\n  ) AS search_results;\n\n-- Find database connection problems\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      &quot;query&quot;: &quot;database connection timeout&quot;,\n      &quot;columns&quot;: [&quot;MESSAGE&quot;, &quot;LEVEL&quot;, &quot;SERVICE&quot;, &quot;HOST&quot;, &quot;TIMESTAMP&quot;],\n      &quot;filter&quot;: {&quot;@eq&quot;: {&quot;LEVEL&quot;: &quot;ERROR&quot;}},\n      &quot;limit&quot;: 10\n    }'\n  ) AS search_results;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003ESearch with Multiple Filters\u003C/h3\u003E\n","\u003Cp\u003ECombine semantic search with multiple attribute filters to narrow down results:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Find errors in payment OR auth services\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      &quot;query&quot;: &quot;failed transaction&quot;,\n      &quot;columns&quot;: [&quot;MESSAGE&quot;, &quot;LEVEL&quot;, &quot;SERVICE&quot;, &quot;ERROR&quot;, &quot;STATUS_CODE&quot;, &quot;TIMESTAMP&quot;],\n      &quot;filter&quot;: {\n        &quot;@and&quot;: [\n          {&quot;@eq&quot;: {&quot;LEVEL&quot;: &quot;ERROR&quot;}},\n          {&quot;@or&quot;: [\n            {&quot;@eq&quot;: {&quot;SERVICE&quot;: &quot;payment-service&quot;}},\n            {&quot;@eq&quot;: {&quot;SERVICE&quot;: &quot;auth-service&quot;}}\n          ]}\n        ]\n      },\n      &quot;limit&quot;: 20\n    }'\n  ) AS search_results;\n\n-- Search for system warnings with high memory usage (evolved schema)\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      &quot;query&quot;: &quot;memory usage warning system resource&quot;,\n      &quot;columns&quot;: [&quot;MESSAGE&quot;, &quot;LEVEL&quot;, &quot;SERVICE&quot;, &quot;MEMORY_PERCENT&quot;, &quot;AVAILABLE_MB&quot;, &quot;REGION&quot;, &quot;TIMESTAMP&quot;],\n      &quot;filter&quot;: {\n        &quot;@and&quot;: [\n          {&quot;@eq&quot;: {&quot;LEVEL&quot;: &quot;WARN&quot;}},\n          {&quot;@gte&quot;: {&quot;MEMORY_PERCENT&quot;: 80}}\n        ]\n      },\n      &quot;limit&quot;: 15\n    }'\n  ) AS search_results;\n\n-- Search for slow requests with performance issues\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      &quot;query&quot;: &quot;slow request timeout performance&quot;,\n      &quot;columns&quot;: [&quot;MESSAGE&quot;, &quot;SERVICE&quot;, &quot;DURATION_MS&quot;, &quot;STATUS_CODE&quot;, &quot;TIMESTAMP&quot;, &quot;REQUEST_ID&quot;],\n      &quot;filter&quot;: {\n        &quot;@gte&quot;: {&quot;DURATION_MS&quot;: 1000}\n      },\n      &quot;limit&quot;: 20\n    }'\n  ) AS search_results;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBenefits of Cortex Search\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ENatural Language\u003C/strong\u003E: Query logs in plain English, not complex regex\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESemantic Understanding\u003C/strong\u003E: Finds conceptually similar messages, not just keyword matches\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFast\u003C/strong\u003E: Optimized vector search returns results in milliseconds\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAlways Fresh\u003C/strong\u003E: Automatically indexes new logs as they arrive\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESnowflake CoWork Integration\u003C/strong\u003E: Works seamlessly for conversational queries\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EMonitoring the Pipeline\u003C/h2\u003E\n","\u003Cp\u003ELet's monitor the health and performance of your streaming pipeline.\u003C/p\u003E\n","\u003Ch3\u003EMonitor Real-Time in Openflow Canvas\u003C/h3\u003E\n","\u003Cp\u003EThe Openflow Canvas provides real-time monitoring of your streaming pipeline. While data flows, observe the streaming statistics on the canvas:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_stats_reset.png\" alt=\"Openflow Canvas Statistics\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThe canvas displays real-time metrics for the connector process group:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EIn\u003C/strong\u003E: Number of running processors (e.g., 11 active components)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EQueued\u003C/strong\u003E: FlowFiles waiting to be processed (0 shown = no backlog, which is healthy)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EIn\u003C/strong\u003E: FlowFiles entering the process group with data volume\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERead/Write\u003C/strong\u003E: Data throughput rates (bytes read from Kafka / bytes written to Snowflake)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EOut\u003C/strong\u003E: FlowFiles leaving the process group\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETiming\u003C/strong\u003E: All metrics show data for the last &quot;5 min&quot; window\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EStatistics Reset\u003C/strong\u003E: The statistics displayed on the canvas reset every \u003Cstrong\u003E5 minutes\u003C/strong\u003E. If you see zeros, it means no data has flowed in the current 5-minute window. This is normal between data generation runs or during idle periods.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EDrill Down for Detailed Statistics\u003C/h4\u003E\n","\u003Cp\u003EYou can click on individual processors or connections to see detailed statistics and data flow:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_stats_drill_down.gif\" alt=\"Openflow Drill-Down Statistics\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWhat to Monitor\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EProcess Group Statistics\u003C/strong\u003E (on the canvas):\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ERunning processors count\u003C/li\u003E\u003Cli\u003EQueue sizes (should be low)\u003C/li\u003E\u003Cli\u003EData throughput rates\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIndividual Processor Stats\u003C/strong\u003E (right-click &rarr; View Status History):\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EConsumeKafka\u003C/strong\u003E: Bytes Read, FlowFiles Out, Processing Time\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EPutSnowflake\u003C/strong\u003E: FlowFiles In, Bytes Written, Success Rate\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConnection Queues\u003C/strong\u003E (click on arrows between processors):\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EFlowFiles Queued (should be minimal)\u003C/li\u003E\u003Cli\u003EQueue Size (indicates backpressure if large)\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHealthy Pipeline Indicators\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EMinimal queue buildup (&lt; 100 FlowFiles queued)\u003C/li\u003E\u003Cli\u003ESteady data throughput matching your production rate\u003C/li\u003E\u003Cli\u003EAll processors in running state (green)\u003C/li\u003E\u003Cli\u003ENo errors in processor logs\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EIf you see large queues (&gt; 1000), consider scaling up your runtime or adjusting processor concurrency settings.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EIf you encounter issues with your pipeline:\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENo Data Flowing\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EVerify Kafka topic has messages: \u003Ccode\u003Erpk topic consume application-logs --num 5\u003C/code\u003E\u003C/li\u003E\u003Cli\u003ECheck processors are running (green status in Canvas)\u003C/li\u003E\u003Cli\u003EVerify network rules allow Kafka broker access\u003C/li\u003E\u003Cli\u003EConfirm authentication credentials are correct\u003C/li\u003E\u003Cli\u003ECheck consumer group offset (may be at end of topic if using \u003Ccode\u003Elatest\u003C/code\u003E)\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003ESet Up Alerts (Optional)\u003C/h3\u003E\n","\u003Cp\u003EFor production pipelines, create Snowflake alerts for automated monitoring:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003EUSE ROLE QUICKSTART_ROLE;\nUSE DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\n\n-- Alert if error rate exceeds threshold\nCREATE OR REPLACE ALERT PUBLIC.HIGH_ERROR_RATE_ALERT\n  WAREHOUSE = QUICKSTART_KAFKA_CONNECTOR_WH\n  SCHEDULE = '5 MINUTE'\n  IF (\n    SELECT \n      SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0)\n    FROM &quot;APPLICATION-LOGS&quot;\n    WHERE TO_TIMESTAMP(TIMESTAMP) &gt;= DATEADD('minute', -5, CURRENT_TIMESTAMP())\n  ) &gt; 15  -- Alert if &gt; 15% error rate\n  THEN CALL SYSTEM$SEND_EMAIL(\n    'DataOps Team',\n    'ops@example.com',\n    'Kafka Pipeline Alert: Error rate exceeds 15% in last 5 minutes'\n  );\n\n-- Alert on critical service errors\nCREATE OR REPLACE ALERT PUBLIC.CRITICAL_SERVICE_ALERT\n  WAREHOUSE = QUICKSTART_KAFKA_CONNECTOR_WH\n  SCHEDULE = '5 MINUTE'\n  IF (\n    SELECT COUNT(*)\n    FROM &quot;APPLICATION-LOGS&quot;\n    WHERE LEVEL = 'ERROR'\n      AND SERVICE IN ('payment-service', 'auth-service')\n      AND TO_TIMESTAMP(TIMESTAMP) &gt;= DATEADD('minute', -5, CURRENT_TIMESTAMP())\n  ) &gt; 10\n  THEN CALL SYSTEM$SEND_EMAIL(\n    'DataOps Team',\n    'ops@example.com',\n    'Kafka Pipeline Alert: Critical service experiencing multiple errors'\n  );\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECustomize Alerts\u003C/strong\u003E: Adjust thresholds, services, and notification methods based on your operational needs. You can also integrate with \u003Ca href=\"https://docs.snowflake.com/en/user-guide/alerts\"\u003ESnowflake notifications\u003C/a\u003E for Slack, PagerDuty, or webhook integrations.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ECleanup\u003C/h2\u003E\n","\u003Cp\u003EWhen you're done with the demo, you can clean up resources to avoid unnecessary costs.\u003C/p\u003E\n","\u003Ch3\u003EStop Openflow Connector\u003C/h3\u003E\n","\u003Cp\u003EStop and disable the Kafka connector in the Openflow Canvas:\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_stop_disable.gif\" alt=\"Stop and Disable Kafka Connector\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESteps\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen the Openflow Canvas\u003C/li\u003E\u003Cli\u003ERight-click the connector process group\u003C/li\u003E\u003Cli\u003ESelect \u003Cstrong\u003EStop\u003C/strong\u003E to stop data flow\u003C/li\u003E\u003Cli\u003ERight-click again and select \u003Cstrong\u003EDisable\u003C/strong\u003E to prevent accidental restarts\u003C/li\u003E\u003Cli\u003EOptionally, delete the connector if you won't reuse it\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003EClean Up Snowflake Objects (Optional)\u003C/h3\u003E\n","\u003Cp\u003EIf you want to completely remove all demo objects, run the cleanup script from \u003Ccode\u003Esql/5.cleanup.sql\u003C/code\u003E:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Use ACCOUNTADMIN to drop objects\nUSE ROLE ACCOUNTADMIN;\n\n-- Drop Cortex Search service (if created)\nDROP CORTEX SEARCH SERVICE IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search;\n\n-- Drop alerts (if created)\nDROP ALERT IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.HIGH_ERROR_RATE_ALERT;\nDROP ALERT IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.CRITICAL_SERVICE_ALERT;\n\n-- Drop database (this removes all tables and data)\nDROP DATABASE IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB;\n\n-- Drop warehouse\nDROP WAREHOUSE IF EXISTS QUICKSTART_KAFKA_CONNECTOR_WH;\n\n-- Drop external access integration\nDROP EXTERNAL ACCESS INTEGRATION IF EXISTS quickstart_kafka_connector_access;\n\n-- Note: We don't drop QUICKSTART_ROLE as it may be used by other quickstarts\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWarning\u003C/strong\u003E: This will permanently delete all log data and configuration. Make sure you've exported anything you need before dropping objects.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EClean Up Openflow Runtime (Optional)\u003C/h3\u003E\n","\u003Cp\u003EIf you won't be using Openflow for other connectors:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ENavigate to \u003Cstrong\u003EData &gt; Integrations &gt; Openflow\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EClick on your deployment\u003C/li\u003E\u003Cli\u003EDelete the runtime (click ⋮ menu &rarr; Delete Runtime)\u003C/li\u003E\u003Cli\u003EOptionally, delete the deployment\u003C/li\u003E\u003C/ol\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKeep Runtime for Other Connectors\u003C/strong\u003E: If you plan to use other Openflow connectors (PostgreSQL CDC, Google Drive, etc.), keep your runtime and deployment&mdash;they can be reused across multiple connectors!\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EClean Up Kafka Resources (Optional)\u003C/h3\u003E\n","\u003Cp\u003EIf you created a Kafka topic specifically for this demo:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E# Delete the topic using rpk\nrpk topic delete application-logs\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EManaged Kafka Services\u003C/strong\u003E: For Confluent Cloud and other managed Kafka platforms, you can also delete topics through the service console or web UI.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EConclusion And Resources\u003C/h2\u003E\n","\u003Cp\u003ECongratulations! You've successfully built a real-time log streaming pipeline from Kafka to Snowflake using Openflow.\u003C/p\u003E\n","\u003Ch3\u003EWhat You Learned\u003C/h3\u003E\n","\u003Cp\u003EIn this quickstart, you:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E✅ Configured a Kafka topic for log streaming\u003C/li\u003E\u003Cli\u003E✅ Set up Snowflake objects (database, tables, network rules)\u003C/li\u003E\u003Cli\u003E✅ Created an Openflow Snowflake Deployments runtime\u003C/li\u003E\u003Cli\u003E✅ Configured the Openflow Kafka Connector with automatic schema evolution\u003C/li\u003E\u003Cli\u003E✅ Streamed real-time logs from Kafka to Snowflake\u003C/li\u003E\u003Cli\u003E✅ Performed powerful SQL analytics on streaming log data\u003C/li\u003E\u003Cli\u003E✅ Enabled semantic search with Cortex Search for natural language queries\u003C/li\u003E\u003Cli\u003E✅ Monitored pipeline health and performance\u003C/li\u003E\u003Cli\u003E✅ Set up automated alerts for production monitoring\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EKey Takeaways\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003EReal-Time Data\u003C/strong\u003E: With Snowpipe Streaming, logs appear in Snowflake within seconds of being produced to Kafka&mdash;enabling real-time monitoring and alerting.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECost-Effective\u003C/strong\u003E: Snowflake's storage costs are significantly lower than dedicated log platforms for long-term retention. Keep years of logs for compliance and historical analysis.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPowerful Analytics\u003C/strong\u003E: SQL is more flexible and powerful than log query languages. Join logs with business data, apply machine learning, and create complex analytical queries.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EScalable\u003C/strong\u003E: The pipeline scales automatically with your data volume. Kafka handles millions of events, Snowflake handles petabytes of data.\u003C/p\u003E\n","\u003Ch3\u003ENext Steps\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003E1. Advanced Kafka Features\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ETry with \u003Cstrong\u003EAVRO format\u003C/strong\u003E and \u003Cstrong\u003EConfluent Schema Registry\u003C/strong\u003E for schema evolution\u003C/li\u003E\u003Cli\u003EConfigure \u003Cstrong\u003Emultiple topics\u003C/strong\u003E with topic-to-table mapping\u003C/li\u003E\u003Cli\u003EImplement \u003Cstrong\u003ESASL_SSL security\u003C/strong\u003E for production deployments\u003C/li\u003E\u003Cli\u003ETune for \u003Cstrong\u003Ehigh-throughput\u003C/strong\u003E using the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/performance-tuning\"\u003Eperformance guide\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E2. Enhance Analytics &amp; AI\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ECreate \u003Cstrong\u003Ematerialized views\u003C/strong\u003E for common queries\u003C/li\u003E\u003Cli\u003EBuild \u003Cstrong\u003EStreamlit dashboards\u003C/strong\u003E for real-time monitoring\u003C/li\u003E\u003Cli\u003EApply \u003Cstrong\u003ESnowflake Cortex AI\u003C/strong\u003E for anomaly detection and log classification\u003C/li\u003E\u003Cli\u003EExpand \u003Cstrong\u003ECortex Search\u003C/strong\u003E with additional attributes and custom relevance ranking\u003C/li\u003E\u003Cli\u003EUse \u003Cstrong\u003ESnowflake CoWork\u003C/strong\u003E for conversational log exploration\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E3. Try Other Openflow Connectors\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://quickstarts.snowflake.com/guide/getting_started_with_openflow_postgresql_cdc/\"\u003E\u003Cstrong\u003EPostgreSQL CDC\u003C/strong\u003E\u003C/a\u003E: Replicate database changes in real-time\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/gdrive/about\"\u003E\u003Cstrong\u003EGoogle Drive\u003C/strong\u003E\u003C/a\u003E: Ingest unstructured documents for AI analysis\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kinesis/about\"\u003E\u003Cstrong\u003EKinesis\u003C/strong\u003E\u003C/a\u003E: Stream data from AWS\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/mysql/about\"\u003E\u003Cstrong\u003EMySQL CDC\u003C/strong\u003E\u003C/a\u003E: Replicate MySQL databases\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003E4. Production Deployment\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESet up alerting for pipeline failures\u003C/li\u003E\u003Cli\u003EImplement data quality checks\u003C/li\u003E\u003Cli\u003EConfigure backup and failover\u003C/li\u003E\u003Cli\u003EDocument runbooks for operations\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EResources\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOpenflow &amp; Kafka\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/about\"\u003EOpenflow Documentation\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/about\"\u003EKafka Connector Documentation\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/performance-tuning\"\u003EKafka Connector Performance Tuning\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/about-openflow-connectors\"\u003EAll Openflow Connectors\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESnowflake Features\u003C/strong\u003E:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-load-snowpipe-streaming-overview\"\u003ESnowpipe Streaming\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-overview\"\u003ECortex Search\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-intelligence\"\u003ESnowflake CoWork\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/alerts\"\u003ESnowflake Alerts\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EFeedback\u003C/h3\u003E\n","\u003Cp\u003EWe'd love to hear your feedback! If you have questions or suggestions:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://github.com/Snowflake-Labs/sfquickstarts/issues\"\u003EOpen an issue\u003C/a\u003E on GitHub\u003C/li\u003E\u003Cli\u003EShare your experience on \u003Ca href=\"https://community.snowflake.com/\"\u003ESnowflake Community\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThank you for completing this quickstart!\u003C/p\u003E"],"description":"Getting Started with Openflow Kafka Connector for Real-Time Log Streaming","title":"Getting Started with Openflow Kafka Connector","isDeveloperGuidesPage":false,":type":"snowflake-site/components/contentfragment",":items":{},":itemsOrder":[],"elements":{"quickstartArticleBody":{"title":"Quickstart Article Body","dataType":"string","value":"\u003C!-- ------------------------ --\u003E\n## Overview\n\nThis quickstart demonstrates how to build a real-time streaming pipeline from Apache Kafka to Snowflake using Openflow. You'll learn how to capture application and system logs in real-time, enabling immediate analytics and insights on operational data.\n\n### Demo: Application Log Streaming\n\nYou'll stream realistic application and system logs including web API requests, authentication events, database operations, system metrics, and error tracking.\n\n**Sample Log Structure:**\n\n```json\n{\n  \"timestamp\": \"2025-10-15T10:23:45.123Z\",\n  \"level\": \"INFO\",\n  \"service\": \"web-api\",\n  \"host\": \"api-server-01\",\n  \"message\": \"Request processed successfully\",\n  \"request_id\": \"req-abc123\",\n  \"duration_ms\": 45,\n  \"status_code\": 200\n}\n```\n\nThis demonstrates a common pattern: centralizing logs from distributed systems for real-time monitoring, historical analysis, and incident investigation using Snowflake's SQL analytics instead of expensive log platforms.\n\nBy completing this guide, you will build an end-to-end streaming pipeline that ingests logs from Kafka in real-time and enables powerful analytics in Snowflake.\n\n### What is Openflow\n\n[Snowflake Openflow](https://docs.snowflake.com/en/user-guide/data-integration/openflow/about) is Snowflake's integration service built on Apache NiFi. Think of it as a universal connector that can pipe data from practically anywhere into Snowflake—structured tables, unstructured documents, images, videos, sensor data, you name it.\n\nWhat makes Openflow powerful:\n\n- **Hundreds of connectors** out of the box, with the flexibility to build custom ones if needed\n- **Handles both batch and streaming** at virtually any scale—perfect for real-time use cases like this log streaming demo\n- **Fully managed** by Snowflake, so you get built-in security, compliance, and monitoring without the operational overhead\n- **Bi-directional data flows**—not just loading data in, but also sending data out to other systems when needed\n\nThe best part? It's all powered by Apache NiFi under the hood, which is battle-tested and used by thousands of companies for mission-critical data pipelines.\n\n**Openflow Deployment Models**:\n\nOpenflow is available in two deployment options, both supporting the same connectors and features:\n\n- **Snowflake Deployment (SPCS)**: Streamlined and integrated solution using Snowpark Container Services. Native integration with Snowflake's security model for seamless authentication, authorization, and network security. *This quickstart uses SPCS deployment.*\n- **Bring Your Own Cloud (BYOC)**: Data processing engine runs within your own cloud environment (AWS, Azure, GCP) while Snowflake manages the overall service and control plane. Ideal for handling sensitive data preprocessing locally within your organization's cloud environment.\n\nLearn more at the [Openflow documentation](https://docs.snowflake.com/en/user-guide/data-integration/openflow/about) and [BYOC deployments](https://docs.snowflake.com/en/user-guide/data-integration/openflow/about-byoc).\n\n### About the Openflow Kafka Connector\n\nThe [Openflow Connector for Kafka](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/about) reads messages from Kafka topics and writes them into Snowflake tables using Snowpipe Streaming for low-latency ingestion.\n\n**In this quickstart**, we'll use the [JSON/AVRO data format connector](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/kafka-json-avro) which provides:\n\n- **Automatic Schema Detection**: Message fields become table columns automatically\n- **Schema Evolution**: Tables adapt when new fields are added\n- **Simple Configuration**: Easy to get started\n\n\u003E **Advanced Option**: For production scenarios requiring Kafka metadata (partition, offset), dead letter queues, or Iceberg table support, see the [DLQ and metadata connector](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/kafka-dlq-metadata).\n\n### What You Will Learn\n\nYou'll configure a Kafka topic, set up the Openflow Kafka connector, and stream log data in real-time to Snowflake. Then you'll use SQL to perform real-time analytics on your streaming logs.\n\n### What You Will Build\n\nA real-time log streaming and analytics platform with an automated pipeline from Kafka to Snowflake, complete with monitoring and sample analytics queries.\n\n### Prerequisites\n\nBefore we dive in, here's what you'll need:\n\n**Snowflake Setup:**\n\n- Enterprise account with Openflow Snowflake Deployments enabled (AWS, Azure, or GCP Commercial Regions)\n- ACCOUNTADMIN access (or someone who can help with the initial setup—we'll need to create network rules and external access integrations)\n\n**Kafka Cluster:**\n\n- Access to a Kafka cluster—could be Confluent Cloud, AWS MSK, GCP Managed Kafka, Azure Event Hubs with Kafka API, or self-hosted\n- Ability to create topics and produce messages (we'll create one called `application-logs`)\n- Network connectivity from Snowflake to your Kafka brokers (we'll walk you through the network rule setup—it's easier than it sounds!)\n\n\u003E **Don't have Kafka yet?** We tested this with **Confluent Cloud**, which has a free tier perfect for this quickstart. You can spin up a cluster in about 5 minutes. Other managed options like AWS MSK or GCP Managed Kafka work great too.\n\n\u003E **Using Openflow BYOC?** This quickstart focuses on **SPCS deployment** (Snowflake-managed), but the connector setup and concepts are identical for [BYOC deployments](https://docs.snowflake.com/en/user-guide/data-integration/openflow/about-byoc)—only the runtime deployment steps differ.\n\n\u003C!-- ------------------------ --\u003E\n\n## Clone Repository\n\nLet's grab the [companion code](https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector) which has everything you need—SQL scripts, sample data, and helpful utilities to make your life easier.\n\n```bash\ngit clone https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector.git\ncd sfguide-getting-started-openflow-kafka-connector\nexport QUICK_START_REPO=$PWD\n```\n\nThe `QUICK_START_REPO` environment variable will help us reference files easily throughout this guide.\n\n### What's in the Repository?\n\n**SQL Scripts** (Run these in Snowsight):\n\n- `sql/1.snowflake_setup.sql` - Sets up your Snowflake environment (role, database, warehouse, network rules)\n- `sql/2.verify_ingestion.sql` - Checks that data is flowing correctly\n- `sql/2a.verify_base_schema.sql` - Validates your initial schema (11 fields)\n- `sql/2b.verify_schema_evolution.sql` - Confirms new columns appeared automatically (29 fields)\n- `sql/3.analytics_queries.sql` - Real-world analytics examples you can run on your log data\n- `sql/4.cortex_search.sql` - Semantic search queries with natural language\n- `sql/5.cleanup.sql` - Clean up when you're done\n\n**Sample Data** (Pre-generated for testing):\n\n- `sample-data/sample_logs.json` - 50 realistic log events (base schema)\n- `sample-data/sample_logs_evolved.json` - 80 log events with extra fields (evolved schema)\n- `sample-data/generate_logs.py` - Python script to generate custom logs or test your Kafka connection\n\n**Helper Tools**:\n\n- `Taskfile.yml` - Automates common tasks (optional but handy!)\n- `.env.template` - Template for your Kafka connection settings\n- `RPK_CLI_README.md` - Detailed rpk CLI setup guide\n\n\u003E **Prefer Notebooks?** If you're more comfortable with Jupyter notebooks, you can follow along using our [interactive notebook version](https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector/blob/main/notebooks/OPENFLOW_KAFKA_CONNECTOR_QS.ipynb) instead. It contains the same content in a notebook-friendly format.\n\n\u003E **Quick Tip**: The `generate_logs.py` script has a `--test-connection` flag that's super helpful for verifying your Kafka setup works before we start. We'll use this later!\n\n\u003C!-- ------------------------ --\u003E\n\n## Configure Kafka\n\nTime to get Kafka ready! We'll install the Kafka CLI tools (rpk), create our topic, and make sure everything's connected properly before we start streaming logs.\n\n### Kafka Requirements\n\nThis guide assumes you have a Kafka cluster already created and available. Before proceeding, ensure your cluster meets these requirements:\n\n\u003E **Required Kafka Configuration**:\n\u003E\n\u003E - **Kafka cluster available**: You have a running Kafka cluster (GCP Managed Kafka, AWS MSK, Confluent Cloud, or self-hosted) with network accessibility from Snowflake.\n\u003E - **Topic creation permissions**: Ability to create topics or use existing topics\n\u003E - **Producer access**: Ability to produce messages to topics (for testing)\n\u003E - **Broker endpoints**: Note down your Kafka broker addresses (e.g., `broker1:9092,broker2:9092`)\n\u003E - **Security protocol**: Know your security configuration (SASL_SSL)\n\u003E - **SASL mechanism**: Know your SASL mechanism (PLAIN)\n\u003E\n\u003E This quickstart was tested with **Confluent Cloud**.\n\n### Setup Redpanda CLI (rpk)\n\nWe'll use [`rpk` (Redpanda CLI)](https://docs.redpanda.com/current/reference/rpk/) for Kafka operations. Don't let the name fool you—despite being called \"Redpanda CLI,\" it works perfectly with **any** Kafka cluster (Confluent, AWS MSK, GCP, self-hosted, etc.).\n\n**Why rpk instead of traditional kafka-topics.sh?**\n\n- ✅ **Simpler commands** - Much easier to remember and type\n- ✅ **Better error messages** - Actually tells you what went wrong\n- ✅ **Works everywhere** - One tool for all your Kafka clusters\n- ✅ **Modern UX** - Helpful output, color coding, progress indicators\n\nThink of rpk as the \"kubectl for Kafka\"—it's what the kafka-topics.sh tool should have been!\n\n**Install rpk**:\n\n**macOS (Homebrew)**:\n\n```bash\nbrew install redpanda-data/tap/redpanda\n```\n\n**Linux (Debian/Ubuntu)**:\n\n```bash\ncurl -1sLf 'https://dl.redpanda.com/nzc4ZYQK3WRGd9sy/redpanda/cfg/setup/bash.deb.sh' | sudo -E bash\nsudo apt install redpanda -y\n```\n\n**Linux (RHEL/CentOS)**:\n\n```bash\ncurl -1sLf 'https://dl.redpanda.com/nzc4ZYQK3WRGd9sy/redpanda/cfg/setup/bash.rpm.sh' | sudo -E bash\nsudo yum install redpanda -y\n```\n\n**Verify installation**:\n\n```bash\nrpk version\n```\n\n\u003E **Alternative**: If you prefer traditional Kafka CLI tools, they work too. Just replace `rpk` commands with equivalent `kafka-topics.sh` commands. However, we recommend `rpk` for its improved usability.\n\n### Configure rpk Profile\n\nLet's create an rpk **profile**—think of it as a saved connection shortcut. Instead of typing your broker address and credentials every single time you run a command, we'll save them once in a profile and rpk will remember them.\n\n**What's a profile?** It's like saving a WiFi password—you configure it once, and it just works from then on. No more typing `--brokers`, `--username`, `--password` over and over!\n\n\u003E **Important - Kafka Credentials Required**: Before proceeding, ensure you have obtained the following from your Kafka cluster administrator or cloud console:\n\u003E\n\u003E - **Kafka Broker Address(es)**: Public endpoint(s) of your Kafka brokers (e.g., `broker-1.example.com:9092`)\n\u003E - **Username**: Your SASL authentication username (e.g. \"api-key\" in Confluent Cloud)\n\u003E - **Password**: Your SASL authentication password (e.g. \"api-secret\" in Confluent Cloud)\n\u003E\n\u003E For this quickstart, we assume:\n\u003E\n\u003E - **Security Protocol**: `SASL_SSL` (encrypted connection with authentication)\n\u003E - **SASL Mechanism**: `PLAIN` (username/password authentication)\n\n**Profile Setup (SASL_SSL with PLAIN)**:\n\n```bash\n# Create a profile for this quickstart\nrpk profile create quickstart-kafka\n\n# Set broker and security settings\n# Replace YOUR-KAFKA-BROKER, YOUR-USER-NAME, and YOUR-PASSWORD with your actual Kafka broker, username, and password\nrpk profile set kafka_api.tls.enabled=\"true\"\nrpk profile set brokers=\"YOUR-KAFKA-BROKER:9092\"\nrpk profile set sasl.mechanism=\"PLAIN\"\nrpk profile set user=\"YOUR-USER-NAME\"\nrpk profile set pass=\"YOUR-PASSWORD\"\n```\n\n\u003E **Confluent Cloud Users**: Use your Confluent Cloud **API Key** as the username and **API Secret** as the password. These can be created in the Confluent Cloud Console under \"Data Integration\" → \"API Keys\".\n\n**Verify profile configuration**:\n\n```bash\n# View current profile\nrpk profile print\n\n# Test connection\nrpk cluster info\n```\n\nYou should see your cluster information displayed, confirming connectivity.\n\n\u003E **Profile Benefits**: With a configured profile, you don't need to specify `--brokers` or authentication details in subsequent rpk commands. The profile stores all connection settings securely.\n\n### Kafka Service Options\n\nThis quickstart works with any Kafka service. Ensure you have:\n\n- **Broker Endpoints**: The connection string(s) for your Kafka cluster\n- **Network Access**: Kafka brokers must be accessible from Snowflake\n- **Credentials**: API keys/passwords if using SASL authentication\n- **Topic Permissions**: Ability to create topics and produce messages\n\n**Common Kafka Services**:\n\n- **Confluent Cloud**: Fully managed Kafka service\n- **GCP Managed Kafka**: Cloud Pub/Sub with Kafka API enabled\n- **AWS MSK**: Managed Streaming for Apache Kafka\n- **Azure Event Hubs**: With Kafka protocol support\n- **Self-Hosted Kafka**: Your own Kafka cluster\n\n\u003E **Tested Environment**: This quickstart was tested with **Confluent Cloud** using SASL_SSL security protocol and PLAIN authentication mechanism.\n\n### Create Kafka Topic\n\nCreate a topic for streaming application logs using rpk. Since we configured the profile, we don't need to specify `--brokers` in commands.\n\n```bash\n# Create topic with 3 partitions for scalability\nrpk topic create application-logs \\\n  --partitions 3 \\\n  --replicas 3\n```\n\n**Expected output**:\n\n```\nTOPIC            STATUS\napplication-logs  OK\n```\n\n\u003E **Topic Naming**: You can use any topic name you prefer. If you use a different name, make sure to update the connector configuration accordingly. The default setup assumes `application-logs`.\n\n### Verify Kafka Cluster and Topic\n\nUse rpk to verify your cluster configuration and the newly created topic:\n\n```bash\n# List all topics\nrpk topic list\n```\n\nYou should see `application-logs` in the topic list.\n\n```bash\n# Describe the topic details\nrpk topic describe application-logs\n```\n\nThis shows partition count, replication factor, and other configuration.\n\n### Record Cluster Information\n\nRun `rpk cluster info` to get your Kafka broker details. **You'll need these broker endpoints for the Snowflake network rule configuration in the next chapter.**\n\n```bash\n# Display cluster information\nrpk cluster info\n```\n\n**Expected output**:\n\nThe output will look like this and may vary depending on your Kafka cluster.\n\n```\nCLUSTER\n=======\nlkc-ddwwmo\n\nBROKERS\n=======\nID    HOST                          PORT\n0     broker-1.example.com          9092\n1     broker-2.example.com          9092\n2     broker-3.example.com          9092\n...\n\nTOPICS\n======\nNAME              PARTITIONS  REPLICAS\napplication-logs  3           3\ntopic_0           6           3\n...\n```\n\n**⚠️ Important—don't skip this:** Grab all those broker endpoints from the output (like `broker-1.example.com:9092`, `broker-2.example.com:9092`, etc.). You'll need them in the next chapter when we configure Snowflake's network rules. Think of it as telling Snowflake \"these Kafka brokers are safe to talk to.\"\n\n### Setup Log Generator\n\nNow that your Kafka environment is configured, verify your connection and credentials using the helper script from the cloned repository.\n\n**Setup Python environment using uv** (recommended):\n\nThe repository includes a `pyproject.toml` for dependency management. We'll use `uv` for faster package installation:\n\n```bash\n# Install uv (if not already installed)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# Create virtual environment and install dependencies\nuv venv\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\nuv sync\n```\n\n**Alternative - using pip**:\n\n```bash\npip install kafka-python python-dotenv\n```\n\n**Configure environment variables**:\n\nThe `generate_logs.py` script requires environment variables. Copy the template and update it with your Kafka credentials:\n\n```bash\n# Copy template to .env\ncp $QUICK_START_REPO/.env.template .env\n\n# Edit .env with your Kafka credentials\n# Update the following values:\n#   KAFKA_BOOTSTRAP_SERVERS - Your Kafka broker endpoint(s)\n#   KAFKA_SASL_USERNAME - Your API Key/username\n#   KAFKA_SASL_PASSWORD - Your API Secret/password\n```\n\n\u003E **Required Configuration**: The `.env` file is required for the `generate_logs.py` script to work. Update `KAFKA_BOOTSTRAP_SERVERS`, `KAFKA_SASL_USERNAME`, and `KAFKA_SASL_PASSWORD` with your actual Kafka credentials from the rpk profile setup. The template already has `KAFKA_SECURITY_PROTOCOL=SASL_SSL` and `KAFKA_SASL_MECHANISM=PLAIN` set correctly.\n\n**Test connection**:\n\n```bash\npython $QUICK_START_REPO/sample-data/generate_logs.py --test-connection\n```\n\n**Expected output for successful connection**:\n\n```\n============================================================\nKAFKA CONNECTION TEST\n============================================================\n\n[1/4] Testing connection to Kafka brokers...\n      Brokers: pkc-n98pk.us-west-2.aws.confluent.cloud:9092\n      Security: SASL_SSL\n      SASL Mechanism: PLAIN\n      SASL Username: FNEI67I3U52IIGG5\n      ✓ Successfully connected to Kafka brokers\n\n[2/4] Fetching cluster metadata...\n      ✓ Connected to cluster\n\n[3/4] Checking topic accessibility...\n      Topic: application-logs\n      ✓ Topic 'application-logs' exists and is accessible\n      ✓ Topic has 3 partition(s): [0, 1, 2]\n\n[4/4] Testing write permissions...\n      Sending test message to topic 'application-logs'...\n      ✓ Successfully sent test message\n      ✓ Written to partition 2 at offset 6\n\n============================================================\nCONNECTION TEST RESULT: ✓ SUCCESS\n============================================================\n\nYour Kafka configuration is working correctly!\nYou can now produce logs with:\n  python generate_logs.py --count 100\n```\n\n\u003E **Troubleshooting**: If the connection test fails, verify:\n\u003E\n\u003E - Your `.env` file has correct values matching your rpk profile\n\u003E - The broker endpoints are accessible from your network\n\u003E - Your API Key and API Secret are correct\n\u003E - Security protocol and SASL mechanism match your cluster's configuration\n\n### Next Steps\n\nWith your Kafka environment validated, you're ready to configure Snowflake to access your Kafka cluster. The broker endpoints from `rpk cluster info` will be added to Snowflake's network rules in the next chapter.\n\n\u003C!-- ------------------------ --\u003E\n## Configure Snowflake\n\nPerfect! Kafka's configured. Now let's get Snowflake ready to receive those logs. We'll create a dedicated database, warehouse, and—here's the important part—network rules that tell Snowflake \"these Kafka brokers are safe to connect to.\"\n\n### Run Snowflake Setup Script\n\nOpen **Snowsight** (Snowflake's web UI) or your preferred SQL client and run the setup script located in `sql/1.snowflake_setup.sql` from the cloned repository.\n\nThe script will create:\n\n1. **Role**: `QUICKSTART_ROLE` - Runtime role for Openflow operations (reused if already exists)\n2. **Database**: `QUICKSTART_KAFKA_CONNECTOR_DB` - Database for storing Kafka streaming data\n3. **Warehouse**: `QUICKSTART_KAFKA_CONNECTOR_WH` (XS size) - Compute for queries\n4. **Schema**: `NETWORKS` - Schema for network rules\n5. **Network Rule**: `kafka_network_rule` - Allow network access to Kafka brokers\n6. **External Access Integration**: `quickstart_kafka_connector_access` - Enable Openflow to connect to Kafka\n\n### Customize Network Rule\n\n\u003E **IMPORTANT - Get Your Kafka Broker List**: Before customizing the network rule, extract your broker endpoints from the Kafka cluster info you recorded earlier.\n\u003E\n\u003E **Quick Extract Command** (if you have jq installed):\n\u003E\n\u003E ```bash\n\u003E rpk cluster info --format=json | jq -r '[.brokers[].host] | map(\"'\"'\"'\" + . + \"'\"'\"'\") | join(\",\")'\n\u003E ```\n\u003E\n\u003E **Example output**: `'broker-1.example.com','broker-2.example.com','broker-3.example.com'`\n\u003E\n\u003E This formatted list is ready to paste into the network rule's `VALUE_LIST`.\n\n**⚠️ Don't skip this step!** The network rule is like a firewall allowlist—you need to tell Snowflake exactly which Kafka brokers it's allowed to connect to.\n\nIn the script, find this section:\n\n```sql\n-- IMPORTANT: Update the network rule with your Kafka broker endpoints\nCREATE OR REPLACE NETWORK RULE QUICKSTART_KAFKA_CONNECTOR_DB.NETWORKS.kafka_network_rule\n  MODE = EGRESS\n  TYPE = HOST_PORT\n  VALUE_LIST = (\n    'YOUR-KAFKA-BROKER-1:9092',  -- Replace with your actual Kafka broker\n    'YOUR-KAFKA-BROKER-2:9092',  -- Add additional brokers if available\n    'YOUR-KAFKA-BROKER-3:9092'   -- Remove if you have fewer brokers\n  );\n```\n\nReplace `YOUR-KAFKA-BROKER-X` with your actual Kafka broker hostnames or IP addresses.\n\n**Examples**:\n\n- **GCP Managed Kafka**: `'34.123.45.67:9092'`\n- **AWS MSK**: `'b-1.mycluster.kafka.us-east-1.amazonaws.com:9092'`\n- **Confluent Cloud**: `'pkc-xxxxx.us-east-1.aws.confluent.cloud:9092'`\n- **Self-hosted**: `'kafka.mycompany.com:9092'`\n\n#### Multiple Brokers\n\nIf your Kafka cluster has multiple brokers (recommended for production), add all broker endpoints to the `VALUE_LIST`. This ensures high availability and proper load balancing.\n\nFor example:\n\n```sql\nVALUE_LIST = (\n  'broker-1.kafka.example.com:9092',\n  'broker-2.kafka.example.com:9092',\n  'broker-3.kafka.example.com:9092'\n)\n```\n\n#### Using Wildcards for Similar Domains\n\nIf your Kafka brokers follow a similar naming pattern (e.g., `broker-1.kafka.example.com`, `broker-2.kafka.example.com`), you can simplify your network rule using wildcards:\n\n```sql\nVALUE_LIST = ('*.kafka.example.com:9092')\n```\n\nThis pattern matches all subdomains under `kafka.example.com`, making it easier to maintain when brokers are added or removed.\n\n**For more information** on wildcard patterns and `HOST_PORT` type rules, see the [CREATE NETWORK RULE](https://docs.snowflake.com/en/sql-reference/sql/create-network-rule) documentation.\n\n### Execute the Setup Script\n\n1. Open Snowsight and sign in with ACCOUNTADMIN or equivalent role\n2. Open a new SQL worksheet\n3. Copy the contents of `sql/1.snowflake_setup.sql` (after updating network rule)\n4. Execute the entire script\n5. Verify objects were created:\n\n```sql\n-- Verify objects\nUSE ROLE QUICKSTART_ROLE;\nSHOW DATABASES LIKE 'QUICKSTART_KAFKA_CONNECTOR_DB';\nSHOW SCHEMAS IN DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\nSHOW WAREHOUSES LIKE 'QUICKSTART_KAFKA_CONNECTOR_WH';\nSHOW NETWORK RULES IN SCHEMA QUICKSTART_KAFKA_CONNECTOR_DB.NETWORKS;\nSHOW EXTERNAL ACCESS INTEGRATIONS LIKE 'quickstart_kafka_connector_access';\n```\n\nYou should see all objects created successfully.\n\n\u003C!-- ------------------------ --\u003E\n## Setup Openflow Runtime\n\nBefore you can use the Kafka connector, you need an active Openflow Snowflake Deployments runtime. If you've already set up Openflow Snowflake Deployments for another quickstart, you can skip this section and reuse your existing runtime.\n\n\u003E **New to Openflow Snowflake Deployments?** For more comprehensive coverage, see the dedicated [Getting Started with Openflow Snowflake Deployments](https://quickstarts.snowflake.com/guide/getting_started_with_openflow_spcs/index.html) quickstart. The steps below provide everything you need to get started quickly.\n\n### Create Openflow Deployment\n\n1. In Snowsight, navigate to **Data \u003E Integrations \u003E Openflow**\n2. Click **+ Deployment**\n3. Enter deployment name: `QUICKSTART_KAFKA_DEPLOYMENT`\n4. Select region matching your account region\n5. Click **Create Deployment**\n6. Wait for status to show **Active** (2-3 minutes)\n\n### Create Openflow Runtime\n\nOnce your deployment is active:\n\n1. Click on your deployment name (`QUICKSTART_KAFKA_DEPLOYMENT`)\n2. Click **+ Runtime**\n3. Configure the runtime:\n   - **Name**: `QUICKSTART_KAFKA_RUNTIME`\n   - **Size**: Small (sufficient for this quickstart)\n   - **Runtime Role**: Select `QUICKSTART_ROLE` (created in previous step)\n   - **External Access Integrations**: Select `quickstart_kafka_connector_access`\n4. Click **Create Runtime**\n5. Wait for status to show **Active** (2-5 minutes)\n\n![Creating Openflow Snowflake Deployments Runtime](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_runtime_create.gif)\n\n\u003E **Important**: Make sure to attach the `quickstart_kafka_connector_access` external access integration when creating the runtime. This allows the runtime to connect to your Kafka brokers through Snowflake's network rules.\n\nYou're now ready to configure the Kafka connector!\n\n\u003C!-- ------------------------ --\u003E\n## Add Kafka Connector\n\nPerfect! Both Kafka and Snowflake are set up. Now comes the fun part—connecting them together with Openflow. We'll add the Kafka connector to our runtime and configure it through the Openflow Canvas (web UI).\n\n![Adding Kafka Connector to Openflow Runtime](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_add_connector_to_runtime.gif)\n\n\u003E **New Tab & Authentication**: Adding the connector to your runtime will open a new runtime tab in your browser with the canvas showing the **Openflow Kafka; JSON + SASL + Schema evolution** (abbreviated as **Kafka JSON SASL SCHEMAEV**) processor group. If prompted, authenticate/authorize access to allow the canvas to access the runtime. You'll configure this connector in the next section.\n\nThe **Openflow Kafka; JSON + SASL + Schema evolution** connector is now on your canvas. It includes all the processors and services needed to stream data from Kafka to Snowflake.\n\n\u003C!-- ------------------------ --\u003E\n## Configure Kafka Connector\n\nThe **Openflow Kafka; JSON + SASL + Schema evolution** connector uses three parameter contexts to organize its configuration:\n\n1. **Kafka JSON SASL SCHEMAEV Source Parameters** - Kafka connection details including brokers, security settings, and topic configuration\n2. **Kafka JSON SASL SCHEMAEV Destination Parameters** - Snowflake target database and schema configuration\n3. **Kafka JSON SASL SCHEMAEV Ingestion Parameters** - Kafka-specific settings like topic names, consumer group, and auto-offset reset\n\n\u003E **About the Connector Name**: \"Kafka JSON SASL SCHEMAEV\" is the abbreviated form of **Openflow Kafka; JSON + SASL + Schema evolution**. This name indicates the connector supports JSON data format, SASL authentication, and automatic schema evolution.\n\nTo access parameter contexts:\n\n![Access Parameter Contexts](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_paramc_list.png)\n\n### Configure Kafka Source Parameters\n\nConfigure the Kafka connection details including broker endpoints, security protocol, and authentication.\n\n#### Access Kafka Source Parameters\n\nFrom the Parameter contexts list, click the **three dots menu (⋮)** next to **Kafka JSON SASL SCHEMAEV Source Parameters** and select **Edit**.\n\n![Edit Kafka Source Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_edit_src_params.png)\n\nClick on the **Parameters** tab and configure the following values:\n\n| Parameter | Value | Description |\n|-----------|-------|-------------|\n| **Kafka Bootstrap Servers** | `pkc-n98px.us-west-2.aws.confluent.cloud:9092` | Your Kafka broker endpoint(s). Replace with your actual broker address from the `rpk cluster info` output. For multiple brokers, use comma-separated list (e.g., `broker1:9092,broker2:9092,broker3:9092`). |\n| **Kafka SASL Mechanism** | `PLAIN` | SASL authentication mechanism. Use `PLAIN` for username/password authentication (Confluent Cloud uses this). |\n| **Kafka SASL Password** | `\u003CYOUR-API-SECRET\u003E` | Your Kafka SASL password (called \"API Secret\" in Confluent Cloud). This will be stored as a sensitive value. |\n| **Kafka SASL Username** | `\u003CYOUR-API-KEY\u003E` | Your Kafka SASL username (called \"API Key\" in Confluent Cloud). |\n| **Kafka Security Protocol** | `SASL_SSL` | Security protocol for Kafka connection. `SASL_SSL` provides encrypted connection with authentication. |\n\n\u003E **Connection Details**: These values should match the credentials you configured in the `rpk profile` during the [Setup Kafka Environment](#setup-kafka-environment) section. If you're using Confluent Cloud, these are your API Key (username) and API Secret (password).\n\nYour completed configuration should look like this:\n\n![Set Kafka Source Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_set_src_parameters.png)\n\nClick **Apply** to save your Kafka source parameters configuration.\n\n### Configure Kafka Destination Parameters\n\nConfigure the Snowflake destination connection where Kafka data will be streamed.\n\n\u003E **IMPORTANT**: Ensure you have completed the [Setup Snowflake Environment](#setup-snowflake-environment) section before proceeding. The Kafka connector requires the database, warehouse, and role to be created in advance.\n\n#### Access Kafka Destination Parameters\n\nFrom the Parameter contexts list, click the **three dots menu (⋮)** next to **Kafka JSON SASL SCHEMAEV Destination Parameters** and select **Edit**.\n\n![Edit Kafka Destination Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_edit_dest_params.png)\n\nClick on the **Parameters** tab and configure the following values:\n\n| Parameter | Value | Description |\n|-----------|-------|-------------|\n| **Destination Database** | `QUICKSTART_KAFKA_CONNECTOR_DB` | Snowflake database where tables will be created (created in [sql/1.snowflake_setup.sql](https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector/blob/main/sql/1.snowflake_setup.sql)) |\n| **Destination Schema** | `PUBLIC` | Snowflake schema where tables will be created |\n| **Snowflake Account Identifier** | Leave empty | Not required when using session token authentication |\n| **Snowflake Authentication Strategy** | `SNOWFLAKE_SESSION_TOKEN` | Uses the runtime's session for authentication (recommended for SPCS deployments) |\n| **Snowflake Private Key** | Leave empty | Not required when using session token authentication |\n| **Snowflake Private Key File** | Leave empty | Not required when using session token authentication |\n| **Snowflake Private Key Password** | Leave empty | Not required when using session token authentication |\n| **Snowflake Role** | `QUICKSTART_ROLE` | Runtime role with permissions to create tables and write data (created in [sql/1.snowflake_setup.sql](https://github.com/Snowflake-Labs/sfguide-getting-started-openflow-kafka-connector/blob/main/sql/1.snowflake_setup.sql)) |\n| **Snowflake Username** | Leave empty | Not required when using session token authentication |\n\nYour completed configuration should look like this:\n\n![Set Kafka Destination Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_set_dest_params.png)\n\n\u003E **Session Token Authentication**: When using `SNOWFLAKE_SESSION_TOKEN`, the connector authenticates using the Openflow runtime's Snowflake session. This is the recommended approach for SPCS deployments as it eliminates the need to manage separate credentials.\n\nClick **Apply** to save your Kafka destination parameters configuration.\n\n### Configure Kafka Ingestion Parameters\n\nConfigure Kafka-specific ingestion settings including topics, consumer group, and offset behavior. This parameter context inherits values from both **Kafka Source Parameters** and **Kafka Destination Parameters**.\n\n#### Access Kafka Ingestion Parameters\n\nFrom the Parameter contexts list, click the **three dots menu (⋮)** next to **Kafka JSON SASL SCHEMAEV Ingestion Parameters (1)** and select **Edit**.\n\n![Edit Kafka Ingestion Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_edit_ingestion_params.png)\n\nClick on the **Parameters** tab. By default, all parameters including inherited ones are visible. You can toggle the visibility of inherited parameters using the **Show inherited parameters** checkbox at the bottom.\n\n![Toggle Inherited Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_show_hide_inheritence_props.gif)\n\nConfigure the following key parameters:\n\n| Parameter | Value | Description |\n|-----------|-------|-------------|\n| **Kafka Auto Offset Reset** | `latest` | Determines where to start reading when no offset exists. Use `latest` to read new messages only, or `earliest` to read from the beginning of the topic. |\n| **Kafka Group Id** | `openflow_qs_kafka_connector` | Kafka consumer group ID. This identifies the consumer group and tracks consumed offsets. |\n| **Kafka Topic Format** | `names` | Specifies whether to use topic names (as opposed to regex patterns). Use `names` for explicit topic list. |\n| **Kafka Topics** | `application-logs` | Comma-separated list of Kafka topics to consume. This should match the topic(s) you created in [Setup Kafka Environment](#setup-kafka-environment). |\n| **Topic To Table Map** | Leave empty | Optional mapping to customize table names. If empty, table names will match topic names exactly but converted to uppercase with double quotes (e.g., topic `application-logs` → table `\"APPLICATION-LOGS\"`). |\n\n**Inherited Parameters** (visible when \"Show inherited parameters\" is checked):\n\n![Kafka Ingestion Parameters with All Inherited Properties](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_ingestion_params_all.png)\n\nFrom **Kafka Source Parameters**:\n\n- Kafka Bootstrap Servers\n- Kafka SASL Mechanism (`PLAIN`)\n- Kafka SASL Username (API Key)\n- Kafka SASL Password (API Secret)\n- Kafka Security Protocol (`SASL_SSL`)\n\nFrom **Kafka Destination Parameters**:\n\n- Destination Database\n- Destination Schema\n- Snowflake Role\n- Snowflake Authentication Strategy\n\nYour completed configuration should look like this:\n\n![Set Kafka Ingestion Parameters](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_set_ingestion_params.png)\n\n\u003E **Configuration Notes**:\n\u003E\n\u003E - **Auto Offset Reset**: Use `latest` for real-time streaming (only new messages), or `earliest` to replay all existing messages in the topic.\n\u003E - **Consumer Group**: The group ID allows Kafka to track which messages have been consumed. If you restart the connector, it will resume from where it left off.\n\u003E - **Table Naming**: By default, Openflow creates tables matching your topic names exactly but converted to uppercase with double quotes following Snowflake standards (e.g., topic `application-logs` → table `\"APPLICATION-LOGS\"`).\n\nClick **Apply** to save your Kafka ingestion parameters configuration.\n\n### Navigate Back to Process Group\n\nAfter configuring all three parameter contexts, navigate back to the main Process Group canvas to start the connector. Click the **Navigate Up to Process Group** button in the breadcrumb navigation at the bottom left of the canvas.\n\n![Navigate Back to Process Group](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_navigate_back_to_pg.png)\n\nThis returns you to the main canvas where you'll see the **Kafka JSON SASL SCHEMAEV** connector ready to be started.\n\n\u003C!-- ------------------------ --\u003E\n## Start the Connector\n\nWith all three parameter contexts configured, you're now ready to start the Kafka connector and begin streaming data from Kafka to Snowflake.\n\n### Start Process Group\n\nTo start the Kafka connector:\n\n1. **Right-click on the canvas** (on an empty area)\n2. Select **Start** to start all process groups\n3. The connector will begin consuming messages from your Kafka topic\n4. Watch the flow metrics update as data flows from Kafka to Snowflake\n\n![Kafka Connector Running and Streaming Data](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_connector_running.gif)\n\n\u003E **Note**: You may see an error message about \"Snowflake Private Key Service\" failing to enable. This error can be safely ignored since this quickstart uses `SNOWFLAKE_SESSION_TOKEN` authentication instead of private key authentication. The connector will function normally with session token authentication.\n\n\u003E **What's Happening?** The connector:\n\u003E\n\u003E 1. **Connects to Kafka**: Establishes a connection to your Kafka brokers using the configured credentials\n\u003E 2. **Subscribes to Topics**: Begins consuming messages from the `application-logs` topic\n\u003E 3. **Streams to Snowflake**: Writes records to Snowflake in near real-time using Snowpipe Streaming\n\u003E 4. **Tracks Offsets**: Maintains consumer group offsets so it can resume from where it left off if restarted\n\nOnce the connector is running, you should see:\n\n- **Active processors** (green indicators)\n- **Messages flowing** through the connections\n- **Metrics updating** (messages consumed, bytes transferred, etc.)\n\nYour Kafka connector is now configured and running!\n\n\u003C!-- ------------------------ --\u003E\n## Schema Evolution\n\nIn this section, you'll witness the power of **automatic schema evolution** by:\n\n1. **Phase 1**: Produce base log messages and verify initial schema\n2. **Phase 2**: Produce evolved log messages with new fields and watch new columns appear automatically!\n\nThis demonstrates a key advantage of the Openflow Kafka connector—your schema evolves automatically as your application adds new fields.\n\n### Understanding Automatic Schema Detection\n\nThe Openflow Kafka JSON/AVRO connector uses [automatic schema detection](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/kafka-json-avro#schema-detection-and-evolution):\n\n- **Tables are auto-created** from Kafka topic names\n- **Message fields become table columns** - Each JSON field becomes an individual column  \n- **Data types are inferred** automatically from your data\n- **Schema evolves automatically** - New fields in messages add new columns transparently\n- **No manual DDL required** - The connector handles all schema changes\n\n\u003E **Key Benefit**: As your application evolves and adds new fields to log messages, corresponding columns are added automatically—no pipeline reconfiguration or manual ALTER TABLE statements needed!\n\n---\n\n## Generate Base Logs\n\nLet's start by producing logs with the base schema and examining the auto-created table structure.\n\n### Install Dependencies (If Not Already Done)\n\n```bash\n# Install kafka-python library (skip if already installed)\npip install kafka-python python-dotenv\n\n# Or if you prefer conda\nconda install -c conda-forge kafka-python python-dotenv\n```\n\n### Produce Base Schema Logs\n\n#### Using Python Generator (Recommended)\n\nGenerate 50 log events with the **base schema** (core fields only):\n\n```bash\n# Produce base logs (WITHOUT evolved fields)\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 50\n```\n\nYou should see output like:\n\n```\nConnecting to Kafka brokers: pkc-xxxxx.aws.confluent.cloud:9092\n✓ Connected to Kafka\nProducing 50 log events (base schema) to topic 'application-logs'...\n  Sent 10/50 events (partition: 0, offset: 125)\n  Sent 20/50 events (partition: 1, offset: 89)\n  ...\n✓ Successfully produced 50 log events (base schema)\n```\n\n\u003E **About Record Counts**: Both methods (Python generator and sample file) produce exactly **50 base schema records** for consistency.\n\u003E\n\u003E - If you ran `--test-connection` earlier, you'll have 51 total records\n\u003E - Multiple runs will accumulate records (not replace them)\n\u003E - All records include the same 11 base schema fields (some with NULL values where not applicable)\n\n#### Using rpk with Sample File\n\nAlternatively, you can use the provided sample file with rpk (contains 50 base schema records):\n\n```bash\nrpk topic produce application-logs -f '%v{json}\\n' \u003C $QUICK_START_REPO/sample-data/sample_logs.json\n```\n\n##### Generate Custom Sample Files\n\nYou can also create custom JSONL sample files without connecting to Kafka:\n\n```bash\n# Generate custom base schema file\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 100 --output my_logs.json\n\n# Generate custom evolved schema file\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 50 --evolved --output my_evolved_logs.json\n```\n\nThis is useful for testing, creating custom datasets, or regenerating the sample files with updated logic.\n\n### Verify Table Creation\n\nOpen Snowsight and verify the table was auto-created:\n\n```sql\n-- Set context\nUSE ROLE QUICKSTART_ROLE;\nUSE DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\nUSE SCHEMA PUBLIC;\nUSE WAREHOUSE QUICKSTART_KAFKA_CONNECTOR_WH;\n\n-- Check that table was created\nSHOW TABLES LIKE 'APPLICATION-LOGS';\n\n-- Count records\nSELECT COUNT(*) as TOTAL_RECORDS FROM \"APPLICATION-LOGS\";\n-- Expected: ~50 records (or 51 if you ran --test-connection earlier)\n```\n\n### 📸 Capture Initial Schema (Important!)\n\nThis is crucial for seeing the \"WOW moment\" in Phase 2. Run this query and **note the columns**:\n\n```sql\n-- Show initial schema columns with data types (sorted alphabetically)\nSELECT \n  COLUMN_NAME, \n  DATA_TYPE\nFROM QUICKSTART_KAFKA_CONNECTOR_DB.INFORMATION_SCHEMA.COLUMNS \nWHERE TABLE_NAME ILIKE 'APPLICATION-LOGS'\nORDER BY COLUMN_NAME;\n```\n\n**Expected Base Columns** (sorted alphabetically):\n\n```\nAMOUNT          NUMBER\nDURATION_MS     NUMBER\nERROR           TEXT\nHOST            TEXT\nLEVEL           TEXT\nMESSAGE         TEXT\nREQUEST_ID      TEXT\nSERVICE         TEXT\nSTATUS_CODE     NUMBER\nTIMESTAMP       TEXT\nUSER_ID         TEXT\n```\n\nThat's **11 base columns** in Phase 1.\n\n\u003E **Remember These 11 Columns**: We'll run this query again in Phase 2 and see many NEW columns appear automatically!\n\u003E\n\u003E **Note**: Some columns like `AMOUNT`, `USER_ID`, and `ERROR` may contain NULL values for records where those fields don't apply. For example, only payment-related logs will have `AMOUNT` values, and only ERROR-level logs will have the `ERROR` field populated.\n\n### Query Base Schema Data\n\nExplore the data using direct column access (no JSON parsing needed!):\n\n```sql\n-- View sample records\nSELECT \n  TIMESTAMP,\n  LEVEL,\n  SERVICE,\n  MESSAGE,\n  STATUS_CODE,\n  DURATION_MS\nFROM \"APPLICATION-LOGS\"\nORDER BY TIMESTAMP DESC\nLIMIT 10;\n\n-- Log level distribution\nSELECT \n  LEVEL,\n  COUNT(*) as LOG_COUNT\nFROM \"APPLICATION-LOGS\"\nGROUP BY LEVEL\nORDER BY LOG_COUNT DESC;\n\n-- Error analysis (ERROR field only appears in ERROR logs)\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  ERROR,\n  STATUS_CODE\nFROM \"APPLICATION-LOGS\"\nWHERE ERROR IS NOT NULL\nORDER BY TIMESTAMP DESC\nLIMIT 10;\n\n-- Service health summary\nSELECT \n  SERVICE,\n  COUNT(*) as TOTAL_LOGS,\n  SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) as ERROR_COUNT,\n  SUM(CASE WHEN LEVEL = 'WARN' THEN 1 ELSE 0 END) as WARN_COUNT,\n  ROUND(AVG(DURATION_MS), 2) as AVG_DURATION_MS\nFROM \"APPLICATION-LOGS\"\nGROUP BY SERVICE\nORDER BY ERROR_COUNT DESC;\n```\n\n\u003E **Full Verification Script**: Run `sql/2a.verify_base_schema.sql` for comprehensive Phase 1 verification queries including performance analysis, error summaries, and payment transactions.\n\n---\n\n## Generate Evolved Logs\n\nNow for the **WOW moment**! Let's produce logs with evolved fields and watch new columns appear automatically.\n\n### Produce Evolved Schema Logs\n\n#### Using Python Generator with --evolved Flag (Recommended)\n\nGenerate logs with **additional fields** (region, auth_method, currency, etc.):\n\n```bash\npython $QUICK_START_REPO/sample-data/generate_logs.py --count 80 --evolved\n```\n\nYou should see:\n\n```\nProducing 80 log events (evolved schema) to topic 'application-logs'...\n  Sent 10/80 events (partition: 0, offset: 175)\n  Sent 20/80 events (partition: 1, offset: 89)\n  ...\n  Sent 80/80 events (partition: 2, offset: 201)\n✓ Successfully produced 80 log events (evolved schema)\n```\n\n#### Using rpk with Evolved Sample File\n\nAlternatively, use the pre-generated evolved sample file with rpk (contains 80 evolved schema records):\n\n```bash\nrpk topic produce application-logs -f '%v{json}\\n' \u003C $QUICK_START_REPO/sample-data/sample_logs_evolved.json\n```\n\n### 🎯 Compare Schemas - NEW Columns Appeared\n\nRun the same INFORMATION_SCHEMA query again and compare with Phase 1:\n\n```sql\n-- Show columns NOW - compare with Phase 1!\nSELECT \n  COLUMN_NAME, \n  DATA_TYPE\nFROM QUICKSTART_KAFKA_CONNECTOR_DB.INFORMATION_SCHEMA.COLUMNS \nWHERE TABLE_NAME ILIKE 'APPLICATION-LOGS'\nORDER BY COLUMN_NAME;\n```\n\n**🆕 NEW Columns That Appeared** (sorted alphabetically):\n\n```\nAUTH_METHOD           TEXT\nAVAILABLE_GB          NUMBER\nAVAILABLE_MB          NUMBER\nCONTENT_TYPE          TEXT\nCURRENCY              TEXT\nDISK_USAGE_PERCENT    NUMBER\nFILE_SIZE_BYTES       NUMBER\nMEMORY_PERCENT        NUMBER\nMETRICS_COUNT         NUMBER\nPAYMENT_METHOD        TEXT\nPRODUCT_ID            TEXT\nPROVIDER              TEXT\nQUERY_PARAMS          VARIANT\nRATING                NUMBER\nRECIPIENT             TEXT\nREGION                TEXT\nRESULT_COUNT          NUMBER\nRETRY_COUNT           NUMBER\nSESSION_DURATION      NUMBER\nSMTP_CODE             NUMBER\nSTATUS                TEXT\nTEST                  BOOLEAN\nTIME_WINDOW           TEXT\nTRACE_ID              TEXT\nVALIDATION_ERRORS     VARIANT\nVERSION               TEXT\n```\n\n**That's 26 new columns automatically added!** (from 11 → 37 total columns)\n\n\u003E **🎉 WOW!** These columns were added **automatically** without any DDL changes, pipeline reconfiguration, or downtime! This is automatic schema evolution in action!\n\n### Query Evolved Schema Fields\n\nLet's explore the new fields:\n\n**1. Records with REGION field**:\n\n```sql\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  REGION,\n  TRACE_ID\nFROM \"APPLICATION-LOGS\"\nWHERE REGION IS NOT NULL\nORDER BY TIMESTAMP DESC\nLIMIT 10;\n```\n\n**2. Auth logs with new authentication fields**:\n\n```sql\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  USER_ID,\n  AUTH_METHOD,\n  PROVIDER,\n  REGION\nFROM \"APPLICATION-LOGS\"\nWHERE AUTH_METHOD IS NOT NULL\nORDER BY TIMESTAMP DESC;\n```\n\n**3. Payment logs with currency information**:\n\n```sql\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  AMOUNT,\n  CURRENCY,\n  PAYMENT_METHOD,\n  USER_ID,\n  REGION\nFROM \"APPLICATION-LOGS\"\nWHERE CURRENCY IS NOT NULL\nORDER BY TIMESTAMP DESC;\n```\n\n**4. File uploads with metadata**:\n\n```sql\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  FILE_SIZE_BYTES,\n  CONTENT_TYPE,\n  REGION\nFROM \"APPLICATION-LOGS\"\nWHERE FILE_SIZE_BYTES IS NOT NULL\nORDER BY TIMESTAMP DESC;\n```\n\n**5. System metrics** (appears in WARN logs with memory/disk issues):\n\n```sql\nSELECT \n  TIMESTAMP,\n  SERVICE,\n  MESSAGE,\n  MEMORY_PERCENT,\n  AVAILABLE_MB,\n  DISK_USAGE_PERCENT,\n  AVAILABLE_GB,\n  REGION\nFROM \"APPLICATION-LOGS\"\nWHERE MEMORY_PERCENT IS NOT NULL \n   OR DISK_USAGE_PERCENT IS NOT NULL\nORDER BY TIMESTAMP DESC;\n```\n\n\u003E **Note**: System metrics only appear in WARN level logs with messages like \"Memory usage above 80%\" or \"Disk space running low\". If this query returns no results, produce more evolved logs to generate system metrics:\n\u003E\n\u003E ```bash\n\u003E # Produce additional evolved logs\n\u003E python $QUICK_START_REPO/sample-data/generate_logs.py --count 100 --evolved\n\u003E ```\n\n\u003E **Full Schema Evolution Queries**: Run `sql/2b.verify_schema_evolution.sql` for comprehensive queries exploring all evolved fields including API parameters, error retries, email delivery, analytics metrics, and more!\n\n### Understanding What Just Happened\n\n**Key Takeaways**:\n\n✅ **Automatic Column Addition** - New fields in JSON → New columns in table (no manual intervention)  \n✅ **Zero Downtime** - Schema evolved while pipeline continued running  \n✅ **Backward Compatible** - Old records have NULL for new columns  \n✅ **No Pipeline Changes** - Same connector configuration handles both schemas  \n✅ **Type Inference** - New columns got appropriate data types automatically  \n\n\u003E **Real-World Benefits**: This schema evolution capability is ideal for:\n\u003E\n\u003E - Microservices with evolving log formats\n\u003E - A/B testing with different instrumentation\n\u003E - Gradual feature rollouts\n\u003E - Multi-tenant systems with varying schemas\n\u003E - DevOps teams that don't want to manage schema migrations\n\n### Troubleshooting\n\nIf you don't see data in Snowflake after producing logs:\n\n1. **Check Kafka Topic** - Verify messages exist:\n\n   ```bash\n   rpk topic consume application-logs --num 5\n   ```\n\n2. **Check Openflow Canvas** - Ensure all processors are running (green status)\n\n3. **Check Offset Reset** - If using `latest`, only new messages after connector start are consumed\n\n\u003E **Tip**: See the [Monitoring the Pipeline](#monitoring-the-pipeline) chapter for detailed monitoring guidance.\n\n\u003C!-- ------------------------ --\u003E\n## Log Analytics\n\nNow that logs are streaming into Snowflake, let's perform powerful analytics that would be difficult or expensive in traditional log platforms.\n\n### Basic Log Analytics\n\nRun the analytics queries from `sql/3.analytics_queries.sql`:\n\n#### Count by Log Level\n\n```sql\n-- Distribution of log levels\nSELECT \n  LEVEL as LOG_LEVEL,\n  COUNT(*) as EVENT_COUNT,\n  ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as PERCENTAGE\nFROM \"APPLICATION-LOGS\"\nGROUP BY LOG_LEVEL\nORDER BY EVENT_COUNT DESC;\n```\n\n**Example Output** (actual counts will vary based on the logs you've generated):\n\n```\nLOG_LEVEL | EVENT_COUNT | PERCENTAGE\n----------|-------------|------------\nINFO      | 350         | 70.00\nWARN      | 100         | 20.00\nERROR     | 50          | 10.00\n```\n\n\u003E **Note**: The actual counts and percentages will vary depending on how many log events you've produced and the random distribution of log levels generated by the script.\n\n#### Top Error Messages\n\n```sql\n-- Most common error messages\nSELECT \n  MESSAGE as ERROR_MESSAGE,\n  SERVICE,\n  COUNT(*) as ERROR_COUNT\nFROM \"APPLICATION-LOGS\"\nWHERE LEVEL = 'ERROR'\nGROUP BY ERROR_MESSAGE, SERVICE\nORDER BY ERROR_COUNT DESC\nLIMIT 10;\n```\n\nThis helps identify the most frequent errors to prioritize fixing.\n\n#### Service Health Overview\n\n```sql\n-- Event count and error rate by service\nSELECT \n  SERVICE as SERVICE_NAME,\n  COUNT(*) as TOTAL_EVENTS,\n  SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) as ERROR_COUNT,\n  SUM(CASE WHEN LEVEL = 'WARN' THEN 1 ELSE 0 END) as WARN_COUNT,\n  ROUND(ERROR_COUNT * 100.0 / NULLIF(TOTAL_EVENTS, 0), 2) as ERROR_RATE_PCT\nFROM \"APPLICATION-LOGS\"\nGROUP BY SERVICE_NAME\nORDER BY ERROR_RATE_PCT DESC;\n```\n\nQuickly identify which services have the highest error rates.\n\n### Time-Series Analysis\n\n#### Events Per Minute\n\n```sql\n-- Event volume over time (per minute)\nSELECT \n  DATE_TRUNC('minute', TO_TIMESTAMP(TIMESTAMP)) as TIME_BUCKET,\n  COUNT(*) as EVENTS_PER_MINUTE,\n  SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) as ERRORS_PER_MINUTE\nFROM \"APPLICATION-LOGS\"\nWHERE TO_TIMESTAMP(TIMESTAMP) \u003E= DATEADD('hour', -1, CURRENT_TIMESTAMP())\nGROUP BY TIME_BUCKET\nORDER BY TIME_BUCKET DESC;\n```\n\nVisualize event volume trends and error spikes over time.\n\n#### Peak Traffic Hours\n\n```sql\n-- Hourly event distribution\nSELECT \n  HOUR(TO_TIMESTAMP(TIMESTAMP)) as HOUR_OF_DAY,\n  COUNT(*) as EVENT_COUNT,\n  AVG(DURATION_MS) as AVG_DURATION_MS\nFROM \"APPLICATION-LOGS\"\nWHERE TO_TIMESTAMP(TIMESTAMP) \u003E= DATEADD('day', -1, CURRENT_TIMESTAMP())\n  AND DURATION_MS IS NOT NULL\nGROUP BY HOUR_OF_DAY\nORDER BY HOUR_OF_DAY;\n```\n\nIdentify peak usage hours for capacity planning.\n\n\u003E **Note**: The `TIMESTAMP` column is stored as TEXT. We use `TO_TIMESTAMP()` to convert it to TIMESTAMP type for time-based analysis. If your quickstart was just completed, you may see limited data in the last hour/day time windows.\n\n### Performance Analytics\n\n#### Slowest Requests\n\n```sql\n-- Slowest requests\nSELECT\n  SERVICE,\n  REQUEST_ID,\n  DURATION_MS,\n  MESSAGE,\n  TIMESTAMP AS REQUEST_TIME,\n  LEVEL,\n  STATUS_CODE\nFROM\n  QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.\"APPLICATION-LOGS\"\nWHERE\n  NOT DURATION_MS IS NULL\n  AND DURATION_MS \u003E 0\nORDER BY\n  DURATION_MS DESC\nLIMIT 20;\n```\n\n#### Performance by Service\n\n```sql\n-- Average performance metrics by service\nSELECT\n  SERVICE,\n  COUNT(*) as TOTAL_REQUESTS,\n  ROUND(AVG(DURATION_MS), 2) as AVG_DURATION_MS,\n  MIN(DURATION_MS) as MIN_DURATION_MS,\n  MAX(DURATION_MS) as MAX_DURATION_MS,\n  SUM(\n    CASE\n      WHEN STATUS_CODE \u003E= 400 THEN 1\n      ELSE 0\n    END\n  ) as ERROR_COUNT,\n  ROUND(\n    AVG(\n      CASE\n        WHEN STATUS_CODE \u003E= 400 THEN 1\n        ELSE 0\n      END\n    ) * 100,\n    2\n  ) as ERROR_RATE_PCT\nFROM\n  QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.\"APPLICATION-LOGS\"\nWHERE\n  DURATION_MS IS NOT NULL\n  AND DURATION_MS \u003E 0\nGROUP BY\n  SERVICE\nORDER BY\n  AVG_DURATION_MS DESC;\n```\n\nCalculate average, min, and max latency along with error rates by service—essential SRE metrics!\n\n### Advanced Analytics\n\n#### Error Correlation\n\n```sql\n-- Find correlated errors (errors occurring together)\nWITH ERROR_WINDOWS AS (\n  SELECT\n    SERVICE,\n    CAST(TIMESTAMP AS TIMESTAMP) AS ERROR_TIME,\n    REQUEST_ID,\n    STATUS_CODE,\n    DURATION_MS,\n    DATE_TRUNC ('MINUTE', CAST(TIMESTAMP AS TIMESTAMP)) AS TIME_WINDOW\n    /* Create 5-minute time windows */\n  FROM\n    QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.\"APPLICATION-LOGS\"\n  WHERE\n    LEVEL ILIKE '%ERROR%'\n),\nSERVICE_PAIRS AS (\n  SELECT\n    a.SERVICE AS SERVICE_A,\n    b.SERVICE AS SERVICE_B,\n    a.TIME_WINDOW,\n    COUNT(DISTINCT a.REQUEST_ID) AS ERRORS_SERVICE_A,\n    COUNT(DISTINCT b.REQUEST_ID) AS ERRORS_SERVICE_B,\n    AVG(a.DURATION_MS) AS AVG_DURATION_A,\n    AVG(b.DURATION_MS) AS AVG_DURATION_B\n  FROM\n    ERROR_WINDOWS AS a\n    JOIN ERROR_WINDOWS AS b ON a.TIME_WINDOW = b.TIME_WINDOW\n    AND a.SERVICE \u003C b.SERVICE\n    /* Avoid duplicate pairs */\n  GROUP BY\n    a.SERVICE,\n    b.SERVICE,\n    a.TIME_WINDOW\n  HAVING\n    ERRORS_SERVICE_A \u003E 0\n    AND ERRORS_SERVICE_B \u003E 0\n)\nSELECT\n  SERVICE_A,\n  SERVICE_B,\n  COUNT(*) AS CONCURRENT_ERROR_WINDOWS,\n  SUM(ERRORS_SERVICE_A) AS TOTAL_ERRORS_A,\n  SUM(ERRORS_SERVICE_B) AS TOTAL_ERRORS_B,\n  ROUND(AVG(AVG_DURATION_A), 2) AS AVG_DURATION_A,\n  ROUND(AVG(AVG_DURATION_B), 2) AS AVG_DURATION_B\nFROM\n  SERVICE_PAIRS\nGROUP BY\n  SERVICE_A,\n  SERVICE_B\nHAVING\n  CONCURRENT_ERROR_WINDOWS \u003E 1\nORDER BY\n  CONCURRENT_ERROR_WINDOWS DESC,\n  TOTAL_ERRORS_A + TOTAL_ERRORS_B DESC;\n```\n\nDiscover when errors in one service correlate with errors in another—great for finding cascading failures!\n\n\u003E **Why This Matters**: Traditional log platforms charge premium prices for long retention and complex queries. With Snowflake, you can keep years of logs at low storage costs and run sophisticated SQL analytics without specialized query languages or expensive log indexing.\n\n\u003C!-- ------------------------ --\u003E\n## Semantic Search\n\nEnable natural language search over your log messages using Snowflake Cortex Search. This allows you to query logs using plain English through Snowflake CoWork or programmatically.\n\nAll queries in this section are available in `sql/4.cortex_search.sql`.\n\n### Create Cortex Search Service\n\nCreate a search service on your log messages with critical attributes as filters:\n\n```sql\nUSE ROLE QUICKSTART_ROLE;\nUSE DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\nUSE SCHEMA PUBLIC;\n\n-- Create Cortex Search service on log messages\n-- Includes both base and evolved schema attributes for comprehensive filtering\nCREATE OR REPLACE CORTEX SEARCH SERVICE application_logs_search\n  ON MESSAGE\n  ATTRIBUTES LEVEL, SERVICE, ERROR, STATUS_CODE, DURATION_MS, MEMORY_PERCENT, DISK_USAGE_PERCENT, REGION\n  WAREHOUSE = QUICKSTART_KAFKA_CONNECTOR_WH\n  TARGET_LAG = '1 minute'\n  AS (\n    SELECT \n      MESSAGE,\n      LEVEL,\n      SERVICE,\n      ERROR,\n      STATUS_CODE,\n      DURATION_MS::NUMBER as DURATION_MS,\n      TIMESTAMP,\n      REQUEST_ID,\n      HOST,\n      USER_ID,\n      MEMORY_PERCENT::NUMBER as MEMORY_PERCENT,\n      AVAILABLE_MB::NUMBER as AVAILABLE_MB,\n      DISK_USAGE_PERCENT::NUMBER as DISK_USAGE_PERCENT,\n      AVAILABLE_GB::NUMBER as AVAILABLE_GB,\n      REGION\n    FROM \"APPLICATION-LOGS\"\n  );\n```\n\n\u003E **What This Does**:\n\u003E\n\u003E - **ON MESSAGE**: Indexes the MESSAGE field for semantic search\n\u003E - **ATTRIBUTES**: LEVEL, SERVICE, ERROR, STATUS_CODE, DURATION_MS, MEMORY_PERCENT, DISK_USAGE_PERCENT, REGION become filterable dimensions\n\u003E - **TARGET_LAG**: Search index updates within 1 minute of new data\n\u003E - **Semantic Understanding**: Understands concepts, not just exact text matches\n\u003E - **Evolved Schema Support**: Includes both base and evolved schema columns for comprehensive filtering\n\u003E - **Type Casting**: Numeric columns (DURATION_MS, MEMORY_PERCENT, AVAILABLE_MB, DISK_USAGE_PERCENT, AVAILABLE_GB) are cast to NUMBER for proper filter operations\n\u003E - **Performance Filtering**: DURATION_MS is indexed as an attribute, enabling fast filtering for performance-related searches (e.g., slow requests, timeout issues)\n\n### Query Using Snowflake CoWork\n\nOnce the search service is created, you can use **Snowflake CoWork** for natural language queries:\n\n**Example questions you can ask**:\n\n- \"Show me all payment errors from the last hour\"\n- \"Find authentication failures\"\n- \"What database timeouts occurred?\"\n- \"Show warnings from the inventory service\"\n\nSnowflake CoWork will automatically use your Cortex Search service to find relevant logs!\n\n### Query Programmatically\n\nYou can also query the search service using SQL with the [`SNOWFLAKE.CORTEX.SEARCH_PREVIEW` function](https://docs.snowflake.com/en/sql-reference/functions/search_preview-snowflake-cortex):\n\n\u003E **Note**: `SEARCH_PREVIEW` is designed for testing and validation. For production applications requiring low latency, use the Python API or the service's native REST endpoint.\n\n```sql\n-- Semantic search for authentication errors\n-- Returns MESSAGE, LEVEL, SERVICE, TIMESTAMP, and ERROR columns\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      \"query\": \"authentication failed\",\n      \"columns\": [\"MESSAGE\", \"LEVEL\", \"SERVICE\", \"TIMESTAMP\", \"ERROR\"],\n      \"filter\": {\"@eq\": {\"LEVEL\": \"ERROR\"}},\n      \"limit\": 10\n    }'\n  ) AS search_results;\n\n-- Search for payment issues with base schema columns\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      \"query\": \"payment declined timeout\",\n      \"columns\": [\"MESSAGE\", \"SERVICE\", \"STATUS_CODE\", \"TIMESTAMP\", \"REQUEST_ID\"],\n      \"filter\": {\"@eq\": {\"SERVICE\": \"payment-service\"}},\n      \"limit\": 10\n    }'\n  ) AS search_results;\n\n-- Find database connection problems\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      \"query\": \"database connection timeout\",\n      \"columns\": [\"MESSAGE\", \"LEVEL\", \"SERVICE\", \"HOST\", \"TIMESTAMP\"],\n      \"filter\": {\"@eq\": {\"LEVEL\": \"ERROR\"}},\n      \"limit\": 10\n    }'\n  ) AS search_results;\n```\n\n### Search with Multiple Filters\n\nCombine semantic search with multiple attribute filters to narrow down results:\n\n```sql\n-- Find errors in payment OR auth services\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      \"query\": \"failed transaction\",\n      \"columns\": [\"MESSAGE\", \"LEVEL\", \"SERVICE\", \"ERROR\", \"STATUS_CODE\", \"TIMESTAMP\"],\n      \"filter\": {\n        \"@and\": [\n          {\"@eq\": {\"LEVEL\": \"ERROR\"}},\n          {\"@or\": [\n            {\"@eq\": {\"SERVICE\": \"payment-service\"}},\n            {\"@eq\": {\"SERVICE\": \"auth-service\"}}\n          ]}\n        ]\n      },\n      \"limit\": 20\n    }'\n  ) AS search_results;\n\n-- Search for system warnings with high memory usage (evolved schema)\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      \"query\": \"memory usage warning system resource\",\n      \"columns\": [\"MESSAGE\", \"LEVEL\", \"SERVICE\", \"MEMORY_PERCENT\", \"AVAILABLE_MB\", \"REGION\", \"TIMESTAMP\"],\n      \"filter\": {\n        \"@and\": [\n          {\"@eq\": {\"LEVEL\": \"WARN\"}},\n          {\"@gte\": {\"MEMORY_PERCENT\": 80}}\n        ]\n      },\n      \"limit\": 15\n    }'\n  ) AS search_results;\n\n-- Search for slow requests with performance issues\nSELECT\n  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(\n    'QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search',\n    '{\n      \"query\": \"slow request timeout performance\",\n      \"columns\": [\"MESSAGE\", \"SERVICE\", \"DURATION_MS\", \"STATUS_CODE\", \"TIMESTAMP\", \"REQUEST_ID\"],\n      \"filter\": {\n        \"@gte\": {\"DURATION_MS\": 1000}\n      },\n      \"limit\": 20\n    }'\n  ) AS search_results;\n```\n\n\u003E **Benefits of Cortex Search**:\n\u003E\n\u003E - **Natural Language**: Query logs in plain English, not complex regex\n\u003E - **Semantic Understanding**: Finds conceptually similar messages, not just keyword matches\n\u003E - **Fast**: Optimized vector search returns results in milliseconds\n\u003E - **Always Fresh**: Automatically indexes new logs as they arrive\n\u003E - **Snowflake CoWork Integration**: Works seamlessly for conversational queries\n\n\u003C!-- ------------------------ --\u003E\n## Monitoring the Pipeline\n\nLet's monitor the health and performance of your streaming pipeline.\n\n### Monitor Real-Time in Openflow Canvas\n\nThe Openflow Canvas provides real-time monitoring of your streaming pipeline. While data flows, observe the streaming statistics on the canvas:\n\n![Openflow Canvas Statistics](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_stats_reset.png)\n\nThe canvas displays real-time metrics for the connector process group:\n\n- **In**: Number of running processors (e.g., 11 active components)\n- **Queued**: FlowFiles waiting to be processed (0 shown = no backlog, which is healthy)\n- **In**: FlowFiles entering the process group with data volume\n- **Read/Write**: Data throughput rates (bytes read from Kafka / bytes written to Snowflake)\n- **Out**: FlowFiles leaving the process group\n- **Timing**: All metrics show data for the last \"5 min\" window\n\n\u003E **Statistics Reset**: The statistics displayed on the canvas reset every **5 minutes**. If you see zeros, it means no data has flowed in the current 5-minute window. This is normal between data generation runs or during idle periods.\n\n#### Drill Down for Detailed Statistics\n\nYou can click on individual processors or connections to see detailed statistics and data flow:\n\n![Openflow Drill-Down Statistics](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_stats_drill_down.gif)\n\n**What to Monitor**:\n\n1. **Process Group Statistics** (on the canvas):\n   - Running processors count\n   - Queue sizes (should be low)\n   - Data throughput rates\n\n2. **Individual Processor Stats** (right-click → View Status History):\n   - **ConsumeKafka**: Bytes Read, FlowFiles Out, Processing Time\n   - **PutSnowflake**: FlowFiles In, Bytes Written, Success Rate\n\n3. **Connection Queues** (click on arrows between processors):\n   - FlowFiles Queued (should be minimal)\n   - Queue Size (indicates backpressure if large)\n\n\u003E **Healthy Pipeline Indicators**:\n\u003E\n\u003E - Minimal queue buildup (\u003C 100 FlowFiles queued)\n\u003E - Steady data throughput matching your production rate\n\u003E - All processors in running state (green)\n\u003E - No errors in processor logs\n\u003E\n\u003E If you see large queues (\u003E 1000), consider scaling up your runtime or adjusting processor concurrency settings.\n\n### Troubleshooting\n\nIf you encounter issues with your pipeline:\n\n**No Data Flowing**:\n\n1. Verify Kafka topic has messages: `rpk topic consume application-logs --num 5`\n2. Check processors are running (green status in Canvas)\n3. Verify network rules allow Kafka broker access\n4. Confirm authentication credentials are correct\n5. Check consumer group offset (may be at end of topic if using `latest`)\n\n### Set Up Alerts (Optional)\n\nFor production pipelines, create Snowflake alerts for automated monitoring:\n\n```sql\nUSE ROLE QUICKSTART_ROLE;\nUSE DATABASE QUICKSTART_KAFKA_CONNECTOR_DB;\n\n-- Alert if error rate exceeds threshold\nCREATE OR REPLACE ALERT PUBLIC.HIGH_ERROR_RATE_ALERT\n  WAREHOUSE = QUICKSTART_KAFKA_CONNECTOR_WH\n  SCHEDULE = '5 MINUTE'\n  IF (\n    SELECT \n      SUM(CASE WHEN LEVEL = 'ERROR' THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0)\n    FROM \"APPLICATION-LOGS\"\n    WHERE TO_TIMESTAMP(TIMESTAMP) \u003E= DATEADD('minute', -5, CURRENT_TIMESTAMP())\n  ) \u003E 15  -- Alert if \u003E 15% error rate\n  THEN CALL SYSTEM$SEND_EMAIL(\n    'DataOps Team',\n    'ops@example.com',\n    'Kafka Pipeline Alert: Error rate exceeds 15% in last 5 minutes'\n  );\n\n-- Alert on critical service errors\nCREATE OR REPLACE ALERT PUBLIC.CRITICAL_SERVICE_ALERT\n  WAREHOUSE = QUICKSTART_KAFKA_CONNECTOR_WH\n  SCHEDULE = '5 MINUTE'\n  IF (\n    SELECT COUNT(*)\n    FROM \"APPLICATION-LOGS\"\n    WHERE LEVEL = 'ERROR'\n      AND SERVICE IN ('payment-service', 'auth-service')\n      AND TO_TIMESTAMP(TIMESTAMP) \u003E= DATEADD('minute', -5, CURRENT_TIMESTAMP())\n  ) \u003E 10\n  THEN CALL SYSTEM$SEND_EMAIL(\n    'DataOps Team',\n    'ops@example.com',\n    'Kafka Pipeline Alert: Critical service experiencing multiple errors'\n  );\n```\n\n\u003E **Customize Alerts**: Adjust thresholds, services, and notification methods based on your operational needs. You can also integrate with [Snowflake notifications](https://docs.snowflake.com/en/user-guide/alerts) for Slack, PagerDuty, or webhook integrations.\n\n\u003C!-- ------------------------ --\u003E\n## Cleanup\n\nWhen you're done with the demo, you can clean up resources to avoid unnecessary costs.\n\n### Stop Openflow Connector\n\nStop and disable the Kafka connector in the Openflow Canvas:\n\n![Stop and Disable Kafka Connector](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-openflow-kafka-connector/openflow_qs_kafka_stop_disable.gif)\n\n**Steps**:\n\n1. Open the Openflow Canvas\n2. Right-click the connector process group\n3. Select **Stop** to stop data flow\n4. Right-click again and select **Disable** to prevent accidental restarts\n5. Optionally, delete the connector if you won't reuse it\n\n### Clean Up Snowflake Objects (Optional)\n\nIf you want to completely remove all demo objects, run the cleanup script from `sql/5.cleanup.sql`:\n\n```sql\n-- Use ACCOUNTADMIN to drop objects\nUSE ROLE ACCOUNTADMIN;\n\n-- Drop Cortex Search service (if created)\nDROP CORTEX SEARCH SERVICE IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.application_logs_search;\n\n-- Drop alerts (if created)\nDROP ALERT IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.HIGH_ERROR_RATE_ALERT;\nDROP ALERT IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB.PUBLIC.CRITICAL_SERVICE_ALERT;\n\n-- Drop database (this removes all tables and data)\nDROP DATABASE IF EXISTS QUICKSTART_KAFKA_CONNECTOR_DB;\n\n-- Drop warehouse\nDROP WAREHOUSE IF EXISTS QUICKSTART_KAFKA_CONNECTOR_WH;\n\n-- Drop external access integration\nDROP EXTERNAL ACCESS INTEGRATION IF EXISTS quickstart_kafka_connector_access;\n\n-- Note: We don't drop QUICKSTART_ROLE as it may be used by other quickstarts\n```\n\n\u003E **Warning**: This will permanently delete all log data and configuration. Make sure you've exported anything you need before dropping objects.\n\n### Clean Up Openflow Runtime (Optional)\n\nIf you won't be using Openflow for other connectors:\n\n1. Navigate to **Data \u003E Integrations \u003E Openflow**\n2. Click on your deployment\n3. Delete the runtime (click ⋮ menu → Delete Runtime)\n4. Optionally, delete the deployment\n\n\u003E **Keep Runtime for Other Connectors**: If you plan to use other Openflow connectors (PostgreSQL CDC, Google Drive, etc.), keep your runtime and deployment—they can be reused across multiple connectors!\n\n### Clean Up Kafka Resources (Optional)\n\nIf you created a Kafka topic specifically for this demo:\n\n```bash\n# Delete the topic using rpk\nrpk topic delete application-logs\n```\n\n\u003E **Managed Kafka Services**: For Confluent Cloud and other managed Kafka platforms, you can also delete topics through the service console or web UI.\n\n\u003C!-- ------------------------ --\u003E\n## Conclusion And Resources\n\nCongratulations! You've successfully built a real-time log streaming pipeline from Kafka to Snowflake using Openflow.\n\n### What You Learned\n\nIn this quickstart, you:\n\n- ✅ Configured a Kafka topic for log streaming\n- ✅ Set up Snowflake objects (database, tables, network rules)\n- ✅ Created an Openflow Snowflake Deployments runtime\n- ✅ Configured the Openflow Kafka Connector with automatic schema evolution\n- ✅ Streamed real-time logs from Kafka to Snowflake\n- ✅ Performed powerful SQL analytics on streaming log data\n- ✅ Enabled semantic search with Cortex Search for natural language queries\n- ✅ Monitored pipeline health and performance\n- ✅ Set up automated alerts for production monitoring\n\n### Key Takeaways\n\n**Real-Time Data**: With Snowpipe Streaming, logs appear in Snowflake within seconds of being produced to Kafka—enabling real-time monitoring and alerting.\n\n**Cost-Effective**: Snowflake's storage costs are significantly lower than dedicated log platforms for long-term retention. Keep years of logs for compliance and historical analysis.\n\n**Powerful Analytics**: SQL is more flexible and powerful than log query languages. Join logs with business data, apply machine learning, and create complex analytical queries.\n\n**Scalable**: The pipeline scales automatically with your data volume. Kafka handles millions of events, Snowflake handles petabytes of data.\n\n### Next Steps\n\n**1. Advanced Kafka Features**:\n\n- Try with **AVRO format** and **Confluent Schema Registry** for schema evolution\n- Configure **multiple topics** with topic-to-table mapping\n- Implement **SASL_SSL security** for production deployments\n- Tune for **high-throughput** using the [performance guide](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/performance-tuning)\n\n**2. Enhance Analytics & AI**:\n\n- Create **materialized views** for common queries\n- Build **Streamlit dashboards** for real-time monitoring  \n- Apply **Snowflake Cortex AI** for anomaly detection and log classification\n- Expand **Cortex Search** with additional attributes and custom relevance ranking\n- Use **Snowflake CoWork** for conversational log exploration\n\n**3. Try Other Openflow Connectors**:\n\n- [**PostgreSQL CDC**](https://quickstarts.snowflake.com/guide/getting_started_with_openflow_postgresql_cdc/): Replicate database changes in real-time\n- [**Google Drive**](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/gdrive/about): Ingest unstructured documents for AI analysis\n- [**Kinesis**](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kinesis/about): Stream data from AWS\n- [**MySQL CDC**](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/mysql/about): Replicate MySQL databases\n\n**4. Production Deployment**:\n\n- Set up alerting for pipeline failures\n- Implement data quality checks\n- Configure backup and failover\n- Document runbooks for operations\n\n### Resources\n\n**Openflow & Kafka**:\n\n- [Openflow Documentation](https://docs.snowflake.com/en/user-guide/data-integration/openflow/about)\n- [Kafka Connector Documentation](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/about)\n- [Kafka Connector Performance Tuning](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/kafka/performance-tuning)\n- [All Openflow Connectors](https://docs.snowflake.com/en/user-guide/data-integration/openflow/connectors/about-openflow-connectors)\n\n**Snowflake Features**:\n\n- [Snowpipe Streaming](https://docs.snowflake.com/en/user-guide/data-load-snowpipe-streaming-overview)\n- [Cortex Search](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-overview)\n- [Snowflake CoWork](https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-intelligence)\n- [Snowflake Alerts](https://docs.snowflake.com/en/user-guide/alerts)\n\n### Feedback\n\nWe'd love to hear your feedback! If you have questions or suggestions:\n\n- [Open an issue](https://github.com/Snowflake-Labs/sfquickstarts/issues) on GitHub\n- Share your experience on [Snowflake Community](https://community.snowflake.com/)\n\nThank you for completing this quickstart!\n","multiValue":false,":type":"text/x-markdown"},"quickstartArticleLogoImage":{"title":"Quickstart Article Logo Image","dataType":"string","multiValue":false,":type":"text/plain"}},"elementsOrder":["quickstartArticleBody","quickstartArticleLogoImage"],"model":"snowflake-site/models/quickstart-article"},"flexible_column_cont":{"id":"flexible-column-container-07e5f3ff40","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-3c191dc3eb",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-3a5363cfbd","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2025-12-20",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-fe48de1057","additionalClasses":"qs-disclaimer-text","text":"\u003Cp\u003E\u003Cspan style=\"color: #666;\"\u003EThis content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances\u003C/span\u003E\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"}},":itemsOrder":["quickstart_last_modi","text"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-41bc29a4b5",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{},":itemsOrder":[]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["contentfragment","flexible_column_cont"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-b3de1d2c16",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-40153c136f","isDeveloperGuidesPage":false,":type":"snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container",":items":{"quickstart_table_of_":{"id":"quickstart-table-of-content-748a6f12a0",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/getting-started-with-openflow-kafka-connector","headings":["\u003Ch2\u003EOverview\u003C/h2\u003E","\u003Ch2\u003EClone Repository\u003C/h2\u003E","\u003Ch2\u003EConfigure Kafka\u003C/h2\u003E","\u003Ch2\u003EConfigure Snowflake\u003C/h2\u003E","\u003Ch2\u003ESetup Openflow Runtime\u003C/h2\u003E","\u003Ch2\u003EAdd Kafka Connector\u003C/h2\u003E","\u003Ch2\u003EConfigure Kafka Connector\u003C/h2\u003E","\u003Ch2\u003EStart the Connector\u003C/h2\u003E","\u003Ch2\u003ESchema Evolution\u003C/h2\u003E","\u003Ch2\u003EGenerate Base Logs\u003C/h2\u003E","\u003Ch2\u003EGenerate Evolved Logs\u003C/h2\u003E","\u003Ch2\u003ELog Analytics\u003C/h2\u003E","\u003Ch2\u003ESemantic Search\u003C/h2\u003E","\u003Ch2\u003EMonitoring the Pipeline\u003C/h2\u003E","\u003Ch2\u003ECleanup\u003C/h2\u003E","\u003Ch2\u003EConclusion And Resources\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-53c6f9e9c4",":type":"snowflake-site/components/quickstart/quickstart-button","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/getting-started-with-openflow-kafka-connector","appliedCssClassNames":"snowflake-responsive-component-top-padding-none"}},":itemsOrder":["quickstart_table_of_","quickstart_button"]}},":itemsOrder":["quickstart_table_of_"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"},"markup_editor":{"id":"markup-editor-eddaf17343","title":"Page CSS","cssContent":"#quickstart-template-main-flexible-container{padding:24px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:1fr 0}.qs-disclaimer-text p \u003E span{font-size:15px !important}@media (min-width:768px){#quickstart-template-main-flexible-container{padding:24px 32px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:48px}}@media (max-width:767px){#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:0}}@media (min-width:1024px){#quickstart-template-main-flexible-container{padding:0 92px 48px 92px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:117px}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["quickstart_hero","flexible_column_cont","markup_editor"],":type":"wcm/foundation/components/responsivegrid"},"modal_container":{"layout":"SIMPLE","id":"container-15be7a9362",":type":"snowflake-site/components/modal/modal-container",":items":{},":itemsOrder":[]},"experiencefragment-footer":{"id":"experiencefragment-fb4f1e5fb8","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"additionalClasses":"sf-footer","layout":"SIMPLE","id":"container-bc5d2c9676",":type":"snowflake-site/components/container",":items":{"container_copy":{"additionalClasses":"sf-footer__inner","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-9725fee2bb",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-74bd8e2611","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"medium","bottomPadding":"extra-small","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"sf-footer-grid","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-a98fe4bb35",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-dd0fc76a7e",":type":"snowflake-site/components/container",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-07e18ec34b",":type":"snowflake-site/components/container",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-f3f23660b2",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-0c5e52e6d8","additionalClasses":"sf-footer__newsletter-title","text":"\u003Cp\u003E\u003Cb\u003ESubscribe to our monthly newsletter\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EStay up to date on Snowflake’s latest products, expert insights and resources—right in your inbox!\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-regular text-color-text-04"},"marketo_v2":{"id":"marketo-v2-1eb18bbea1","marketoForm":{"edit":false,"successUrl":null,"formId":"45871","hidden":null,"script":null,"values":null},"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com","marketoConfigured":true,"formConfigured":true,":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container":{"columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-fc784ef387",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-1ce67387da","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003EProduct\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/platform/\"\u003EPlatform\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/product/snowflake-cowork/\"\u003ESnowflake CoWork\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/data-engineering/\"\u003EData Engineering\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/analytics/\"\u003EAnalytics\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/ai/\"\u003EAI\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/applications-and-collaboration/\"\u003EApplications &amp; Collaboration\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/pricing-options/\"\u003EPricing\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"text_copy":{"id":"text-93246d690e","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ESupport\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/support/\"\u003ESupport\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/addenda/priority-support-services-description/\"\u003EPriority Support\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://status.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EStatus\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text","text_copy"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium"},"container_copy_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-9fc8a722d4",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-1a0c892f09","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E\u003Ca href=\"/en/solutions/industries/\"\u003EIndustries\u003C/a\u003E\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/advertising-media-entertainment/\"\u003EAdvertising, Media &amp; Entertainment\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/financial-services/\"\u003EFinancial Services\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/healthcare-and-life-sciences/\"\u003EHealthcare &amp; Life Sciences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/manufacturing/\"\u003EManufacturing\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/public-sector/\"\u003EPublic Sector\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/retail-consumer-goods/\"\u003ERetail &amp; Consumer Goods\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/telecom/\"\u003ETelecom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/solutions/industries/technology/\"\u003ETechnology\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-3c28da87e1",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-a67565a4dd","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ECompany\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/about-snowflake/\"\u003EAbout Snowflake\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/leadership-and-board/\"\u003ELeadership &amp; Board\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://careers.snowflake.com/us/en\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ECareers\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://investors.snowflake.com/overview/default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EInvestor Relations\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://trust.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ETrust Center\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/brand-guidelines/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EBrand Guidelines\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/contact/\"\u003EContact\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/news/\"\u003ENewsroom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/esg/\"\u003EEnvironmental, Social &amp; Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/snowflake-ventures/\"\u003ESnowflake Ventures\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/end-data-disparity/\"\u003EEnd Data Disparity\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/summit/\"\u003ESnowflake Summit 26\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy_copy_":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-85900129d5",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-b2f8a2e3d8","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ELearn\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/resources/\"\u003EResource Library\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/webinars/demo/\"\u003ELive Demos\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/fundamentals/\"\u003EFundamentals\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/training/\"\u003ETraining\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/certifications/\"\u003ECertifications\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://learn.snowflake.com/en/\"\u003ESnowflake University\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/developers/guides\"\u003EDeveloper Guides\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://docs.snowflake.com/\"\u003EDocumentation\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/data-governance/\"\u003EData Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"},"container_573483281_":{"additionalClasses":"sf-footer__bottom","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-04e55ef1ee",":type":"snowflake-site/components/container",":items":{"container_112062425":{"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-f21cc50ec2",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-2ca07d2897","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-36ea57832e",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer__legal-container","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-47920eef5f",":type":"snowflake-site/components/container",":items":{"container":{"columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"layout":"RESPONSIVE_GRID","id":"container-d74c60860b",":type":"snowflake-site/components/container",":items":{"image":{"id":"image-db9f9c469d","additionalClasses":"sf-footer__logo","alt":"Snowflake logo","imageLink":{"valid":true,"url":"/en/"},"lazyEnabled":true,"height":"64","width":"64","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/_jcr_content/root/container_573483281_/container_112062425/flexible_column_cont/flexible_column_content_container_1/container/container/image.coreimg.svg/1747882370694/nav-icon-snowflake-bug.svg",":type":"snowflake-site/components/image"}},":itemsOrder":["image"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"text_copy_copy_16360":{"id":"text-63232f64f4","additionalClasses":"sf-footer__legal-links","text":"\u003Cul\u003E\r\n\u003Cli\u003E© 2026 Snowflake Inc. All Rights Reserved\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/\"\u003EPrivacy Policy\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/legal/snowflake-site-terms/\"\u003ESite Terms\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://info.snowflake.com/Preference-center.html\"\u003ECommunication Preferences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Cbutton id=\"ot-sdk-btn\" class=\"ot-sdk-show-settings\"\u003ECookie Settings\u003C/button\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/#12\"\u003EDo Not Share My Personal Information\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/\"\u003ELegal\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"markup_editor":{"id":"markup-editor-7ecfd68569","title":" ","htmlContent":"\u003Cdiv class=\"sf-footer__social\"\u003E\r\n\u003Cdiv data-testid=\"snowflake-footer-twitter\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://x.com/Snowflake\" data-testid=\"button-external\" aria-label=\"X (Twitter)\" role=\"button\" class=\"snowflake-button-container\" title=\"X (Twitter)\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 59 53\" class=\"button-icon\"\u003E\u003Cpath fill=\"currentColor\" d=\"M46.614 0h9.044L35.8 22.49 59 53H40.795L26.54 34.46 10.223 53H1.18l21.036-24.055L0 0h18.657l12.878 16.937zM43.45 47.72h5.013L16.023 5.085h-5.387z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-linkedin\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.linkedin.com/company/3653845\" data-testid=\"button-external\" aria-label=\"LinkedIn\" role=\"button\" class=\"snowflake-button-container\" title=\"LinkedIn\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M22.223 0H1.772C.792 0 0 .773 0 1.73v20.536C0 23.222.792 24 1.772 24h20.451c.98 0 1.777-.778 1.777-1.73V1.73C24 .773 23.203 0 22.223 0ZM7.12 20.452H3.558V8.995H7.12v11.457ZM5.34 7.434a2.064 2.064 0 1 1 0-4.125 2.063 2.063 0 0 1 0 4.125Zm15.112 13.018h-3.558v-5.57c0-1.326-.024-3.037-1.852-3.037-1.851 0-2.133 1.449-2.133 2.944v5.663H9.356V8.995h3.413v1.566h.047c.473-.9 1.636-1.852 3.365-1.852 3.605 0 4.27 2.372 4.27 5.457v6.286Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-facebook\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.facebook.com/snowflakedb/\" data-testid=\"button-external\" aria-label=\"Facebook\" role=\"button\" class=\"snowflake-button-container\" title=\"Facebook\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M24 12c0-6.627-5.373-12-12-12S0 5.373 0 12c0 5.99 4.388 10.954 10.125 11.854V15.47H7.078V12h3.047V9.356c0-3.007 1.792-4.668 4.533-4.668 1.312 0 2.686.234 2.686.234v2.953H15.83c-1.491 0-1.956.925-1.956 1.875V12h3.328l-.532 3.469h-2.796v8.385C19.612 22.954 24 17.99 24 12Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-youtube\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.youtube.com/user/snowflakecomputing\" data-testid=\"button-external\" aria-label=\"YouTube\" role=\"button\" class=\"snowflake-button-container\" title=\"YouTube\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M23.76 7.2s-.233-1.655-.955-2.381c-.914-.956-1.936-.961-2.405-1.017-3.356-.244-8.395-.244-8.395-.244h-.01s-5.039 0-8.395.244c-.469.056-1.49.06-2.405 1.017C.473 5.545.244 7.2.244 7.2S0 9.145 0 11.086v1.819c0 1.94.24 3.886.24 3.886s.233 1.654.95 2.38c.915.957 2.115.924 2.65 1.027 1.92.183 8.16.24 8.16.24s5.044-.01 8.4-.249c.469-.056 1.49-.06 2.405-1.017.722-.727.956-2.381.956-2.381S24 14.85 24 12.905v-1.819c0-1.94-.24-3.886-.24-3.886ZM9.52 15.113V8.367l6.483 3.385-6.483 3.36Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\r\n\u003C/div\u003E","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container","text_copy_copy_16360","markup_editor"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_112062425"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"},"markup_editor_copy":{"id":"markup-editor-98492de4be","title":"New css","cssContent":".snowflake-image-container img{background-color:transparent}div.snowflake-person-chip-avatar{width:80px !important}#snowflake-blog-template-main-container .snowflake-quote-item-card{margin-top:40px}#snowflake-blog-template-main-container .aem-GridColumn:has(.vertical-video){background-color:#000;border-radius:16px;overflow:hidden}#snowflake-blog-template-main-container .is-vertical img{max-width:400px;margin-left:auto;margin-right:auto}#snowflake-blog-template-main-container .vertical-video{max-width:240px;margin-left:auto;margin-right:auto}@media screen and (min-width:1367px){.dynamic .heading-1-v2 .snowflake-title-v2-line{font-size:72px !important;line-height:60px !important}}.snowflake-flexible-column-container-items-alignment-match-height .download-card,.snowflake-flexible-column-container-items-alignment-match-height .download-card\u003E.container{height:100%}.download-card div.code-toolbar\u003E.toolbar .copy-to-clipboard-button{background-color:white;border:1px solid #a9e1f6;margin-right:4px;top:6px;border-radius:16px;height:26px;width:40px}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:before{content:'';background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23249EDC;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23249EDC;'%3E%3C/path%3E%3C/svg%3E\");background-size:auto 65%;background-position:center;background-repeat:no-repeat;top:0;left:0;width:100%;height:100%}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:hover:before{background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23fff;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23fff;'%3E%3C/path%3E%3C/svg%3E\")}.download-card\u003Ediv{background-color:#fff;border:1px solid #ccc;border-radius:8px;padding:24px}.download-chip__headline{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:16px}.download-chip{padding:8px 12px !important;border-radius:4px;transition:300ms ease background-color}.download-chip .black-blue-text-color .snowflake-title-v2-line{color:#000 !important;padding-right:24px;font-family:'Lato',sans-serif;font-size:14px !important;font-weight:500 !important}.download-chip .black-blue-text-color .snowflake-title-v2-line:not(:first-child){opacity:.6;font-style:italic !important}.download-chip .snowflake-content-chip-button{display:none}.download-chip.is-external-link{background-size:16px 16px;background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='15' viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.06055 13.0607L11.8605 2.26067M13.0605 10.6607V1.06067H3.46055' stroke='%23249EDC' stroke-width='2.12132' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-chip{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_883_7979)'%3E%3Cpath d='M3.375 16.875H14.625' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9 1.125V11.25' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4.5 7.875L9 12.375L13.5 7.875' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_883_7979'%3E%3Crect width='18' height='18' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A\");background-size:24px auto;background-repeat:no-repeat;background-position:calc(100% - 12px) center}.download-chip__headline{display:flex;gap:16px;flex-direction:row !important;flex-wrap:nowrap}.download-chip__headline::before{content:'';display:inline-block;width:24px;height:24px;background-position:center;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='21' viewBox='0 0 21 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 9.89999C8.13657 9.89999 8.74702 9.64713 9.19711 9.19704C9.64719 8.74696 9.90005 8.13651 9.90005 7.49999V2.69999C9.90005 2.06347 9.64719 1.45302 9.19711 1.00293C8.74702 .552844 8.13657 .299988 7.50005 .299988H2.70005C2.06353 .299988 1.45308 .552844 1.00299 1.00293C.552905 1.45302 .300049 2.06347 .300049 2.69999V7.49999C.300049 8.13651 .552905 8.74696 1.00299 9.19704C1.45308 9.64713 2.06353 9.89999 2.70005 9.89999H7.50005ZM7.50005 7.49999H2.70005V2.69999H7.50005V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 20.3C8.13657 20.3 8.74702 20.0472 9.19711 19.5971C9.64719 19.147 9.90005 18.5365 9.90005 17.9V13.1C9.90005 12.4635 9.64719 11.853 9.19711 11.403C8.74702 10.9529 8.13657 10.7 7.50005 10.7H2.70005C2.06353 10.7 1.45308 10.9529 1.00299 11.403C.552905 11.853 .300049 12.4635 .300049 13.1V17.9C.300049 18.5365 .552905 19.147 1.00299 19.5971C1.45308 20.0472 2.06353 20.3 2.70005 20.3H7.50005ZM7.50005 17.9H2.70005V13.1H7.50005V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 9.89999C18.5366 9.89999 19.147 9.64713 19.5971 9.19704C20.0472 8.74696 20.3001 8.13651 20.3001 7.49999V2.69999C20.3001 2.06347 20.0472 1.45302 19.5971 1.00293C19.147 .552844 18.5366 .299988 17.9001 .299988H13.1001C12.4636 .299988 11.8531 .552844 11.403 1.00293C10.9529 1.45302 10.7001 2.06347 10.7001 2.69999V7.49999C10.7001 8.13651 10.9529 8.74696 11.403 9.19704C11.8531 9.64713 12.4636 9.89999 13.1001 9.89999H17.9001ZM17.9001 7.49999H13.1001V2.69999H17.9001V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 20.3C18.5366 20.3 19.147 20.0472 19.5971 19.5971C20.0472 19.147 20.3001 18.5365 20.3001 17.9V13.1C20.3001 12.4635 20.0472 11.853 19.5971 11.403C19.147 10.9529 18.5366 10.7 17.9001 10.7H13.1001C12.4636 10.7 11.8531 10.9529 11.403 11.403C10.9529 11.853 10.7001 12.4635 10.7001 13.1V17.9C10.7001 18.5365 10.9529 19.147 11.403 19.5971C11.8531 20.0472 12.4636 20.3 13.1001 20.3H17.9001ZM17.9001 17.9H13.1001V13.1H17.9001V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat}.download-chip__headline.is-cli::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 17L10 11L4 5' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 19H20' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-card pre[class*=language-]{padding:8px 12px;background-color:var(--ui-background-05);overflow:hidden}.download-chip__headline.is-windows,.download-chip__headline.is-mac{gap:12px}.download-chip__headline.is-windows::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='4875' height='4875' viewBox='0 0 4875 4875' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_122_201)'%3E%3Cpath d='M0 0H2311V2310H0V0ZM2564 0H4875V2310H2564V0ZM0 2564H2311V4875H0V2564ZM2564 2564H4875V4875H2564' fill='%23000'/%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-mac::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns:x='ns_extend;' xmlns:i='ns_ai;' xmlns:graph='ns_graphs;' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0' y='0' viewBox='0 0 41.5 51' style='enable-background:new 0 0 41.5 51;' xml:space='preserve'%3E%3Cmetadata%3E%3Csfw xmlns='ns_sfw;'%3E%3Cslices%3E%3C/slices%3E%3CsliceSourceBounds bottomLeftOrigin='true' height='51' width='41.5' x='166.1' y='-208.1'%3E%3C/sliceSourceBounds%3E%3C/sfw%3E%3C/metadata%3E%3Cg%3E%3Cpath d='M40.2,17.4c-3.4,2.1-5.5,5.7-5.5,9.7c0,4.5,2.7,8.6,6.8,10.3c-.8,2.6-2,5-3.5,7.2c-2.2,3.1-4.5,6.3-7.9,6.3s-4.4-2-8.4-2 c-3.9,0-5.3,2.1-8.5,2.1s-5.4-2.9-7.9-6.5C2,39.5,.1,33.7,0,27.6c0-9.9,6.4-15.2,12.8-15.2c3.4,0,6.2,2.2,8.3,2.2 c2,0,5.2-2.3,9-2.3C34.1,12.2,37.9,14.1,40.2,17.4z M28.3,8.1C30,6.1,30.9,3.6,31,1c0-.3,0-.7-.1-1c-2.9,.3-5.6,1.7-7.5,3.9 c-1.7,1.9-2.7,4.3-2.8,6.9c0,.3,0,.6,.1,.9c.2,0,.5,.1,.7,.1C24.1,11.6,26.6,10.2,28.3,8.1z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-desktop::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='.8'%3E%3Cpath d='M1.5 21H22.5V18H1.5V21Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M19.5 15C20.2956 15 21.0587 14.6839 21.6213 14.1213C22.1839 13.5587 22.5 12.7956 22.5 12V6C22.5 5.20435 22.1839 4.44129 21.6213 3.87868C21.0587 3.31607 20.2956 3 19.5 3H4.5C3.70435 3 2.94129 3.31607 2.37868 3.87868C1.81607 4.44129 1.5 5.20435 1.5 6V12C1.5 12.7956 1.81607 13.5587 2.37868 14.1213C2.94129 14.6839 3.70435 15 4.5 15H19.5ZM19.5 12H4.5V6H19.5V12Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3C/g%3E%3C/svg%3E%0A\")}.download-card .snowflake-code-snippet,.download-card .snowflake-code-snippet code,.download-card .snowflake-code-snippet pre{font-size:14px;color:#000;text-shadow:none !important}.download-chip:hover{background-color:var(--ui-background-05) !important;transition:300ms ease background-color}body:has(.snowflake-skip-to-content[style]) #subNav,.pushdown-banner-dismissed #subNav{top:var(--scroll-padding-top) !important;transition:300ms ease top}body:has(.snowflake-skip-to-content[style*=\"58\"]) #subNav{top:34px !important}body:has(.snowflake-skip-to-content[style*=\"82\"]) #subNav{top:58px !important}body:has(.snowflake-skip-to-content[style*=\"130\"]) #subNav{top:106px !important}body:has(.snowflake-skip-to-content[style*=\"138\"]) #subNav{top:114px !important}body:has(.snowflake-skip-to-content[style*=\"146\"]) #subNav{top:122px !important}.is-hidden .snowflake-person-chip-avatar{display:none}.is-small .snowflake-person-chip-avatar{width:56px;height:56px}.ai-summary ul{margin:16px 0 0 0 !important;padding:0 !important;list-style-type:none}.ai-summary li{margin:0;padding:0 0 0 32px;position:relative}.ai-summary li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.ai-summary li:not(:last-child){margin-bottom:1rem}.snowflake-content-chip-image__image{aspect-ratio:5 / 3 !important}.content-chip-new .snowflake-content-chip-image__image{height:100% !important;aspect-ratio:unset !important}.snapshot-card .snowflake-text p:not(:first-child){margin-top:var(--spacing-01)}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p:has(b){font-family:'Texta',sans-serif;margin-top:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p b{font-weight:700 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){border-bottom:1px solid #ccc;padding-bottom:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) p:first-child:has(b){font-family:'Texta',sans-serif;font-size:20px !important;margin-bottom:1rem !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li{display:inline-block}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li a{display:inline-block;text-decoration:none;padding:4px 16px !important;border:1px solid #ccc;border-radius:24px;color:#666 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) ul{list-style-type:none;display:flex;padding:0 !important;margin:0 !important;gap:12px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container img{width:90%;max-width:240px;margin:0 auto}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container{padding:40px;max-width:450px;margin:0 0 0 auto;background-color:#fff;box-shadow:0 2px 6px 0 rgba(152,162,179,.25),0 10px 20px 0 rgba(152,162,179,.10);border-radius:8px;border-top:4px solid var(--ui-01)}.ai-summary{background-color:#f3fbfe;border-left:2px solid var(--ui-01);padding:40px}.ai-summary\u003Espan p:last-child:has(i){color:#666;font-size:14px !important}.ai-summary\u003Espan p:last-child:has(i) a{color:#666 !important;text-decoration:underline !important}.ai-summary\u003Espan p:last-child:has(i) a:hover{color:var(--ui-01) !Important}.ai-summary\u003Espan p:first-child:has(b)::after{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.3158 3.15226C8.6475 6.2258 6.22698 8.64545 3.15232 9.31587C2.94923 9.36072 2.94923 9.63928 3.15232 9.68413C6.22698 10.3522 8.6475 12.7742 9.3158 15.8477C9.36067 16.0508 9.63933 16.0508 9.6842 15.8477C10.3525 12.7742 12.773 10.3545 15.8477 9.68413C16.0508 9.63928 16.0508 9.36072 15.8477 9.31587C12.773 8.64781 10.3525 6.2258 9.6842 3.15226C9.63933 2.94925 9.36067 2.94925 9.3158 3.15226Z' fill='%23249EDC'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.3725 11.5461C16.9098 13.6739 15.2341 15.3491 13.1054 15.8132C12.9649 15.8443 12.9649 16.0371 13.1054 16.0681C15.2341 16.5307 16.9098 18.2074 17.3725 20.3353C17.4035 20.4758 17.5965 20.4758 17.6275 20.3353C18.0902 18.2074 19.7659 16.5323 21.8946 16.0681C22.0352 16.0371 22.0352 15.8443 21.8946 15.8132C19.7659 15.3507 18.0902 13.6739 17.6275 11.5461C17.5965 11.4055 17.4035 11.4055 17.3725 11.5461Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-repeat:no-repeat;background-size:contain;background-position:center;vertical-align:middle;margin-left:8px}.ai-summary\u003Espan p:first-child:has(b){color:var(--ui-01) !important;text-transform:uppercase}.border-top{border-top:1px solid rgba(0,0,0,.2)}.border-top\u003Espan{display:block;padding-top:32px}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9 !important}.content-chip-new .snowflake-content-chip-image__image{border-radius:0;object-fit:cover;height:100%}.sf-footer #ot-sdk-btn.ot-sdk-show-settings,.sf-footer #ot-sdk-btn.optanon-show-settings{color:rgba(255,255,255,.7) !important;text-underline-offset:4px;border-top:none;border-left:none;border-right:none;border-bottom:1px dotted transparent;background-color:transparent !important;background-image:none !important;transition:300ms ease text-decoration-color;padding:0 !important;font-size:12px;font-family:'Lato',sans-serif}.sf-footer #ot-sdk-btn.ot-sdk-show-settings:hover,.sf-footer #ot-sdk-btn.optanon-show-settings:hover{color:rgba(255,255,255,1) !important;border-bottom:1px dotted var(--ui-01);transition:300ms ease text-decoration-color}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{flex-shrink:0}.sf-footer__disclaimers{background-color:#042130}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p a{color:inherit;text-decoration:none !important}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p sup{margin-right:2px}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p{text-indent:-5px;padding-left:5px}.sf-footer__disclaimers-inner{border-top:1px solid rgba(255,255,255,.25);padding:40px 0}.sf-footer__disclaimers .snowflake-simple-stat{align-items:flex-start;text-align:left;color:rgba(255,255,255,.7);margin-bottom:10px}.sf-footer__social{display:flex;justify-content:center;gap:12px}.sf-footer .snowflake-footer-social-item{margin:0 !important}.sf-footer .snowflake-footer-social-item a{line-height:0;background-color:rgba(3,24,35,.8);display:inline-block;width:48px !important;height:48px;border-radius:8px;display:inline-flex;justify-content:center;align-items:center;transition:300ms ease background-color}.sf-footer .snowflake-footer-social-item a:hover{background-color:var(--ui-01) !important;transition:300ms ease background-color}.sf-footer__bottom{padding-bottom:40px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoError .mktoErrorMsg{max-width:100%;color:#fff}.sf-footer .mktoForm .mktoError .mktoErrorMsg .mktoErrorDetail{display:inline-block}.sf-footer .mktoFormRow:has(.mktoHtmlText:empty){display:none}.sf-footer .mktoFormRow .mktoHtmlText span{color:#fff !important}.sf-footer{background-color:#042130}.sf-footer .optanon-toggle-display:hover{text-decoration-color:var(--ui-01) !important;cursor:pointer !important;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:var(--ui-01);color:#fff !important;transition:300ms ease text-decoration-color;text-decoration:underline;opacity:1}.sf-footer__logo{width:40px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{row-gap:32px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;align-items:center;text-align:center;row-gap:16px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){text-align:center;flex-grow:1}.sf-footer__legal-links li button,.sf-footer__legal-links li a,.sf-footer__legal-links li{margin:0;color:rgba(255,255,255,.7) !important;font-weight:500}.sf-footer__legal-links li a:hover{color:rgba(255,255,255,1) !important}.sf-footer div.sf-footer__copyright p,.sf-footer div.sf-footer__legal-links li,.sf-footer div.sf-footer__legal-links a,.sf-footer div.sf-footer__legal-links p{font-size:12px !important}.sf-footer__legal-links ul{list-style-type:none;margin:0;padding:0;display:flex;gap:20px;row-gap:4px;justify-content:center;flex-wrap:wrap;text-align:center}.sf-footer__legal-links li:last-child{width:100%}.sf-footer .mktoFormRow:has(.mktoPlaceholder),.sf-footer .mktoFormRow:has(input[type=\"hidden\"]){display:none !important}.sf-footer .mktoFormCol{margin-bottom:0 !important}.sf-footer label[for=\"adhoc1\"]{width:auto !important;flex-grow:1;margin-left:16px}.sf-footer .mktoFieldWrap:has(label[for=\"adhoc1\"]){display:flex;flex-direction:row-reverse;margin-top:22px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoCheckboxList input[type=checkbox]{background-color:transparent !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-color:transparent !important;color:#fff !important;height:auto !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important;padding:12px 18px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select:focus{border-color:var(--ui-01) !important}.sf-footer .mktoForm *{padding:0 !important}.sf-footer .mktoForm,.sf-footer .snowflake-marketo-form-container{padding:0 !important;background:transparent;margin-bottom:0;box-shadow:none}.sf-footer .mktoHtmlText.mktoHasWidth{width:100% !important;margin:24px 0}.sf-footer .mktoFormRow{flex-direction:column}.sf-footer .mktoForm .mktoButtonWrap{margin:0 !important}.sf-footer select{background-image:url(\"data:image/svg+xml,%3Csvg width='14' height='8' viewBox='0 0 14 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.981445 1.43496L6.90897 7.32496L12.9314 1.33496' stroke='white' stroke-width='1.33333' stroke-miterlimit='10' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\") !important}.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative{justify-content:flex-start}.sf-footer *::placeholder{color:#fff !important;opacity:.8}.sf-footer .mktoForm .mktoButtonWrap.mktoSimple .mktoButton{background-color:var(--ui-01) !important;color:#fff !important;width:100% !important;padding:12px 16px !important;border:1px solid var(--ui-01) !important;background-image:none !important;border-radius:48px;text-transform:uppercase;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:16px !important;line-height:1.2}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoHtmlText\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoLabel\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap label.mktoLabel{color:#fff !important}.sf-footer__newsletter-title p:not(:first-child){margin-top:8px !important}.sf-footer__newsletter-title p b{font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:22px !important;line-height:1.2}.sf-footer__newsletter-title p:last-child{font-size:14px !important;opacity:.8}.sf-footer__link-group li a[target=\"_blank\"]::after{content:'';display:inline-block;width:10px;height:10px;margin-left:5px;background-image:url(\"data:image/svg+xml,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.72222 1.22222C6.38471 1.22222 6.11111 .948616 6.11111 .611111C6.11111 .273607 6.38471 0 6.72222 0H10.3889C10.551 0 10.7064 .0643867 10.821 .178988C10.9356 .293596 11 .449032 11 .611111V4.27778C11 4.61529 10.7264 4.88889 10.3889 4.88889C10.0514 4.88889 9.77778 4.61529 9.77778 4.27778V2.08647L4.09879 7.76545C3.86013 8.00409 3.4732 8.00409 3.23454 7.76545C2.99589 7.52681 2.99589 7.13986 3.23454 6.90122L8.91355 1.22222H6.72222ZM0 2.44444C0 1.76943 .547207 1.22222 1.22222 1.22222H4.27778C4.61529 1.22222 4.88889 1.49583 4.88889 1.83333C4.88889 2.17084 4.61529 2.44444 4.27778 2.44444H1.22222V9.77778H8.55556V6.72222C8.55556 6.38471 8.82915 6.11111 9.16667 6.11111C9.50418 6.11111 9.77778 6.38471 9.77778 6.72222V9.77778C9.77778 10.4528 9.23059 11 8.55556 11H1.22222C.547207 11 0 10.4528 0 9.77778V2.44444Z' fill='white'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-position:center}.sf-footer__link-group ul,.sf-footer__link-group li{margin:0;padding:0;list-style-type:none}.sf-footer__link-group ul{margin-top:20px !important}.sf-footer__link-group li{margin-top:15px}.sf-footer div.sf-footer__link-group\u003Espan\u003Ep\u003Ea,.sf-footer div.sf-footer__link-group\u003Espan\u003Ep{color:var(--ui-01) !important;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:20px !important;line-height:1.2}.sf-footer__link-group li a{opacity:.9;color:#fff !important;font-weight:500 !important;font-size:15px !important;line-height:1.3}.sf-footer__link-group li a:hover{opacity:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::before,.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::after{display:none}.sf-footer__column{flex-grow:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child){width:50%}@media (min-width:800px){.sf-footer__legal-links ul{justify-content:flex-start;text-align:left}.sf-footer__social{justify-content:flex-end}.sf-footer__legal-links ul{padding-left:24px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{text-align:right;flex-wrap:nowrap}.sf-footer__legal-links.align-left ul{justify-content:flex-start}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;flex-direction:row}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto !important;max-width:200px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;order:2;width:100% !important;max-width:none}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto}}@media screen and (min-width:1380px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{flex-wrap:nowrap}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{padding-right:48px;max-width:380px;background-color:rgba(3,24,35,.4);padding:32px;margin-left:48px;border-radius:16px}.sf-footer__link-group li,.sf-footer__link-group li a{font-size:14px !important;line-height:1.3}}@media screen and (max-width:991px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{order:2;margin-top:24px !important}}@media screen and (max-width:420px){.is-reduced-mobile .heading-1-v2,.is-reduced-mobile .heading-1-v2-sm{font-size:32px;line-height:28px}}.quote-content-chip{background-color:var(--ui-background-05);padding:24px;border-radius:12px;position:relative}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan{color:rgba(0,0,0,.8) !important;font-size:15px !important;line-height:1.5 !important;font-family:'Lato',sans-serif;font-weight:400 !important}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:not(:first-child){max-width:calc(100% - 200px)}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:nth-child(2){font-family:'Texta',sans-serif;color:#000 !important;font-size:20px !important;font-weight:800 !important;margin-top:24px}.quote-content-chip .snowflake-content-chip-image{width:140px !important}@media screen and (min-width:992px){.quote-content-chip .snowflake-content-chip-image{position:absolute !important;bottom:24px;right:16px}}@media screen and (max-width:991px){.quote-content-chip .snowflake-content-chip-image{margin-bottom:40px}.quote-content-chip{flex-direction:column}}#spa-root{background-color:#fff}.lowercase .snowflake-title-v2-line{text-transform:none !important}.centered .snowflake-logo-content-container-inner{justify-content:center}div.snowflake-linklist-dropdown-menu{max-height:380px}.first-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:first-child{color:var(--ui-01) !important}.is-front{position:relative;z-index:2}.use-case-body .snowflake-text h1,.use-case-body .snowflake-text h2,.use-case-body .snowflake-text h3,.use-case-body .snowflake-text h4,.use-case-body .snowflake-text h5,.use-case-body .snowflake-text h6{font-family:'Texta',sans-serif;color:#000;margin:.25rem 0 0 0}.pc-hero .button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:flex-start}.sf-footer .mktoFormRow .mktoHtmlText span{font-family:'Lato',sans-serif !important}.snowflake-button-primary.snowflake-button-blue .snowflake-button-container{justify-content:center}.related-chip-25{background-color:#fff;border:1px solid rgba(204,204,204,.5);border-radius:8px;padding:20px;position:relative}.related-chip-25:hover{box-shadow:rgba(152,162,179,.1) 0 10px 20px 0}.related-chip-25:hover::after{right:24px;transition:300ms ease right}.related-chip-25::after{content:'';display:block;transition:300ms ease right;background-image:url(\"data:image/svg+xml,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.66699 7C7.66699 6.6571 7.53559 6.32825 7.30169 6.08578L2.34446 .947072C1.84529 .429617 1.0164 .429617 .517219 .947072C.0427878 1.43887 .042788 2.21798 .517219 2.70978L4.65591 7L.51722 11.2902C.0427889 11.782 .0427887 12.5611 .51722 13.0529C1.0164 13.5704 1.84529 13.5704 2.34447 13.0529L7.30169 7.91421C7.53559 7.67175 7.66699 7.34289 7.66699 7Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\");width:8px;height:14px;display:block;position:absolute;right:30px;top:50%;transform:translateY(-50%);background-size:contain;background-position:center;background-repeat:no-repeat}.related-chip-25 .heading-5-v2{font-size:22px;line-height:1.1}.related-chip-25 .snowflake-content-chip-image{width:48px;flex-shrink:0}.related-chip-25 .snowflake-content-chip-image__image{aspect-ratio:1;height:auto;object-fit:contain}.related-chip-25 .snowflake-content-chip-button{display:none}.related-chip-25 .snowflake-content-chip-content-without-tag{flex-grow:1;padding-right:24px}.case-study-25.small-logo .snowflake-case-study-card-logo img{width:60px !important}.swiper-slide .case-study-25{width:95%;margin-left:auto;margin-right:auto}.case-study-25 .snowflake-case-study-card-logo img{width:140px !important;height:auto !important;transform:none !important;margin:24px 0 8px 0}.case-study-25 .snowflake-case-study-card-image__image{object-position:left center}.case-study-25 .snowflake-case-study-card-information-container{padding-right:24px}.case-study-25 ul{list-style-type:none;padding:0;margin:8px 0 0 0}.case-study-25 li{font-size:15px !important;line-height:1.3 !important;display:flex;flex-direction:column;border-left:4px solid var(--ui-01);padding-left:24px;margin-top:24px;color:#535862;gap:4px}.case-study-25 li b{display:block;font-family:'Texta',sans-serif;font-weight:900 !important;font-size:48px !important;line-height:.9 !important;color:var(--ui-01)}.case-study-25 .snowflake-case-study-card-description p{color:#535862}.case-study-25 .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){color:#000;font-family:Texta;font-size:30px !important;line-height:1 !important;font-style:normal;font-weight:700;text-indent:-8px}.case-study-25.is-story .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){text-indent:0}.case-study-25 .snowflake-case-study-card-key-card{background-color:transparent}.case-study-25 .snowflake-case-study-card-button{display:none}.case-study-25{border-radius:24px;overflow:hidden}@media screen and (min-width:1024px){.case-study-25 .snowflake-case-study-card-left-container{position:static;width:60%;min-height:0}.case-study-25 .snowflake-case-study-card-right-container::after{content:'';display:block;width:60%;max-width:340px;padding-bottom:50%;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 22 16' class='snowflake-pushdown-banner-placeholder-arrow'%3E%3Cpath fill='%2329B5E8' fill-rule='evenodd' d='M17.865 8.756c.088-.274.124-.555.118-.834a2.551 2.551 0 0 0-1.3-2.142L7.887.76C6.645.055 5.063.475 4.35 1.7a2.535 2.535 0 0 0 .947 3.494l4.916 2.809-4.916 2.801a2.543 2.543 0 0 0-.947 3.502c.713 1.222 2.295 1.64 3.537.934l8.796-5.024a2.541 2.541 0 0 0 1.182-1.46Z' clip-rule='evenodd'%3E%3C/path%3E%3C/svg%3E\");background-size:contain;background-repeat:no-repeat;position:absolute;top:-10%;left:-20%}.case-study-25 .snowflake-case-study-card-right-container{max-width:none;width:40%;position:absolute;top:-5%;right:-5%;z-index:0;height:110%}}@media screen and (min-width:768px){.case-study-25 li{max-width:50%}.case-study-25 ul{display:flex;gap:48px}}.snowflake-text.section-eyebrow p{margin-left:auto;margin-right:auto;margin-bottom:16px !important}.snowflake-text.section-eyebrow p,.snowflake-text.eyebrow-text p{text-transform:uppercase;font-family:'Texta',sans-serif !important;font-weight:800 !important;letter-spacing:.025em;margin-bottom:12px;line-height:1.1 !important}.snowflake-title-v2.dynamic .heading-2-v2 span.snowflake-title-v2-line{font-size:clamp(2.5rem,4.5vw,4rem) !important;line-height:.82 !important}.checklist ul{padding:0;margin:0}.checklist ul li{list-style-type:none;padding-left:32px;position:relative}.checklist ul li:not(:last-child){margin-bottom:1em}.checklist ul li::before{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='25' viewBox='0 0 24 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect y='.985352' width='24' height='24' rx='12' fill='%23D4F0FA'/%3E%3Cpath d='M7.28613 13.2967L10.7147 16.7253L17.5718 9.86816' stroke='%2329B5E8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;position:absolute;top:3px;left:0}.last-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:last-child{color:var(--ui-01)}.snowflake-text p sup{line-height:0}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px;line-height:1;text-transform:none;font-weight:700}.snowflake-title-v2.lowercase .heading-2-v2{font-size:32px;line-height:1;text-transform:none;font-weight:700}.content-chip-new{border:1px solid rgba(204,204,204,.5);border-radius:16px;overflow:hidden}.content-chip-new .snowflake-image-container{border-radius:0;display:none}.content-chip-new .snowflake-content-chip-image{margin-right:0;max-width:180px;flex-shrink:0}.content-chip-new .snowflake-content-chip-content{padding:24px}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:first-child{font-size:24px;line-height:1.1}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){font-family:'Lato',sans-serif;font-size:17px;color:#535862 !important;font-weight:500;line-height:1.45;margin-top:8px;display:none}div.snowflake-text a{font-weight:normal;color:var(--ui-01);text-decoration:underline;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:transparent;transition:300ms ease text-decoration-color}div.snowflake-text a:hover{text-decoration-color:var(--ui-01);transition:300ms ease text-decoration-color}.footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container .snowflake-button-primary+.snowflake-button-link{margin-left:12px !important}.snowflake-button-regular.snowflake-button-link .snowflake-button-container{font-size:18px !important;text-align:left;justify-content:flex-start;line-height:1.4 !important}body .snowflake-card-v2-advanced{border:1px solid rgba(204,204,204,.5);border-radius:var(--spacing-02);transition:300ms ease all}body .snowflake-card-v2-advanced:hover{transform:translateY(-10px);box-shadow:rgba(152,162,179,.1) 0 10px 20px 0;transition:300ms ease all}body .snowflake-card-v2-advanced-inner{border-bottom:none}body .snowflake-card-v2-advanced-image{line-height:0}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9}body .snowflake-card-v2-advanced-content{position:relative}body .snowflake-card-v2-advanced-content::after{content:'';display:block;position:absolute;bottom:0;left:0;transition:300ms ease all;width:20%;height:4px;background-color:var(--ui-01);opacity:0}body .snowflake-card-v2-advanced:hover .snowflake-card-v2-advanced-content::after{width:100%;opacity:1;transition:300ms ease all}body .snowflake-card-v2-advanced .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transition:300ms ease transform}body .snowflake-card-v2-advanced:hover .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transform:translateX(4px);transition:300ms ease transform}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-wrap:wrap;gap:24px}.six-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:100%;margin:0 !important}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px);margin:0 !important}@media screen and (min-width:768px){.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}}@media screen and (min-width:1024px){.snowflake-title-v2.lowercase .heading-3-v2{font-size:34px}.snowflake-title-v2.lowercase.larger .heading-2-v2{font-size:44px;line-height:.95}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(25% - 18px)}.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(20% - 19.2px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(16.6666% - 20px)}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px !important}}@media screen and (min-width:1200px){.snowflake-title-v2.lowercase .heading-2-v2{font-size:40px}.content-chip-new .snowflake-content-chip-content{padding:32px}.content-chip-new .snowflake-image-container,.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){display:block}}.promo-banner-25{border-radius:16px;overflow:hidden}.promo-banner-25 .snowflake-premium-content-banner-image-container{position:relative;max-width:380px}.promo-banner-25 .snowflake-text{color:#535862}.promo-banner-25 .snowflake-premium-content-banner-image__image{transform:translateY(8px);transition:300ms ease transform;border-radius:0;width:85%;margin:0 auto;display:block;position:relative;z-index:1}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover .snowflake-premium-content-banner-image__image{transform:translateY(0);transition:300ms ease transform}.promo-banner-25 .snowflake-premium-content-banner-image__inner{height:auto;padding-top:24px}.promo-banner-25 .snowflake-premium-content-banner-image__link{position:relative;z-index:1;height:auto}.promo-banner-25 .snowflake-premium-content-banner-image__link::after{content:'';display:block;position:absolute;clip-path:polygon(0 0,66% 0,100% 100%,0 100%);bottom:0;left:0;width:100%;height:100%;background:var(--ui-01);transition:300ms ease width}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover::after{width:110%;transition:300ms ease width}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-position:95% 50%}.sf-footer__disclaimers .text-size-small .snowflake-text p{color:#fff !important;font-size:10px !important;opacity:.8}@media screen and (min-width:768px){.sf-footer__disclaimers .text-size-small .snowflake-text p{font-size:12px !important}}@media screen and (max-width:1023px){.mobile-top-padding{padding-top:64px}}@media (max-width:799px){.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative .mktoButton{width:100% !important}.sf-footer__logo{text-align:center;display:block;margin:0 auto}}.customer-card .snowflake-card-v2-advanced-image{aspect-ratio:4.35 / 1}.customer-card .snowflake-card-v2-advanced-image__image{width:100%;height:100%;padding-left:8px;object-fit:contain;object-position:left center;margin:0 !important;aspect-ratio:initial}.customer-card .snowflake-card-v2-advanced-image__inner{height:110px}.customer-card .snowflake-card-v2-advanced-tag-indicator{display:none}.pc-hero .snowflake-container-arrow-small-gray-image{top:-34% !important;width:18% !important}.pc-hero .snowflake-container-arrow-small-gray-image path{fill:var(--ui-01);opacity:1}@media screen and (max-width:767px){.mobile-padding-top{padding-top:64px}.hide-mobile{display:none !important}.pc-hero{padding-top:52px}.pc-hero .snowflake-text p,.pc-hero .left-alignment .snowflake-title-v2-line,.pc-hero h1 span{text-align:center !important}}div.snowflake-pushdown-banner-button{margin-top:0}.button-group.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:center !important}.text-center .snowflake-breadcrumb-swiper .swiper-wrapper{justify-content:center}div.snowflake-breadcrumb a.snowflake-breadcrumb-item,.snowflake-breadcrumb div.snowflake-breadcrumb-item{text-transform:none;font-weight:500}.snowflake-breadcrumb svg{display:none !important}.snowflake-breadcrumb a:has(svg)::after{content:'/';margin:0 12px;color:#666}.hide-filters .snowflake-filterable-and-searchable-grid-top-part{display:none !important}.page-section{padding-left:24px;padding-right:24px}@media screen and (min-width:768px){.page-section{padding-left:48px;padding-right:48px}}.download-card pre[class*=language-]{overflow-x:scroll !important}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container_copy","container_573483281_","markup_editor_copy"]}},":itemsOrder":["root"],"classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-629e93e5df","title":"Quickstarts Overrides","cssContent":".snowflake-markdown blockquote{padding:24px 32px;background:#f6f9fa;border:1px solid #29b5e8;border-radius:16px}.snowflake-markdown .snowflake-image-container img{width:auto !important;max-width:100%}.snowflake-markdown .snowflake-text ol{padding-left:20px !important}.snowflake-markdown .snowflake-text li{margin:0 0 12px 0 !important}.snowflake-markdown h3.snowflake-markdown-h3{font-size:20px !important;font-family:Texta,sans-serif !important}@media (min-width:768px){.snowflake-markdown h3.snowflake-markdown-h3{font-size:28px !important}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["experiencefragment-banner","experiencefragment-header","markup_editor_1950346551","responsivegrid","modal_container","experiencefragment-footer","markup_editor"],":type":"wcm/foundation/components/responsivegrid"}},":itemsOrder":["root"],"locale":"en"}
  