{"version":1,"pages":[{"id":"pyLALve9u2ptdQlHVIra","title":"Welcome to Joule's Docs","pathname":"/joule","siteSpaceId":"sitesp_RbtDT","icon":"door-open","description":"The low-code multi-purpose platform for stream analytics builders designed to accelerate ideation to business impact"},{"id":"ghD4SlQTcTf0sXsGHoe5","title":"Why Joule?","pathname":"/joule/why-joule","siteSpaceId":"sitesp_RbtDT","icon":"comment-question","description":"By using Joule, every business can realise their potential real-time analytics opportunities"},{"id":"I9SGz8xLJL1SheX3GmNa","title":"Joule capabilities","pathname":"/joule/why-joule/joule-capabilities","siteSpaceId":"sitesp_RbtDT","description":"Deliver actionable insights through real-time processing","breadcrumbs":[{"label":"Why Joule?","icon":"comment-question"}]},{"id":"gwujCDsDU3JVyp7ZRVS6","title":"What is Joule?","pathname":"/joule/what-is-joule","siteSpaceId":"sitesp_RbtDT","icon":"square-info","description":"Joule is a low-code use case platform designed for modern streaming analytical processing"},{"id":"9WG5h0MtXiN1yn1j38ZQ","title":"Key features","pathname":"/joule/what-is-joule/key-features","siteSpaceId":"sitesp_RbtDT","icon":"feather","description":"Build, deploy and scale analytic use cases fast","breadcrumbs":[{"label":"What is Joule?","icon":"square-info"}]},{"id":"1jqlgA2Z7pCgWQPTRWjv","title":"The tech stack","pathname":"/joule/what-is-joule/the-tech-stack","siteSpaceId":"sitesp_RbtDT","icon":"cubes","description":"High level overview of technologies used within the Joule platform","breadcrumbs":[{"label":"What is Joule?","icon":"square-info"}]},{"id":"vnlFAoqr7sSeUlGvGLWE","title":"Use case enablement","pathname":"/joule/use-case-enablement","siteSpaceId":"sitesp_RbtDT","icon":"unity","description":"Learn what use cases can be built and deployed using Joule"},{"id":"9xm0RpLmpjOiilCEd7SB","title":"Use case building framework","pathname":"/joule/use-case-enablement/use-case-building-framework","siteSpaceId":"sitesp_RbtDT","description":"Build impactful use cases","breadcrumbs":[{"label":"Use case enablement","icon":"unity"}]},{"id":"f2LyRrheP23AMqXJxjsU","title":"Concepts","pathname":"/joule/concepts","siteSpaceId":"sitesp_RbtDT","icon":"arrows-to-circle","description":"Collection of concepts for the effective utilisation of Joule"},{"id":"LL6YQEW0guhAn1TB0fKG","title":"Core concepts","pathname":"/joule/concepts/core-concepts","siteSpaceId":"sitesp_RbtDT","icon":"line-height","description":"This section explores high-level concepts about Joule, it will help us understand how to build stream processing pipelines that subscribe to source data and publish results","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"}]},{"id":"zIenhpP18IYMp7GQGyNM","title":"Low code development","pathname":"/joule/concepts/low-code-development","siteSpaceId":"sitesp_RbtDT","icon":"code","description":"Joule is a low code development platform designed to ideate, pilot and scale business use cases","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"}]},{"id":"CRnyeys5Fho0lA2OdNFo","title":"Unified execution engine","pathname":"/joule/concepts/unified-execution-engine","siteSpaceId":"sitesp_RbtDT","icon":"engine","description":"Unified engine for real-time and batch data processing","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"}]},{"id":"cLPI9oXtYSuGNPX1Q9Pt","title":"Batch and stream processing","pathname":"/joule/concepts/batch-and-stream-processing","siteSpaceId":"sitesp_RbtDT","icon":"arrow-up-small-big","description":"Unified platform for batch and stream processing","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"}]},{"id":"Qefim4x3tYTSMeOt2mTT","title":"Continuous metrics","pathname":"/joule/concepts/continuous-metrics","siteSpaceId":"sitesp_RbtDT","icon":"tally-4","description":"Real-time metrics provide the ability to drive advance insights and use cases","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"}]},{"id":"S58RaVUpEqsh1Vqd9ycY","title":"Key Joule data types","pathname":"/joule/concepts/key-joule-data-types","siteSpaceId":"sitesp_RbtDT","icon":"hexagon-image","description":"Key data types available within the Joule platform","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"}]},{"id":"6RrUKKtpJ7w4w518TXBq","title":"StreamEvent object","pathname":"/joule/concepts/key-joule-data-types/streamevent-object","siteSpaceId":"sitesp_RbtDT","description":"StreamEvent enables flexible, efficient event-driven data processing in Joule","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"},{"label":"Key Joule data types","icon":"hexagon-image"}]},{"id":"STrBDpoO0r88fNqe9Jsx","title":"Contextual data","pathname":"/joule/concepts/key-joule-data-types/contextual-data","siteSpaceId":"sitesp_RbtDT","description":"ReferenceDataObject stores, queries and manages contextual reference data","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"},{"label":"Key Joule data types","icon":"hexagon-image"}]},{"id":"kuzrnAlAMVvyK7vGjCQf","title":"GeoNode","pathname":"/joule/concepts/key-joule-data-types/geonode","siteSpaceId":"sitesp_RbtDT","description":"Geospatial data structure for location-based spatial entity analysis","breadcrumbs":[{"label":"Concepts","icon":"arrows-to-circle"},{"label":"Key Joule data types","icon":"hexagon-image"}]},{"id":"kT6PyvPcito7BNlNDIAE","title":"Tutorials","pathname":"/joule/tutorials","siteSpaceId":"sitesp_RbtDT","icon":"newspaper","description":"Learning-oriented step-by-step guides. Ideal to begin your journey with Joule."},{"id":"mwcHtjKO3N29dkC7Jrkp","title":"Getting started","pathname":"/joule/tutorials/getting-started","siteSpaceId":"sitesp_RbtDT","description":"All you need to get started with Joule.","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"}]},{"id":"EhCXYEAPYVJucpEAlCTS","title":"Build your first use case","pathname":"/joule/tutorials/build-your-first-use-case","siteSpaceId":"sitesp_RbtDT","description":"","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"}]},{"id":"r7geRyMlZdnsfdsYqijV","title":"Stream sliding window quote analytics","pathname":"/joule/tutorials/stream-sliding-window-quote-analytics","siteSpaceId":"sitesp_RbtDT","description":"","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"}]},{"id":"EpMvrUbRhcrEnNSmHAZh","title":"Advanced tutorials","pathname":"/joule/tutorials/advanced-tutorials","siteSpaceId":"sitesp_RbtDT","description":"Learning-oriented step-by-step guides. Ideal to begin your journey with Joule.","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"}]},{"id":"8zFg4TwAa9jbBoaeLTAW","title":"Data quality","pathname":"/joule/tutorials/advanced-tutorials/data-quality","siteSpaceId":"sitesp_RbtDT","description":"Build, deploy and apply a custom transformer","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"},{"label":"Advanced tutorials"}]},{"id":"5iXEHfXMmdek1XMvNWUu","title":"Stateless analytics","pathname":"/joule/tutorials/advanced-tutorials/stateless-analytics","siteSpaceId":"sitesp_RbtDT","description":"Build, deploy and apply a custom user defined stateless analytic function","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"},{"label":"Advanced tutorials"}]},{"id":"zVaItL9CNaEqlMVWhJye","title":"IoT device control","pathname":"/joule/tutorials/advanced-tutorials/iot-device-control","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Tutorials","icon":"newspaper"},{"label":"Advanced tutorials"}]},{"id":"6f6zuTIkbZOrRzhhoRj4","title":"FAQ","pathname":"/joule/faq","siteSpaceId":"sitesp_RbtDT","description":"Collation of frequently asked questions"},{"id":"kGr7rrY3RxzwteBQxFhC","title":"Glossary","pathname":"/joule/glossary","siteSpaceId":"sitesp_RbtDT"},{"id":"hwuuZKxTfYTRNV4RSaOZ","title":"Pipelines","pathname":"/joule/components/pipelines","siteSpaceId":"sitesp_RbtDT","icon":"person-to-portal","description":"Data (stream) pipelines enable business-specific, real-time analytics use cases","breadcrumbs":[{"label":"Components"}]},{"id":"HD2PpxvP3zhsTrhwocCj","title":"Use case anatomy","pathname":"/joule/components/pipelines/use-case-anatomy","siteSpaceId":"sitesp_RbtDT","description":"A use case binds together the required data and stream pipeline unit to perform the desired function","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"}]},{"id":"OqDGdOTKwHA25RVIKVJ7","title":"Data priming","pathname":"/joule/components/pipelines/data-priming","siteSpaceId":"sitesp_RbtDT","description":"Prime Joule with necessary startup data","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"}]},{"id":"avAlsFSKbfGhhl6y7sTI","title":"Types of import","pathname":"/joule/components/pipelines/data-priming/types-of-import","siteSpaceId":"sitesp_RbtDT","description":"Parquet and CSV data imports for stream processing","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"},{"label":"Data priming"}]},{"id":"zyCbQGioEHwjF2DwvaPg","title":"Processing unit","pathname":"/joule/components/pipelines/processing-unit","siteSpaceId":"sitesp_RbtDT","description":"Quickly build custom business use cases","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"}]},{"id":"vWekTge1ComLPnKieHHr","title":"Group by","pathname":"/joule/components/pipelines/group-by","siteSpaceId":"sitesp_RbtDT","description":"Groups events by attributes to drive optimised computation functions","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"}]},{"id":"w2uTAyUMvUHhHdrvCDBA","title":"Emit computed events","pathname":"/joule/components/pipelines/emit-computed-events","siteSpaceId":"sitesp_RbtDT","description":"Select and filter output events for publishing","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"}]},{"id":"SzxCgvuHwfPMXMhI0sX0","title":"Telemetry auditing","pathname":"/joule/components/pipelines/telemetry-auditing","siteSpaceId":"sitesp_RbtDT","description":"Audit and track events for validation and testing","breadcrumbs":[{"label":"Components"},{"label":"Pipelines","icon":"person-to-portal"}]},{"id":"21H6be81tCxZDwGJDYxq","title":"Processors","pathname":"/joule/components/processors","siteSpaceId":"sitesp_RbtDT","icon":"microchip","description":"Processors are the core of the Joule platform, each performing a specific task. These create use case when linked together","breadcrumbs":[{"label":"Components"}]},{"id":"PAaXgwKL2dUAqfSrCy5U","title":"Common attributes","pathname":"/joule/components/processors/common-attributes","siteSpaceId":"sitesp_RbtDT","description":"Core processor attributes that provide out-of-the-box features","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"ClS08DOF0ADaHaMx1kTV","title":"Filters","pathname":"/joule/components/processors/filters","siteSpaceId":"sitesp_RbtDT","icon":"filter","description":"Reduce stream processing overhead by filtering irrelevant events","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"C3N6QFGqalt8TDzRq5BT","title":"By type","pathname":"/joule/components/processors/filters/by-type","siteSpaceId":"sitesp_RbtDT","description":"Filter events based on specific types from the processing pipeline","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Filters","icon":"filter"}]},{"id":"8DDTFnXdKRBbkpJgMX0u","title":"By expression","pathname":"/joule/components/processors/filters/by-expression","siteSpaceId":"sitesp_RbtDT","description":"Use Javascript expressions to define custom filters","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Filters","icon":"filter"}]},{"id":"4DSefptWgTbbDEDu58hx","title":"Send on delta","pathname":"/joule/components/processors/filters/send-on-delta","siteSpaceId":"sitesp_RbtDT","description":"Stateful filter processor that filters previous seen events","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Filters","icon":"filter"}]},{"id":"CgjVB8qulDWyhmjmdGEA","title":"Remove attributes","pathname":"/joule/components/processors/filters/remove-attributes","siteSpaceId":"sitesp_RbtDT","description":"Remove sensitive attributes from an event","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Filters","icon":"filter"}]},{"id":"ttNbaLPNzofqtcjGAyZ2","title":"Drop all events","pathname":"/joule/components/processors/filters/drop-all-events","siteSpaceId":"sitesp_RbtDT","description":"Drop all incoming events in the processor","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Filters","icon":"filter"}]},{"id":"MPqhGk3OCN6rIugq8zcd","title":"Enrichment","pathname":"/joule/components/processors/enrichment","siteSpaceId":"sitesp_RbtDT","icon":"object-union","description":"Enrich events using connected contextual data, metrics and analytics","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"P2U7YaAGfx26YanvGGI6","title":"Key concepts","pathname":"/joule/components/processors/enrichment/key-concepts","siteSpaceId":"sitesp_RbtDT","description":"Enriching events with the latest contextual data is crucial for processing advanced real-time business insights","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"}]},{"id":"TORLKFpfwBTmHPCqYskG","title":"Anatomy of enrichment DSL","pathname":"/joule/components/processors/enrichment/key-concepts/anatomy-of-enrichment-dsl","siteSpaceId":"sitesp_RbtDT","description":"The enrichment DSL provides a flexible syntax that enables the user to define field level enrichments","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"},{"label":"Key concepts"}]},{"id":"xpd6CZNyjLFaa3YTBx7x","title":"Banking example","pathname":"/joule/components/processors/enrichment/key-concepts/banking-example","siteSpaceId":"sitesp_RbtDT","description":"The below banking example enriches events using the linked contextual data and metrics","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"},{"label":"Key concepts"}]},{"id":"1LlQfAGSJ6fbBCg60WU1","title":"Metrics","pathname":"/joule/components/processors/enrichment/metrics","siteSpaceId":"sitesp_RbtDT","description":"Enrich events with pre-calculated metrics to facilitate further advanced processing","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"}]},{"id":"FNkKaC5bJUKw4pbGxQJO","title":"Dynamic contextual data","pathname":"/joule/components/processors/enrichment/dynamic-contextual-data","siteSpaceId":"sitesp_RbtDT","description":"Use fast, connected data stores to quickly enrich in-motion events with up-to-date context","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"}]},{"id":"GUafw5AtqhCCAgaZMSfQ","title":"Caching architecture","pathname":"/joule/components/processors/enrichment/dynamic-contextual-data/caching-architecture","siteSpaceId":"sitesp_RbtDT","description":"Caching is a key enabler for low-latency contextual data access","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"},{"label":"Dynamic contextual data"}]},{"id":"ETGwHElBexCVHhGZU3E8","title":"Static contextual data","pathname":"/joule/components/processors/enrichment/static-contextual-data","siteSpaceId":"sitesp_RbtDT","description":"Enrich events with essential slow changing data from Joule’s in-memory database.","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Enrichment","icon":"object-union"}]},{"id":"MBFIbeGgTuGhRq01m20M","title":"Transformation","pathname":"/joule/components/processors/transformation","siteSpaceId":"sitesp_RbtDT","icon":"money-bill-transfer","description":"Reshape origin event data in to target event","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"gdcXb89BzFPx7bFmkS3s","title":"Field Tokeniser","pathname":"/joule/components/processors/transformation/field-tokeniser","siteSpaceId":"sitesp_RbtDT","description":"Tokenise attribute values in to component parts","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Transformation","icon":"money-bill-transfer"}]},{"id":"figDEKyeC2ogEkgKf2aY","title":"Obfuscation","pathname":"/joule/components/processors/transformation/obfuscation","siteSpaceId":"sitesp_RbtDT","description":"Joule provides an in-stream-obfruscation function to streaming events. This function is useful for Personal Identifiable Information de-identification.","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Transformation","icon":"money-bill-transfer"}]},{"id":"CwnQA2A9QBie0RRel7SU","title":"Encryption","pathname":"/joule/components/processors/transformation/obfuscation/encryption","siteSpaceId":"sitesp_RbtDT","description":"Apply RSA encryption techniques along with AES symmetric encryption","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Transformation","icon":"money-bill-transfer"},{"label":"Obfuscation"}]},{"id":"dl2QQnrm3dEiyjKZeU19","title":"Masking","pathname":"/joule/components/processors/transformation/obfuscation/masking","siteSpaceId":"sitesp_RbtDT","description":"Mask sensitive field values while retaining the formatting criteria","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Transformation","icon":"money-bill-transfer"},{"label":"Obfuscation"}]},{"id":"SkSvvQGYJSGXafhDziUY","title":"Bucketing","pathname":"/joule/components/processors/transformation/obfuscation/bucketing","siteSpaceId":"sitesp_RbtDT","description":"Apply individual variance tolerances to protect the identity of the originating data","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Transformation","icon":"money-bill-transfer"},{"label":"Obfuscation"}]},{"id":"bxHacftW6mx5YNjnfOzd","title":"Redaction","pathname":"/joule/components/processors/transformation/obfuscation/redaction","siteSpaceId":"sitesp_RbtDT","description":"Eliminate sensitive event field data by either nullifying or replacing with a blank value","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Transformation","icon":"money-bill-transfer"},{"label":"Obfuscation"}]},{"id":"lDFdZaoiNrUYDaIPfjP4","title":"Triggers","pathname":"/joule/components/processors/triggers","siteSpaceId":"sitesp_RbtDT","icon":"up-right-and-down-left-from-center","description":"Minimise expensive computation while notifying consumers of events to action","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"YTiccUEpUx3oOrFVzvBF","title":"Change Data Capture","pathname":"/joule/components/processors/triggers/change-data-capture","siteSpaceId":"sitesp_RbtDT","description":"Distribute delta records for key attribute changes","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Triggers","icon":"up-right-and-down-left-from-center"}]},{"id":"yBNMiNePVap2Ci4jMhBs","title":"Business rules","pathname":"/joule/components/processors/triggers/business-rules","siteSpaceId":"sitesp_RbtDT","description":"Leverage standard JSR-94 rules engine to perform advance business rules","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Triggers","icon":"up-right-and-down-left-from-center"}]},{"id":"KDDomwsJgrZB24bNOd1G","title":"Stream join","pathname":"/joule/components/processors/stream-join","siteSpaceId":"sitesp_RbtDT","icon":"object-exclude","description":"Join independent stream events to trigger advanced analytics and dynamic business rules","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"iyqT32qylAAfon84rN28","title":"Inner stream joins","pathname":"/joule/components/processors/stream-join/inner-stream-joins","siteSpaceId":"sitesp_RbtDT","description":"Strict join between two event streams","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Stream join","icon":"object-exclude"}]},{"id":"NXL11sNTvumIzKx0ftXR","title":"Outer stream joins","pathname":"/joule/components/processors/stream-join/outer-stream-joins","siteSpaceId":"sitesp_RbtDT","description":"Immediately pass the first event received and initialised downstream processors","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Stream join","icon":"object-exclude"}]},{"id":"TAbLVEHVrIIorWcoOPn2","title":"Join attributes & policy","pathname":"/joule/components/processors/stream-join/join-attributes-and-policy","siteSpaceId":"sitesp_RbtDT","description":"Join attributes to control and optimise performance","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Stream join","icon":"object-exclude"}]},{"id":"C1VTNhDayrjh0frgIEoo","title":"Event tap","pathname":"/joule/components/processors/event-tap","siteSpaceId":"sitesp_RbtDT","icon":"arrows-to-circle","description":"Tap events directly in to an in-memory database to enable on / offline processing","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"}]},{"id":"UnbJimBCkuwYNhjTYYrY","title":"Anatomy of a Tap","pathname":"/joule/components/processors/event-tap/anatomy-of-a-tap","siteSpaceId":"sitesp_RbtDT","description":"Construction of a Tap","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Event tap","icon":"arrows-to-circle"}]},{"id":"wTuTKPgFuqHhQnurBnxX","title":"SQL Queries","pathname":"/joule/components/processors/event-tap/sql-queries","siteSpaceId":"sitesp_RbtDT","description":"Use SQL queries to access the data in the store","breadcrumbs":[{"label":"Components"},{"label":"Processors","icon":"microchip"},{"label":"Event tap","icon":"arrows-to-circle"}]},{"id":"hBsvxKUoGFa4tGPRC21l","title":"Analytics","pathname":"/joule/components/analytics","siteSpaceId":"sitesp_RbtDT","icon":"chart-mixed-up-circle-dollar","description":"Analytics sit at the heart of the Joule platform, transforming raw data into actionable insights that drive real-world value","breadcrumbs":[{"label":"Components"}]},{"id":"y5uZ4PFaYPXNzCR7iNXs","title":"Analytic tools","pathname":"/joule/components/analytics/analytic-tools","siteSpaceId":"sitesp_RbtDT","icon":"trowel-bricks","description":"Define math expressions or provide as a file using Joule supported languages and APIs","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"}]},{"id":"ZDyj6VcFrqAXkhnq0IGu","title":"User defined analytics","pathname":"/joule/components/analytics/analytic-tools/user-defined-analytics","siteSpaceId":"sitesp_RbtDT","description":"Define analytic expressions or provide as a script using supported interpreted languages","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"}]},{"id":"dsCK1x2AWKkm3JquflXz","title":"Streaming analytics example","pathname":"/joule/components/analytics/analytic-tools/user-defined-analytics/streaming-analytics-example","siteSpaceId":"sitesp_RbtDT","description":"Example on how to run streaming analytics","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"User defined analytics"}]},{"id":"L9HLD7ClAb3sSUT2vp1w","title":"User defined analytics","pathname":"/joule/components/analytics/analytic-tools/user-defined-analytics/user-defined-analytics","siteSpaceId":"sitesp_RbtDT","description":"Declarative stateful math expressions evaluated in real-time","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"User defined analytics"}]},{"id":"vegNY3TCEJ01blEvkBpx","title":"User defined scripts","pathname":"/joule/components/analytics/analytic-tools/user-defined-analytics/user-defined-scripts","siteSpaceId":"sitesp_RbtDT","description":"Leverage pre-existing analytics scripts within a streaming context","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"User defined analytics"}]},{"id":"JoNIWW1oXRd5xVLJBoNp","title":"User defined functions","pathname":"/joule/components/analytics/analytic-tools/user-defined-analytics/user-defined-functions","siteSpaceId":"sitesp_RbtDT","description":"Extend the analytics ecosystem using the Analytics API","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"User defined analytics"}]},{"id":"S466JF3EVQkcfyHLeXLp","title":"Average function library","pathname":"/joule/components/analytics/analytic-tools/user-defined-analytics/user-defined-functions/average-function-library","siteSpaceId":"sitesp_RbtDT","description":"Joule math functions","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"User defined analytics"},{"label":"User defined functions"}]},{"id":"CPWivyPsu4kO2w8yF8Eq","title":"Window analytics","pathname":"/joule/components/analytics/analytic-tools/window-analytics","siteSpaceId":"sitesp_RbtDT","description":"Standard window functions are provided to perform event based analytics","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"}]},{"id":"fxlUUQI4TZyPYRJb99oI","title":"Tumbling window","pathname":"/joule/components/analytics/analytic-tools/window-analytics/tumbling-window","siteSpaceId":"sitesp_RbtDT","description":"Fixed-sized, non-overlapping window analytic function support","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Window analytics"}]},{"id":"JHFUW6RXG3r4RYDl8u39","title":"Sliding window","pathname":"/joule/components/analytics/analytic-tools/window-analytics/sliding-window","siteSpaceId":"sitesp_RbtDT","description":"Fixed-sized, overlapping time or event count window analytic function support","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Window analytics"}]},{"id":"1hDB41zoet7gqgh2e3tz","title":"Aggregate functions","pathname":"/joule/components/analytics/analytic-tools/window-analytics/aggregate-functions","siteSpaceId":"sitesp_RbtDT","description":"Standard statistics calculations for streaming event windows","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Window analytics"}]},{"id":"vcGkVVKXYqvgn1f5bW3S","title":"Analytic functions","pathname":"/joule/components/analytics/analytic-tools/analytic-functions","siteSpaceId":"sitesp_RbtDT","description":"Analytic functions perform complex calculation over a window of grouped events","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"}]},{"id":"rUgsEli0HUdRQeC2kVXu","title":"Stateful","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateful","siteSpaceId":"sitesp_RbtDT","description":"Stateful based analytics over a grouped set of events","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"}]},{"id":"C8l1NuScPLp6zomFyyky","title":"Exponential moving average","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateful/exponential-moving-average","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateful"}]},{"id":"AjutyhCuS2TKno9zMqGR","title":"Rolling Sum","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateful/rolling-sum","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateful"}]},{"id":"BWhyNAuE86yMdBHoQlBD","title":"Stateless","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless","siteSpaceId":"sitesp_RbtDT","description":"Stateless based analytics over a grouped set of events","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"}]},{"id":"qHnGlWf4pYiXJFLlaUuJ","title":"Normalisation","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation","siteSpaceId":"sitesp_RbtDT","description":"Change the distribution shape of your data","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"}]},{"id":"aJ4kdD4Zkfp0jMlIxDd4","title":"Absolute max","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation/absolute-max","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Normalisation"}]},{"id":"gWzxVxnr7VWic0ZOahRb","title":"Min max","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation/min-max","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Normalisation"}]},{"id":"6gew6z9I3eLuQLxGfgit","title":"Standardisation","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation/standardisation","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Normalisation"}]},{"id":"YvkjivLHzNLFuGCBpo2Q","title":"Mean","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation/mean","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Normalisation"}]},{"id":"ctNDf1fhQvhNvxgYGucP","title":"Log","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation/log","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Normalisation"}]},{"id":"vsawohs8OqUsgNKIYwNa","title":"Z-Score","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/normalisation/z-score","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Normalisation"}]},{"id":"TjFbFnGxOh6MSIWwUfm8","title":"Scaling","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/scaling","siteSpaceId":"sitesp_RbtDT","description":"Change the range of your data","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"}]},{"id":"rES5cFU4Vlrngeoz6JDj","title":"Unit scale","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/scaling/unit-scale","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Scaling"}]},{"id":"QzvRCEA8THmwyBrxl4So","title":"Robust Scale","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/scaling/robust-scale","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Scaling"}]},{"id":"UvHdTQNLWrUqVkDhKY92","title":"Statistics","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/statistics","siteSpaceId":"sitesp_RbtDT","description":"Key statistical functions and measures","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"}]},{"id":"ndjroVM65I8SHVle836N","title":"Statistic summaries","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/statistics/statistic-summaries","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Statistics"}]},{"id":"fSljVcgDascHp3yULTVo","title":"Weighted moving average","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/statistics/weighted-moving-average","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Statistics"}]},{"id":"4ajgdE0dQLPvlgPEMkhV","title":"Simple moving average","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/statistics/simple-moving-average","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Statistics"}]},{"id":"ZRHFfBdGonnCszrUS8e7","title":"Count","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/statistics/count","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"Statistics"}]},{"id":"pik8GSfCDiXRwiq0Y3kh","title":"General","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/general","siteSpaceId":"sitesp_RbtDT","description":"Utility and supporting analytic functions","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"}]},{"id":"b0zXI6Q7d9D1GfvlEcY3","title":"Euclidean","pathname":"/joule/components/analytics/analytic-tools/analytic-functions/stateless/general/euclidean","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Analytic functions"},{"label":"Stateless"},{"label":"General"}]},{"id":"b9y4piTe0XSjAEwFe2hm","title":"Advanced analytics","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics","siteSpaceId":"sitesp_RbtDT","description":"Advanced analytic processors such as geospatial tracking","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"}]},{"id":"cCrowyrL30VIDket1eyc","title":"Geospatial","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial","siteSpaceId":"sitesp_RbtDT","description":"Optimised real-time geospatial analytics for geofence occupancy and tracking","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"}]},{"id":"NzOZJeOgWzhjFn64JLBd","title":"Entity geo tracker","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial/entity-geo-tracker","siteSpaceId":"sitesp_RbtDT","description":"Real-time entity geo tracking for advanced use cases","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"},{"label":"Geospatial"}]},{"id":"AWj88xU7vp6Y3Kwaqg3J","title":"Geofence occupancy trigger","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial/geofence-occupancy-trigger","siteSpaceId":"sitesp_RbtDT","description":"Trigger geospatial events in real-time to drive location based use cases","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"},{"label":"Geospatial"}]},{"id":"XOGJzNlgfyLRQoTXHLI3","title":"Geo search","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial/geo-search","siteSpaceId":"sitesp_RbtDT","description":"Real-time view on what entities are nearby with respect to geofence radius","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"},{"label":"Geospatial"}]},{"id":"xaFoiXfKyWfKrJ6QQdPc","title":"IP address resolver","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial/ip-address-resolver","siteSpaceId":"sitesp_RbtDT","description":"Take an IP address and perform a geo location search","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"},{"label":"Geospatial"}]},{"id":"YbBWm1u6f4FdyCyA2GGe","title":"Reverse geocoding","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial/reverse-geocoding","siteSpaceId":"sitesp_RbtDT","description":"Google reverse geocode using longitude and latitude to street address","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"},{"label":"Geospatial"}]},{"id":"vfdA45ONYP9jiGzxugof","title":"Spatial Index","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/geospatial/spatial-index","siteSpaceId":"sitesp_RbtDT","description":"Optimised data structure for spatial search","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"},{"label":"Geospatial"}]},{"id":"AsYDoe2NmDzQEFWV4k9D","title":"HyperLogLog","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/hyperloglog","siteSpaceId":"sitesp_RbtDT","description":"Probabilistic counter for large or high cardinality datasets","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"}]},{"id":"Gq5ua03ydq6ozml37hEv","title":"Distinct counter","pathname":"/joule/components/analytics/analytic-tools/advanced-analytics/distinct-counter","siteSpaceId":"sitesp_RbtDT","description":"Calculate distinct field values over time","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Analytic tools","icon":"trowel-bricks"},{"label":"Advanced analytics"}]},{"id":"UJDE3Ic6aqM7CA5EcDjG","title":"ML inferencing","pathname":"/joule/components/analytics/ml-inferencing","siteSpaceId":"sitesp_RbtDT","icon":"microchip-ai","description":"Leverage streaming online predictions to drive insights to action","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"}]},{"id":"8Y2HZFgtwbYHxo32r1DN","title":"Feature engineering","pathname":"/joule/components/analytics/ml-inferencing/feature-engineering","siteSpaceId":"sitesp_RbtDT","description":"Decorate a feature vector with enriched features specific to the deployed model","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"}]},{"id":"lj6QZYI79MVPEIwoDQ0S","title":"Scripting","pathname":"/joule/components/analytics/ml-inferencing/feature-engineering/scripting","siteSpaceId":"sitesp_RbtDT","description":"Define custom analytics with declarative expressions","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"},{"label":"Feature engineering"}]},{"id":"bTw8FdxwbZdozDJtJtzU","title":"Scaling","pathname":"/joule/components/analytics/ml-inferencing/feature-engineering/scaling","siteSpaceId":"sitesp_RbtDT","description":"Normalise data with various scaling methods","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"},{"label":"Feature engineering"}]},{"id":"EsDedLMSj8G6ay41Lnys","title":"Transform","pathname":"/joule/components/analytics/ml-inferencing/feature-engineering/transform","siteSpaceId":"sitesp_RbtDT","description":"Generate analytics-ready features from data","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"},{"label":"Feature engineering"}]},{"id":"c0eOzb27UL7T9AVfY9zg","title":"Online predictive analytics","pathname":"/joule/components/analytics/ml-inferencing/online-predictive-analytics","siteSpaceId":"sitesp_RbtDT","description":"JPMML prediction processor evaluates event feature vectors in near-real-time","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"}]},{"id":"eO3fZ84yqwOU5ONqbJge","title":"Model audit","pathname":"/joule/components/analytics/ml-inferencing/model-audit","siteSpaceId":"sitesp_RbtDT","description":"Support explainability, detect drift, and manage retraining through model auditing","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"}]},{"id":"LBRxefAOE77wgrgflTUq","title":"Model management","pathname":"/joule/components/analytics/ml-inferencing/model-management","siteSpaceId":"sitesp_RbtDT","description":"Deploy a retrained model directly in to a running Joule with zero down time","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"ML inferencing","icon":"microchip-ai"}]},{"id":"1cZu0AexAVY10BO3JTia","title":"Metrics engine","pathname":"/joule/components/analytics/metrics-engine","siteSpaceId":"sitesp_RbtDT","icon":"square-root","description":"In-memory SQL compliant metrics engine for advance analytics solutions","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"}]},{"id":"0ZM9YLCBCyxAepVnA5dt","title":"Create metrics","pathname":"/joule/components/analytics/metrics-engine/create-metrics","siteSpaceId":"sitesp_RbtDT","description":"Define a set of time based metrics that are generated using captured and stored streamed events","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Metrics engine","icon":"square-root"}]},{"id":"OMHJXGCZ5e5IGpYH6Usw","title":"Apply metrics","pathname":"/joule/components/analytics/metrics-engine/apply-metrics","siteSpaceId":"sitesp_RbtDT","description":"Apply metrics within stream processing functions","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Metrics engine","icon":"square-root"}]},{"id":"vHMsc3LS0qAkvOmNjfCv","title":"Manage metrics","pathname":"/joule/components/analytics/metrics-engine/manage-metrics","siteSpaceId":"sitesp_RbtDT","description":"Reuse existing metrics on startup and reduce the operational memory overhead","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Metrics engine","icon":"square-root"}]},{"id":"Q8NnzPQybKEGrQ0LO7I8","title":"Priming metrics","pathname":"/joule/components/analytics/metrics-engine/priming-metrics","siteSpaceId":"sitesp_RbtDT","description":"Prime metrics with existing values on process startup","breadcrumbs":[{"label":"Components"},{"label":"Analytics","icon":"chart-mixed-up-circle-dollar"},{"label":"Metrics engine","icon":"square-root"}]},{"id":"gTaKcClwkGqDU6o3xmcM","title":"Contextual data","pathname":"/joule/components/contextual-data","siteSpaceId":"sitesp_RbtDT","icon":"head-side-virus","description":"Enrich real-time streams with contextual data","breadcrumbs":[{"label":"Components"}]},{"id":"rx9CgmlWby1ndCSLGvJv","title":"Architecture","pathname":"/joule/components/contextual-data/architecture","siteSpaceId":"sitesp_RbtDT","description":"Understand how Joule integrates to contextual data solutions","breadcrumbs":[{"label":"Components"},{"label":"Contextual data","icon":"head-side-virus"}]},{"id":"NkG49FjLrlUWX9YmaMbR","title":"Configuration","pathname":"/joule/components/contextual-data/configuration","siteSpaceId":"sitesp_RbtDT","description":"Set up a contextual data-driven use case","breadcrumbs":[{"label":"Components"},{"label":"Contextual data","icon":"head-side-virus"}]},{"id":"0amGD2we9haSJLLgSh7x","title":"MinIO S3","pathname":"/joule/components/contextual-data/minio-s3","siteSpaceId":"sitesp_RbtDT","description":"Multi-cloud S3-compatible interface for static contextual data and ML models","breadcrumbs":[{"label":"Components"},{"label":"Contextual data","icon":"head-side-virus"}]},{"id":"cVJtUknF23DxwuWO0YRK","title":"Apache Geode","pathname":"/joule/components/contextual-data/apache-geode","siteSpaceId":"sitesp_RbtDT","description":"High-performance caching platform for static and slow-moving contextual data","breadcrumbs":[{"label":"Components"},{"label":"Contextual data","icon":"head-side-virus"}]},{"id":"w7vTVc5FiVVoCLNJLTVl","title":"Connectors","pathname":"/joule/components/connectors","siteSpaceId":"sitesp_RbtDT","icon":"circle-nodes","description":"Out-of-the-box Joule provides key data connectors for streaming use cases","breadcrumbs":[{"label":"Components"}]},{"id":"VV1P7H5l7TZRXP9RnIGe","title":"Sources","pathname":"/joule/components/connectors/sources","siteSpaceId":"sitesp_RbtDT","icon":"database","description":"Connect to key event and file data sources","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"}]},{"id":"g5TeMEOuFj6mgCNOvTn7","title":"Kafka","pathname":"/joule/components/connectors/sources/kafka","siteSpaceId":"sitesp_RbtDT","description":"Standard Kafka consumers transport ingests data from subscribed cluster topics","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"YICfJp3tb7oE94o2KGj1","title":"Ingestion","pathname":"/joule/components/connectors/sources/kafka/ingestion","siteSpaceId":"sitesp_RbtDT","description":"Joule enables flexible Kafka data deserialisation for processing","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"},{"label":"Kafka"}]},{"id":"s4v5Tymvk7LN5G34Bidb","title":"RabbitMQ","pathname":"/joule/components/connectors/sources/rabbitmq","siteSpaceId":"sitesp_RbtDT","description":"AMQP messaging solution ideal for IoT and client / server use cases","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"ITWqgXvNA9WybBfsUreZ","title":"Further RabbitMQ configurations","pathname":"/joule/components/connectors/sources/rabbitmq/further-rabbitmq-configurations","siteSpaceId":"sitesp_RbtDT","description":"Further collection of examples using RabbitMQ","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"},{"label":"RabbitMQ"}]},{"id":"bfvsdDxfB6IwCZuaxLZ9","title":"MQTT","pathname":"/joule/components/connectors/sources/mqtt","siteSpaceId":"sitesp_RbtDT","description":"Lightweight messaging protocol ideal for IoT use cases","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"dgHQJW6yAjeQyejCZmPl","title":"Topic wildcards","pathname":"/joule/components/connectors/sources/mqtt/topic-wildcards","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"},{"label":"MQTT"}]},{"id":"n6bVqzkmJa1cEJUSS48s","title":"Session management","pathname":"/joule/components/connectors/sources/mqtt/session-management","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"},{"label":"MQTT"}]},{"id":"OTWEzloJ7UU4e9WXSRWb","title":"Last Will and Testament","pathname":"/joule/components/connectors/sources/mqtt/last-will-and-testament","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"},{"label":"MQTT"}]},{"id":"ydyxcKmpbswnrAiFjhL2","title":"Rest endpoints","pathname":"/joule/components/connectors/sources/rest-endpoints","siteSpaceId":"sitesp_RbtDT","description":"RESTful consumer endpoints designed to facilitate seamless integration","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"zQyiXSTFGWT9PQr9Irst","title":"MinIO S3","pathname":"/joule/components/connectors/sources/minio-s3","siteSpaceId":"sitesp_RbtDT","description":"MinIO S3 file consumer for cloud or local hosted bucket storage","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"w4BR3rxFFnSiAjYTV8T9","title":"Google sheets","pathname":"/joule/components/connectors/sources/google-sheets","siteSpaceId":"sitesp_RbtDT","description":"Spreadsheet data consumer designed to extend processing capabilites","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"wV996jVkPHvNeSeazS4H","title":"File watcher","pathname":"/joule/components/connectors/sources/file-watcher","siteSpaceId":"sitesp_RbtDT","description":"Process large files using stream processing","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sources","icon":"database"}]},{"id":"1WswysHh2afn2BGijRG0","title":"Sinks","pathname":"/joule/components/connectors/sinks","siteSpaceId":"sitesp_RbtDT","icon":"nfc-symbol","description":"Distribute insights to consuming systems","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"}]},{"id":"rqcYSN7GMycrKlqAInQu","title":"Kafka","pathname":"/joule/components/connectors/sinks/kafka","siteSpaceId":"sitesp_RbtDT","description":"Sends events to specified Kafka topics, enabling real-time data streams","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"lzI5n3exrUCR2W0ELPp8","title":"RabbitMQ","pathname":"/joule/components/connectors/sinks/rabbitmq","siteSpaceId":"sitesp_RbtDT","description":"RabbitMQ is lightweight and easy to deploy messaging platform for event-based data integration","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"57YVl81nUjtn6LvFyU1V","title":"Further configurations","pathname":"/joule/components/connectors/sinks/rabbitmq/further-configurations","siteSpaceId":"sitesp_RbtDT","description":"Further RabbitMQ distribution configurations","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"},{"label":"RabbitMQ"}]},{"id":"fA0OkA4isZRg1VQFENsQ","title":"MQTT","pathname":"/joule/components/connectors/sinks/mqtt","siteSpaceId":"sitesp_RbtDT","description":"Allows publishing events through MQTT, ideal for IoT and lightweight streaming","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"VOEhOqlxDE19KZpSqT3d","title":"Persistent messaging","pathname":"/joule/components/connectors/sinks/mqtt/persistent-messaging","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"},{"label":"MQTT"}]},{"id":"gnNjykygCyYT3Zpyz1jY","title":"Last Will and Testament","pathname":"/joule/components/connectors/sinks/mqtt/last-will-and-testament","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"},{"label":"MQTT"}]},{"id":"HHLPCOxzpAhXSPz7Qb7R","title":"SQL databases","pathname":"/joule/components/connectors/sinks/sql-databases","siteSpaceId":"sitesp_RbtDT","description":"Write events in micro batches to any database which supports JDBC Type 4 drivers","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"RD6N1rG8ZWyg4L05KFzM","title":"InfluxDB","pathname":"/joule/components/connectors/sinks/influxdb","siteSpaceId":"sitesp_RbtDT","description":"Standard time-series database idea for instrumentation or live KPI tracking","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"7LNqs5nJQCt4D8pqvSxr","title":"MongoDB","pathname":"/joule/components/connectors/sinks/mongodb","siteSpaceId":"sitesp_RbtDT","description":"Publish JSON based events to the mature standard document storePublishes JSON-based events to MongoDB, a widely-used document store","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"wHXKnatzNILtmEFBLDqh","title":"Geode","pathname":"/joule/components/connectors/sinks/geode","siteSpaceId":"sitesp_RbtDT","description":"Integrate with distributed caching for complex use cases needing high availability","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"CMJZBPKboV7Lxxw2nkJQ","title":"WebSocket","pathname":"/joule/components/connectors/sinks/websocket","siteSpaceId":"sitesp_RbtDT","description":"Publishes processed events to web clients via WebSocket transport, ideal for real-time dashboards and applications","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"qwY9IfiRLwaIteXXzdV8","title":"Google sheets","pathname":"/joule/components/connectors/sinks/google-sheets","siteSpaceId":"sitesp_RbtDT","description":"Spreadsheet data publisher designed to extend processing capabilites","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"ax9h1poG99eOdMM9TAAS","title":"MinIO S3","pathname":"/joule/components/connectors/sinks/minio-s3","siteSpaceId":"sitesp_RbtDT","description":"MinIO file producer using S3 cloud or local hosted buckets","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"PTvhdIrNX03vykGp01w1","title":"Custom connectors","pathname":"/joule/components/connectors/sinks/custom-connectors","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"}]},{"id":"BAncsVbsKVDZRhV465Jq","title":"File","pathname":"/joule/components/connectors/sinks/custom-connectors/file","siteSpaceId":"sitesp_RbtDT","icon":"file","description":"Write events directly to files for archiving and offline processing","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"},{"label":"Custom connectors"}]},{"id":"BJcMxKNXqPkxxYvfBt9l","title":"Slack","pathname":"/joule/components/connectors/sinks/custom-connectors/slack","siteSpaceId":"sitesp_RbtDT","icon":"slack","description":"Send critical alerts to a monitored Slack channel","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"},{"label":"Custom connectors"}]},{"id":"HBub8PonxG11oRggGXd0","title":"Email","pathname":"/joule/components/connectors/sinks/custom-connectors/email","siteSpaceId":"sitesp_RbtDT","icon":"envelope","description":"Send critical email alerts to key stakeholders","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Sinks","icon":"nfc-symbol"},{"label":"Custom connectors"}]},{"id":"DQqc1mlRl4uxkES2uCMg","title":"Serialisers","pathname":"/joule/components/connectors/serialisers","siteSpaceId":"sitesp_RbtDT","icon":"binary-circle-check","description":"Get data ready for consumption serialising incoming and outgoing data","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"}]},{"id":"miyhMElxCDdwYCoBYMz6","title":"Serialisation","pathname":"/joule/components/connectors/serialisers/serialisation","siteSpaceId":"sitesp_RbtDT","description":"Data emitted to downstream systems is serialised using provided or custom serialisers","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Serialisers","icon":"binary-circle-check"}]},{"id":"4Vd4p7sW1RtdoY0csfvo","title":"Custom transform example","pathname":"/joule/components/connectors/serialisers/serialisation/custom-transform-example","siteSpaceId":"sitesp_RbtDT","description":"Custom parser converts an internal Joule StreamEvent into a domain object","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Serialisers","icon":"binary-circle-check"},{"label":"Serialisation"}]},{"id":"uYWuxNFFkZL4px2Dzw3g","title":"Formatters","pathname":"/joule/components/connectors/serialisers/serialisation/formatters","siteSpaceId":"sitesp_RbtDT","description":"Apply standard data format process to outgoing data","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Serialisers","icon":"binary-circle-check"},{"label":"Serialisation"}]},{"id":"OJh0w8XOX2w5Nm4qQHSh","title":"Deserialisers","pathname":"/joule/components/connectors/serialisers/deserialisers","siteSpaceId":"sitesp_RbtDT","description":"Consumed data is mapped to internal StreamEvents using a flexible deserialisation framework","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Serialisers","icon":"binary-circle-check"}]},{"id":"H2F1RgxGOWkRZ6mR0Wpp","title":"Custom parsing example","pathname":"/joule/components/connectors/serialisers/deserialisers/custom-parsing-example","siteSpaceId":"sitesp_RbtDT","description":"Custom parser converts a domain Quote object into an internal Joule StreamEvent","breadcrumbs":[{"label":"Components"},{"label":"Connectors","icon":"circle-nodes"},{"label":"Serialisers","icon":"binary-circle-check"},{"label":"Deserialisers"}]},{"id":"PFkbXaGehjgfIQAu4SYA","title":"Observability","pathname":"/joule/components/observability","siteSpaceId":"sitesp_RbtDT","icon":"eye","description":"Joule uses JMX and Metrics API to make processes observable and to enable monitoring","breadcrumbs":[{"label":"Components"}]},{"id":"1R4AnRrqt5NW64dbeKQm","title":"Enabling JMX for Joule","pathname":"/joule/components/observability/enabling-jmx-for-joule","siteSpaceId":"sitesp_RbtDT","description":"Activate JMX monitoring for Joule with configurable settings","breadcrumbs":[{"label":"Components"},{"label":"Observability","icon":"eye"}]},{"id":"smuPDqddiByUXUbh6cSH","title":"Meters","pathname":"/joule/components/observability/meters","siteSpaceId":"sitesp_RbtDT","description":"Automated metrics monitor for Joule pipelines: data pipelines, processors, transport, storage","breadcrumbs":[{"label":"Components"},{"label":"Observability","icon":"eye"}]},{"id":"tZThBjmCZRUD8sWO59CB","title":"Metrics API","pathname":"/joule/components/observability/metrics-api","siteSpaceId":"sitesp_RbtDT","description":"Tracks component events and data flow with counters","breadcrumbs":[{"label":"Components"},{"label":"Observability","icon":"eye"}]},{"id":"ADz1Fd79JiWt4WZkLj47","title":"Setting up developer environment","pathname":"/joule/developer-guides/setting-up-developer-environment","siteSpaceId":"sitesp_RbtDT","icon":"screwdriver-wrench","description":"Setting up Joule environment for seamless data processing applications","breadcrumbs":[{"label":"DEVELOPER GUIDES"}]},{"id":"WCQUu1DhErIGkaotFFHk","title":"Environment setup","pathname":"/joule/developer-guides/setting-up-developer-environment/environment-setup","siteSpaceId":"sitesp_RbtDT","description":"Detailed prerequisites for the environment","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"}]},{"id":"tdLxuwLJMr8Rk0ezYT3C","title":"Build and deploy","pathname":"/joule/developer-guides/setting-up-developer-environment/build-and-deploy","siteSpaceId":"sitesp_RbtDT","description":"Define components, build, test, package, deploy project","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"}]},{"id":"jExlgBRsgUbT5j8qfGbi","title":"Install Joule","pathname":"/joule/developer-guides/setting-up-developer-environment/install-joule","siteSpaceId":"sitesp_RbtDT","description":"Joule Docker images, installation, custom builds and examples","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"}]},{"id":"h2SPujHj3UGtL4hYdDqQ","title":"Install Docker demo environment","pathname":"/joule/developer-guides/setting-up-developer-environment/install-joule/install-docker-demo-environment","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"},{"label":"Install Joule"}]},{"id":"EJv8ai45htYuA6grzm2J","title":"Install with Docker","pathname":"/joule/developer-guides/setting-up-developer-environment/install-joule/install-with-docker","siteSpaceId":"sitesp_RbtDT","description":"Use prebuilt images for quick setup","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"},{"label":"Install Joule"}]},{"id":"T5nXYiSNpaBjkl6b6ViH","title":"Install from source","pathname":"/joule/developer-guides/setting-up-developer-environment/install-joule/install-from-source","siteSpaceId":"sitesp_RbtDT","description":"Install Joule from source, connectors, and processors locally","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"},{"label":"Install Joule"}]},{"id":"03YVArdjLzc8NWEOW7MS","title":"Install Joule examples","pathname":"/joule/developer-guides/setting-up-developer-environment/install-joule/install-joule-examples","siteSpaceId":"sitesp_RbtDT","description":"Clone Joule examples from GitLab, build, explore updates.","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Setting up developer environment","icon":"screwdriver-wrench"},{"label":"Install Joule"}]},{"id":"6zPG7ejHVIIcAib8ScA7","title":"Joulectl CLI","pathname":"/joule/developer-guides/joulectl-cli","siteSpaceId":"sitesp_RbtDT","icon":"square-terminal","description":"Use Joulectl to deploy and manage use cases within the Joule platform","breadcrumbs":[{"label":"DEVELOPER GUIDES"}]},{"id":"PhB9Pg1QyEDm89iKBwwE","title":"API Endpoints","pathname":"/joule/developer-guides/api-endpoints","siteSpaceId":"sitesp_RbtDT","icon":"gear-complex-code","description":"Joule REST APIs enables easy custom data processing and integration","breadcrumbs":[{"label":"DEVELOPER GUIDES"}]},{"id":"zZUiaZeel4zFCq6hdNJ6","title":"Mangement API","pathname":"/joule/developer-guides/api-endpoints/mangement-api","siteSpaceId":"sitesp_RbtDT","description":"Manages applications and integrations, providing endpoints for deployment, pipeline management, connector registration and contextual data sources","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"}]},{"id":"EL0K5iMvfzmqjuvV9HjK","title":"Use case","pathname":"/joule/developer-guides/api-endpoints/mangement-api/use-case","siteSpaceId":"sitesp_RbtDT","icon":"list","description":"Deploy, pause, resume and undeploy use cases","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Mangement API"}]},{"id":"FwphFZppNyewjI3i94CZ","title":"Pipelines","pathname":"/joule/developer-guides/api-endpoints/mangement-api/pipelines","siteSpaceId":"sitesp_RbtDT","icon":"person-from-portal","description":"Register, list, detail and unregister stream processing pipelines","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Mangement API"}]},{"id":"2e3yR6IcFxgGOn2WO73N","title":"Data connectors","pathname":"/joule/developer-guides/api-endpoints/mangement-api/data-connectors","siteSpaceId":"sitesp_RbtDT","icon":"pipe-collar","description":"Register, list, detail and unregister data sources and sinks","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Mangement API"}]},{"id":"N1V60qWJA4qAZ4odsnaK","title":"Contextual data","pathname":"/joule/developer-guides/api-endpoints/mangement-api/contextual-data","siteSpaceId":"sitesp_RbtDT","icon":"head-side-brain","description":"Register, list, detail and unregister contextual data sources","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Mangement API"}]},{"id":"vdG5Mxh1ZNIxSHpyDiPf","title":"Data access API","pathname":"/joule/developer-guides/api-endpoints/data-access-api","siteSpaceId":"sitesp_RbtDT","description":"Enables data interactions, allowing for querying, publishing and consuming data events","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"}]},{"id":"Y6TZyeSppcCDRouzzFbe","title":"Query","pathname":"/joule/developer-guides/api-endpoints/data-access-api/query","siteSpaceId":"sitesp_RbtDT","icon":"arrow-progress","description":"Fetch, export, delete and subscribe to data","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Data access API"}]},{"id":"3WAkoxYMDFb0pBgNhBwN","title":"Upload","pathname":"/joule/developer-guides/api-endpoints/data-access-api/upload","siteSpaceId":"sitesp_RbtDT","icon":"chevrons-up","description":"Upload files and stream events in to a running Joule process","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Data access API"}]},{"id":"czfKLIthZIoRY7aGvaw3","title":"WebSocket","pathname":"/joule/developer-guides/api-endpoints/data-access-api/websocket","siteSpaceId":"sitesp_RbtDT","icon":"plug","description":"Subscribe to events from a WebSocket","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"},{"label":"Data access API"}]},{"id":"wYquU0o0nq28WYbm6OgI","title":"SQL support","pathname":"/joule/developer-guides/api-endpoints/sql-support","siteSpaceId":"sitesp_RbtDT","description":"This is an incubating feature which is constantly being refined and extended","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"API Endpoints","icon":"gear-complex-code"}]},{"id":"bVF1IODFf2KCQhDz0e8I","title":"Builder SDK","pathname":"/joule/developer-guides/builder-sdk","siteSpaceId":"sitesp_RbtDT","icon":"uikit","description":"Joule SDK APIs enable connectors, processing, analytics and transformations","breadcrumbs":[{"label":"DEVELOPER GUIDES"}]},{"id":"qSHPKIshea5cL6iRQPbj","title":"Connector API","pathname":"/joule/developer-guides/builder-sdk/connector-api","siteSpaceId":"sitesp_RbtDT","description":"Connectors are key to enable Joule to perform use cases. Given the importance of Connectors, an API has been provided to enable developers to build and extend the capabilities of the platform.","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"}]},{"id":"IvdRYWbCuDYZwacQpkOo","title":"Sources","pathname":"/joule/developer-guides/builder-sdk/connector-api/sources","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Connector API"}]},{"id":"IIdja3WzGvUNRU4jDCN0","title":"StreamEventParser API","pathname":"/joule/developer-guides/builder-sdk/connector-api/sources/streameventparser-api","siteSpaceId":"sitesp_RbtDT","description":"Custom parser converts a domain Quote object into an internal Joule StreamEvent","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Connector API"},{"label":"Sources"}]},{"id":"KZXmOXdeqTZSBXE6CnpI","title":"Sinks","pathname":"/joule/developer-guides/builder-sdk/connector-api/sinks","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Connector API"}]},{"id":"9rsc81Pj8ndGjpq7A6zg","title":"CustomTransformer API","pathname":"/joule/developer-guides/builder-sdk/connector-api/sinks/customtransformer-api","siteSpaceId":"sitesp_RbtDT","description":"Custom parser converts an internal Joule StreamEvent into a domain object","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Connector API"},{"label":"Sinks"}]},{"id":"UfoOCdNt6w8RFPpXu2pf","title":"Processor API","pathname":"/joule/developer-guides/builder-sdk/processor-api","siteSpaceId":"sitesp_RbtDT","description":"Processors form the core of the joule platform. Given the importance of Processors, an API has been provided to enable developers to build and extend the capabilities of the platform.","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"}]},{"id":"lmEjyreXQ0p8u2k3kWTM","title":"Analytics API","pathname":"/joule/developer-guides/builder-sdk/analytics-api","siteSpaceId":"sitesp_RbtDT","description":"Analytics form the core of the platform to drive insight to value. Joule provides various methods to define and leverage analytics within a streaming context","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"}]},{"id":"4SyMuRloQZD7E2n08u01","title":"Create custom metrics","pathname":"/joule/developer-guides/builder-sdk/analytics-api/create-custom-metrics","siteSpaceId":"sitesp_RbtDT","description":"Add pre-computed metrics to custom processors that drive advanced analytic use cases","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Analytics API"}]},{"id":"43AYl04mxo8BESTX6eey","title":"Define analytics","pathname":"/joule/developer-guides/builder-sdk/analytics-api/define-analytics","siteSpaceId":"sitesp_RbtDT","description":"Create custom analytic functions for window processing that drive advanced analytic use cases","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Analytics API"}]},{"id":"9cX39R9jbWNIx0keRDnu","title":"Windows API","pathname":"/joule/developer-guides/builder-sdk/analytics-api/windows-api","siteSpaceId":"sitesp_RbtDT","description":"Customise and extend Joule analytics capability using the Windows API","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Analytics API"}]},{"id":"aPFl8ej6tN5S0Qd8QFT9","title":"SQL queries","pathname":"/joule/developer-guides/builder-sdk/analytics-api/sql-queries","siteSpaceId":"sitesp_RbtDT","description":"Leverage the power of ANSI SQL within custom processors using the in-memory database","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Analytics API"}]},{"id":"ETgUUUzcbsGRh21p1xHu","title":"Transformation API","pathname":"/joule/developer-guides/builder-sdk/transformation-api","siteSpaceId":"sitesp_RbtDT","description":"","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"}]},{"id":"PbrpIUteq2dFo1ZNOEJH","title":"Obfuscation API","pathname":"/joule/developer-guides/builder-sdk/transformation-api/obfuscation-api","siteSpaceId":"sitesp_RbtDT","description":"Use the Obfuscation API to meet your requirements","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Transformation API"}]},{"id":"tZyDdqU8MI690vTEVimH","title":"FieldTokenizer API","pathname":"/joule/developer-guides/builder-sdk/transformation-api/fieldtokenizer-api","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Transformation API"}]},{"id":"wvXh02PwP1V7iEMwmAcV","title":"File processing","pathname":"/joule/developer-guides/builder-sdk/file-processing","siteSpaceId":"sitesp_RbtDT","description":"Joule provides utility classes to load large files efficiently","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"}]},{"id":"zyI0yIoZPinw8PukkDSo","title":"Data types","pathname":"/joule/developer-guides/builder-sdk/data-types","siteSpaceId":"sitesp_RbtDT","description":"Key data types available within the Joule platform","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"}]},{"id":"s16kmef6jMqPHvX22Zup","title":"StreamEvent","pathname":"/joule/developer-guides/builder-sdk/data-types/streamevent","siteSpaceId":"sitesp_RbtDT","description":"StreamEvent enables flexible, efficient event-driven data processing in Joule","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Data types"}]},{"id":"fBCARp3hs0REBtAX9rzX","title":"ReferenceDataObject","pathname":"/joule/developer-guides/builder-sdk/data-types/referencedataobject","siteSpaceId":"sitesp_RbtDT","description":"ReferenceDataObject stores, queries, and manages contextual reference data","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Data types"}]},{"id":"GymvAThMWK8Y0DDGGnQc","title":"GeoNode","pathname":"/joule/developer-guides/builder-sdk/data-types/geonode","siteSpaceId":"sitesp_RbtDT","description":"Geospatial data structure for location-based spatial entity analysis","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"Builder SDK","icon":"uikit"},{"label":"Data types"}]},{"id":"8hZAMPJnJ5M7RV9mErF1","title":"System configuration","pathname":"/joule/developer-guides/system-configuration","siteSpaceId":"sitesp_RbtDT","icon":"badge-check","breadcrumbs":[{"label":"DEVELOPER GUIDES"}]},{"id":"BEopnSEvZWrzOZlcPZVt","title":"System properties","pathname":"/joule/developer-guides/system-configuration/system-properties","siteSpaceId":"sitesp_RbtDT","icon":"rectangles-mixed","description":"Configure and enable core Joule features based on deployment needs","breadcrumbs":[{"label":"DEVELOPER GUIDES"},{"label":"System configuration","icon":"badge-check"}]},{"id":"NrZL48DA3jRF614o4z4H","title":"Deployment Overview","pathname":"/joule/deployment-strategies/deployment-overview","siteSpaceId":"sitesp_RbtDT","icon":"file-magnifying-glass","breadcrumbs":[{"label":"Deployment strategies"}]},{"id":"aCIjwWVd4mwfsEKOPicb","title":"Single Node","pathname":"/joule/deployment-strategies/single-node","siteSpaceId":"sitesp_RbtDT","icon":"codepen","breadcrumbs":[{"label":"Deployment strategies"}]},{"id":"kVpwJwcQyPY6CivJE34k","title":"Cluster","pathname":"/joule/deployment-strategies/cluster","siteSpaceId":"sitesp_RbtDT","icon":"cubes","breadcrumbs":[{"label":"Deployment strategies"}]},{"id":"Iv0828h71ZP2RG1mrm5o","title":"GuardianDB","pathname":"/joule/deployment-strategies/guardiandb","siteSpaceId":"sitesp_RbtDT","icon":"database","description":"Centralised deployment registry","breadcrumbs":[{"label":"Deployment strategies"}]},{"id":"axtWe9PaYU8fL4sI2MGb","title":"Packaging","pathname":"/joule/deployment-strategies/packaging","siteSpaceId":"sitesp_RbtDT","breadcrumbs":[{"label":"Deployment strategies"}]},{"id":"ycZdcnmqw7b78Flhgz5u","title":"Containers","pathname":"/joule/deployment-strategies/packaging/containers","siteSpaceId":"sitesp_RbtDT","icon":"docker","breadcrumbs":[{"label":"Deployment strategies"},{"label":"Packaging"}]},{"id":"UjFErYNMYyrKgX5Zo3lR","title":"Bare metal","pathname":"/joule/deployment-strategies/packaging/bare-metal","siteSpaceId":"sitesp_RbtDT","icon":"gear-code","breadcrumbs":[{"label":"Deployment strategies"},{"label":"Packaging"}]},{"id":"eSU3qr4R4QdlbB0yYq3H","title":"Public Roadmap","pathname":"/joule/product-updates/public-roadmap","siteSpaceId":"sitesp_RbtDT","icon":"scribble","breadcrumbs":[{"label":"Product updates"}]},{"id":"sCLIikrwmojpJYlMczwU","title":"Release Notes","pathname":"/joule/product-updates/release-notes","siteSpaceId":"sitesp_RbtDT","icon":"code-commit","breadcrumbs":[{"label":"Product updates"}]},{"id":"xSrUSwt58LKxRhPWtFTU","title":"v1.2.0 Join Streams with stateful analytics","pathname":"/joule/product-updates/release-notes/v1.2.0-join-streams-with-stateful-analytics","siteSpaceId":"sitesp_RbtDT","description":"Join real-time stream events for advance state based analytics and customer centric insights","breadcrumbs":[{"label":"Product updates"},{"label":"Release Notes","icon":"code-commit"}]},{"id":"VTnZsfkerBTSvceM0Q5C","title":"v1.1.0 Streaming analytics enhancements","pathname":"/joule/product-updates/release-notes/v1.1.0-streaming-analytics-enhancements","siteSpaceId":"sitesp_RbtDT","description":"Build streaming analytics pipelines powered by machine learning, metrics and reference data using live data","breadcrumbs":[{"label":"Product updates"},{"label":"Release Notes","icon":"code-commit"}]},{"id":"uZRWHiwRVKBX27SqxckU","title":"v1.0.4 Predictive stream processing","pathname":"/joule/product-updates/release-notes/v1.0.4-predictive-stream-processing","siteSpaceId":"sitesp_RbtDT","description":"A solid foundation for streaming ML predictions platform","breadcrumbs":[{"label":"Product updates"},{"label":"Release Notes","icon":"code-commit"}]},{"id":"kBbRMY9WvUdv4atv4Qee","title":"v1.0.3 Contextual SQL based metrics","pathname":"/joule/product-updates/release-notes/v1.0.3-contextual-sql-based-metrics","siteSpaceId":"sitesp_RbtDT","description":"Define SQL based metrics to drive advanced use case insights","breadcrumbs":[{"label":"Product updates"},{"label":"Release Notes","icon":"code-commit"}]},{"id":"WfRNBKeIcotzg6EJ5bat","title":"Change history","pathname":"/joule/product-updates/change-history","siteSpaceId":"sitesp_RbtDT","icon":"arrows-rotate-reverse","description":"","breadcrumbs":[{"label":"Product updates"}]}]}