#greyscale");filter:url("data:image/svg+xml;utf8, #greyscale");filter:grey;-webkit-filter:greyscale(100%);-webkit-backface-visibility:hidden;}.shadow-light{-moz-box-shadow:0 10px 20px 0 rgba(152,162,179,0.1),0 2px 6px 0 rgba(152,162,179,0.25) !important;-webkit-box-shadow:0 10px 20px 0 rgba(152,162,179,0.1),0 2px 6px 0 rgba(152,162,179,0.25) !important;-o-box-shadow:0 10px 20px 0 rgba(152,162,179,0.1),0 2px 6px 0 rgba(152,162,179,0.25) !important;-ms-box-shadow:0 10px 20px 0 rgba(152,162,179,0.1),0 2px 6px 0 rgba(152,162,179,0.25) !important;box-shadow:0 10px 20px 0 rgba(152,162,179,0.1),0 2px 6px 0 rgba(152,162,179,0.25) !important;}.shadow-dark{-moz-box-shadow:0 10px 20px 0 rgba(83,89,102,0.1),0 2px 6px 0 rgba(83,89,102,0.25) !important;-webkit-box-shadow:0 10px 20px 0 rgba(83,89,102,0.1),0 2px 6px 0 rgba(83,89,102,0.25) !important;-o-box-shadow:0 10px 20px 0 rgba(83,89,102,0.1),0 2px 6px 0 rgba(83,89,102,0.25) !important;-ms-box-shadow:0 10px 20px 0 rgba(83,89,102,0.1),0 2px 6px 0 rgba(83,89,102,0.25) !important;box-shadow:0 10px 20px 0 rgba(83,89,102,0.1),0 2px 6px 0 rgba(83,89,102,0.25) !important;}figure{margin:0;text-align:center;}figure i,.border-circle{background-position:center center;background-repeat:no-repeat;background-size:120% auto;display:block;height:170px;margin:0 auto;overflow:hidden;width:170px;border-top:6px solid #ccc;border-right:6px solid #ccc;border-bottom:6px solid #ccc;border-left:6px solid #ccc;-webkit-border-radius:340px;-moz-border-radius:340px;-ms-border-radius:340px;border-radius:340px;}figcaption{text-align:center;font-size:14px;line-height:24px;font-style:italic;}.circle-bg{background:#fff;-webkit-border-radius:104px;-moz-border-radius:104px;-ms-border-radius:104px;border-radius:104px;-moz-box-shadow:0px 2px 5px rgba(0,0,0,0.2);-webkit-box-shadow:0px 2px 5px rgba(0,0,0,0.2);-o-box-shadow:0px 2px 5px rgba(0,0,0,0.2);-ms-box-shadow:0px 2px 5px rgba(0,0,0,0.2);box-shadow:0px 2px 5px rgba(0,0,0,0.2);width:104px;height:104px;position:relative;display:inline-block;z-index:1;}.circle-bg img{bottom:0;height:70%;left:0;margin:auto;position:absolute;right:0;top:0;width:70%;}.circle-bg:before{content:" ";vertical-align:middle;height:100%;}.circle-bg .graph-img-center{left:6px;}.image-32-icon{height:32px !important;margin:0 0 16px !important;width:32px !important;}.image-64-icon{height:64px !important;margin:0 auto 16px !important;width:64px !important;}.onlyFadeIn{-webkit-animation:onlyFadeIn 1s;animation:onlyFadeIn 1s;}@-webkit-keyframes onlyFadeIn{0%{opacity:0;}100%{opacity:1;}}@keyframes onlyFadeIn{0%{opacity:0;}100%{opacity:1;}}.img-overflow{max-width:100%;height:auto;}@media (min-width:992px){.img-overflow{max-width:unset;max-height:500px;}}.embed-container iframe,.video iframe{border:0;height:287px;width:100%;}.play-icon{bottom:0;display:block;height:50px;left:0;margin:auto;position:absolute;right:0;top:0;z-index:2;}.video-thumb{position:relative;display:inline-block;max-width:100%;border-radius:10px;overflow:hidden;}.video-thumb .play-btn{bottom:0;height:64px;left:0;margin:auto;position:absolute;right:0;top:0;width:64px;}@media screen and (max-width:600px){.video-thumb{max-width:295px;}}.video-content-wrapper h3{color:var(--color-dark-blue);}.video-content-wrapper h3 a{color:var(--color-dark-blue);}.right-arrow{background-image:url(/static-res/images/right-blue-arrow.png);background-repeat:no-repeat;background-position:right 4px;padding-right:25px !important;color:#00a9e5;font-size:16px;display:inline-block;}.right-arrow:hover{color:#00a9e5;}.right-arrow .upgrade-icon{background-image:url(/static-res/images/refresh-icon.svg);background-repeat:no-repeat;background-position:0px 0px;display:inline-block;height:17px;padding-left:28px;vertical-align:middle;}.right-arrow:before{content:" ";vertical-align:middle;height:100%;}.right-arrow .graph-img-center{left:6px;}.checkmark{height:63px;width:63px;}.position-relative{position:relative;}.position-absolute{position:absolute;}@media screen and (min-width:768px) and (max-width:991px){.container{max-width:100% !important;}}@media screen and (max-width:767px){.container{width:100%;max-width:unset;}.common-container{width:100%;}.no-gutters{margin-right:0;margin-left:0;}.no-gutters>[class*=col-]{padding-right:0;padding-left:0;}}@media screen and (max-width:480px){.table-responsive table,.table-responsive table td{border:1px solid #ccc;}.table-responsive table th,.table-responsive table td th{text-align:center;font-weight:600;font-size:13px;}.table-responsive table td,.table-responsive table td td{padding:5px;font-size:13px;line-height:18px;}.table-responsive table td p a{font-size:13px;line-height:18px;}}a{color:var(--link-color);-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out;text-decoration:underline;font-weight:600;}a:hover,a:focus{color:var(--link-hover-color);text-decoration:underline;box-shadow:none !important;}a.whiteurl{color:var(--color-white);}a.stretched-link:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background:transparent !important;background-color:rgba(0,0,0,0);}.btn-tertiary,.cta-link,a.btn-tertiary:not([href]):not([tabindex]){cursor:pointer;display:inline-block;text-decoration:none;color:var(--button-tertiary-color);font-weight:600;}.btn-tertiary svg,.cta-link svg,a.btn-tertiary:not([href]):not([tabindex]) svg{-webkit-transition:all 100ms ease-in;transition:all 100ms ease-in;left:8px;position:relative;height:inherit;}.btn-tertiary svg path,.cta-link svg path,a.btn-tertiary:not([href]):not([tabindex]) svg path{stroke:var(--button-tertiary-color);}.btn-tertiary:hover,.cta-link:hover,a.btn-tertiary:not([href]):not([tabindex]):hover{text-decoration:none;color:var(--button-tertiary-hover-color);}.btn-tertiary:hover svg,.cta-link:hover svg,a.btn-tertiary:not([href]):not([tabindex]):hover svg{left:14px;}.btn-tertiary:hover svg path,.cta-link:hover svg path,a.btn-tertiary:not([href]):not([tabindex]):hover svg path{stroke:var(--button-tertiary-hover-color);}.btn-tertiary:focus-visible,.cta-link:focus-visible,a.btn-tertiary:not([href]):not([tabindex]):focus-visible{text-decoration:none;color:var(--button-tertiary-hover-color);outline:2px solid var(--button-tertiary-active-offset-color);outline-offset:4px;border-radius:4px;padding-right:12px;}.btn-tertiary:focus-visible svg,.cta-link:focus-visible svg,a.btn-tertiary:not([href]):not([tabindex]):focus-visible svg{stroke:var(--button-tertiary-hover-color);}.btn-tertiary:focus-visible svg path,.cta-link:focus-visible svg path,a.btn-tertiary:not([href]):not([tabindex]):focus-visible svg path{stroke:var(--button-tertiary-hover-color);}.gdpr-text{margin-top:10px;}.gdpr-text p{font-size:12px;line-height:18px;opacity:1;}#marketo-fe-form{position:relative;}#marketo-fe-form .mktoForm{position:relative;width:100% !important;}#marketo-fe-form .mktoForm .mktoOffset{display:none;}#marketo-fe-form .mktoForm .mktoLabel,#marketo-fe-form .mktoForm legend{font-size:14px;font-weight:600;line-height:24px !important;text-align:left;width:auto !important;padding-top:0;margin-left:0;float:none;display:block;margin-bottom:4px;}#marketo-fe-form .mktoForm .mktoLabel[for=tempCheckBoxforForm]{margin-left:23px;width:calc(100% - 23px) !important;font-weight:normal;}#marketo-fe-form .mktoForm p,#marketo-fe-form .mktoForm #gdpr{opacity:1;margin-bottom:8px;}#marketo-fe-form .mktoForm .mktoFormCol{width:100%;min-height:unset;margin-bottom:0 !important;}#marketo-fe-form .mktoForm .mktoFieldWrap{margin-right:0px !important;width:100%;}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=hidden]{display:none;}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=text],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=email],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=number],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=url]{-webkit-appearance:none;}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=text],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=email],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=number],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel],#marketo-fe-form .mktoForm .mktoFieldWrap input[type=url],#marketo-fe-form .mktoForm .mktoFieldWrap select{width:100% !important;color:var(--color-ink);height:50px;line-height:40px !important;min-width:190px;padding:8px !important;font-size:14px;font-weight:400;border:1px solid var(--color-dark-gray);border-radius:0;position:relative;z-index:1;}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=text]:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=email]:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=number]:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel]:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=url]:focus,#marketo-fe-form .mktoForm .mktoFieldWrap select:focus{border-bottom:2px solid var(--color-elastic-blue);outline:none !important;}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=text].mktoInvalid,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=email].mktoInvalid,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=number].mktoInvalid,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel].mktoInvalid,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=url].mktoInvalid,#marketo-fe-form .mktoForm .mktoFieldWrap select.mktoInvalid{border-bottom:2px solid var(--color-dark-orange);}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=text].mktoInvalid:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=email].mktoInvalid:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=number].mktoInvalid:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel].mktoInvalid:focus,#marketo-fe-form .mktoForm .mktoFieldWrap input[type=url].mktoInvalid:focus,#marketo-fe-form .mktoForm .mktoFieldWrap select.mktoInvalid:focus{border-bottom:2px solid var(--color-elastic-blue);}#marketo-fe-form .mktoForm .mktoFieldWrap select{background-color:#fff;position:relative;line-height:normal !important;padding:8px 32px 8px 8px !important;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;background-image:url("/static-res/images/svg/icon-down-arrow-16-blue.svg");background-repeat:no-repeat;background-position:98% 50%;background-size:16px;}#marketo-fe-form .mktoForm .mktoFieldWrap textarea{border:1px solid var(--color-dark-gray);font-size:14px;height:6em;width:100% !important;padding:8px 16px;margin-bottom:32px;padding:8px 16px;position:relative;z-index:1;}#marketo-fe-form .mktoForm .mktoFieldWrap textarea:focus{outline:none;border-bottom:2px solid var(--color-elastic-blue);}#marketo-fe-form .mktoForm .mktoFieldWrap textarea.mktoInvalid{border-bottom:2px solid var(--color-dark-orange);}#marketo-fe-form .mktoForm .mktoFieldWrap textarea.mktoInvalid:focus{border-bottom:2px solid var(--color-elastic-blue);}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=checkbox]{height:auto !important;width:16px !important;position:relative;z-index:1;}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=checkbox]:after{background-color:var(--color-white);content:"";height:17px;left:-2px;position:absolute;top:-2px;width:17px;border-top:1px solid var(--color-dark-gray);border-right:1px solid var(--color-dark-gray);border-bottom:1px solid var(--color-dark-gray);border-left:1px solid var(--color-dark-gray);}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=checkbox]:checked:after{background-color:var(--color-elastic-blue);border-color:var(--color-elastic-blue);}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=checkbox]:checked:before{content:"";height:12px;left:3px;position:absolute;top:-2px;width:7px;z-index:1;border-right:2px solid rgb(255,255,255);border-bottom:2px solid rgb(255,255,255);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}#marketo-fe-form .mktoForm .mktoFieldWrap input[type=checkbox][disabled]:after{border-color:#f8f9fb;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoRadioList{position:relative;z-index:1;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoRadioList label{margin-left:28px;margin-bottom:16px;line-height:14px;}#marketo-fe-form .mktoForm .mktoFieldWrap::-webkit-input-placeholder{font-size:14px;line-height:24px;}#marketo-fe-form .mktoForm .mktoFieldWrap::-moz-placeholder{font-size:14px;line-height:24px;}#marketo-fe-form .mktoForm .mktoFieldWrap:-ms-input-placeholder{font-size:14px;line-height:24px;}#marketo-fe-form .mktoForm .mktoFieldWrap:-moz-placeholder{font-size:14px;line-height:24px;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoCheckboxList{margin:16px 0px 10px 0px;width:100% !important;z-index:1;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoCheckboxList>label{font-size:14px;margin-bottom:8px;margin-left:32px;min-height:25px;margin-top:-2px;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoHtmlText{width:100% !important;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoGutter.mktoHasWidth{display:none;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoError{left:0;right:unset !important;bottom:unset !important;position:relative !important;z-index:0;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoError .mktoErrorArrowWrap{display:none;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoError .mktoErrorMsg{background-image:none !important;background-color:transparent !important;border:none !important;max-width:unset !important;box-shadow:none !important;text-shadow:none !important;color:var(--color-dark-orange) !important;font-size:14px !important;line-height:24px !important;margin-top:4px !important;padding-left:0;clear:both;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoError .mktoErrorMsg .mktoErrorDetail{display:inline !important;}#marketo-fe-form .mktoForm .mktoOffset,#marketo-fe-form .mktoForm .mktoRequiredField .mktoAsterix{display:none;}#marketo-fe-form .mktoForm .mktoButtonRow{width:100%;}#marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap{margin-left:unset !important;}#marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap .mktoButton{background:var(--color-elastic-blue);color:var(--color-white);display:inline-block;font-size:16px;font-weight:600;font-family:"MierB","Inter",Arial,sans-serif;height:50px;line-height:30px;margin:0;min-width:150px;padding:0 16px !important;text-align:center;text-transform:none;width:100%;border-top:1px solid var(--color-elastic-blue);border-right:1px solid var(--color-elastic-blue);border-bottom:1px solid var(--color-elastic-blue);border-left:1px solid var(--color-elastic-blue);-webkit-border-radius:4px !important;-moz-border-radius:4px !important;-ms-border-radius:4px !important;border-radius:4px !important;-moz-transition:all 200ms ease-in;-webkit-transition:all 200ms ease-in;-o-transition:all 200ms ease-in;-ms-transition:all 200ms ease-in;transition:all 200ms ease-in;}#marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap .mktoButton:hover{background:var(--color-dark-blue);border-color:var(--color-dark-blue);outline:none !important;}#marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap .mktoButton:active,#marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap .mktoButton:focus,#marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap .mktoButton:active:focus{border-color:var(--color-light-blue);outline:none !important;}.error-message{color:var(--color-dark-orange);font-size:14px;}#fallback-form{position:relative;}#fallback-form .fallback-form-title{font-weight:600;padding-bottom:10px;}#fallback-form .debug{border:1px solid red;color:red;position:absolute;top:-20px;display:none;}#fallback-form .input-wrapper p{font-size:12px;line-height:18px;}#fallback-form form.fallback{position:relative;text-align:left;max-width:100%;}#fallback-form form.fallback .input-wrapper input{width:100%;outline:none;}#fallback-form form.fallback .input-wrapper input[type=text],#fallback-form form.fallback .input-wrapper input[type=email],#fallback-form form.fallback .input-wrapper input[type=number],#fallback-form form.fallback .input-wrapper input[type=tel],#fallback-form form.fallback .input-wrapper input[type=url],#fallback-form form.fallback .input-wrapper select{width:100% !important;color:var(--color-ink);height:50px;max-height:50px;line-height:40px !important;min-width:190px;padding-left:8px !important;padding-right:8px !important;font-size:14px;font-weight:400;border-radius:0;border:1px solid var(--color-dark-gray);}#fallback-form form.fallback .input-wrapper input[type=text]:focus,#fallback-form form.fallback .input-wrapper input[type=email]:focus,#fallback-form form.fallback .input-wrapper input[type=number]:focus,#fallback-form form.fallback .input-wrapper input[type=tel]:focus,#fallback-form form.fallback .input-wrapper input[type=url]:focus,#fallback-form form.fallback .input-wrapper select:focus{border-bottom:2px solid var(--color-elastic-blue);outline:none !important;}#fallback-form form.fallback .input-wrapper input[type=text].mktoInvalid,#fallback-form form.fallback .input-wrapper input[type=email].mktoInvalid,#fallback-form form.fallback .input-wrapper input[type=number].mktoInvalid,#fallback-form form.fallback .input-wrapper input[type=tel].mktoInvalid,#fallback-form form.fallback .input-wrapper input[type=url].mktoInvalid,#fallback-form form.fallback .input-wrapper select.mktoInvalid{border-bottom:2px solid var(--color-dark-orange);}#fallback-form form.fallback .input-wrapper input[type=text].mktoInvalid:focus,#fallback-form form.fallback .input-wrapper input[type=email].mktoInvalid:focus,#fallback-form form.fallback .input-wrapper input[type=number].mktoInvalid:focus,#fallback-form form.fallback .input-wrapper input[type=tel].mktoInvalid:focus,#fallback-form form.fallback .input-wrapper input[type=url].mktoInvalid:focus,#fallback-form form.fallback .input-wrapper select.mktoInvalid:focus{border-bottom:2px solid var(--color-elastic-blue);}#fallback-form form.fallback .input-wrapper textarea{border:1px solid var(--color-dark-gray);height:4.5em;width:100% !important;margin-bottom:32px;}#fallback-form form.fallback .input-wrapper textarea:focus{outline:none;border-bottom:2px solid var(--color-elastic-blue);}#fallback-form form.fallback .input-wrapper textarea.mktoInvalid{border-bottom:2px solid var(--color-dark-orange);}#fallback-form form.fallback .input-wrapper textarea.mktoInvalid:focus{border-bottom:2px solid var(--color-elastic-blue);}#fallback-form form.fallback .input-wrapper input[type=checkbox]{height:auto !important;position:relative;width:16px !important;}#fallback-form form.fallback .input-wrapper input[type=checkbox]:after{background-color:var(--color-white);content:"";height:16px;left:0;position:absolute;top:0;width:16px;border-top:1px solid var(--color-dark-gray);border-right:1px solid var(--color-dark-gray);border-bottom:1px solid var(--color-dark-gray);border-left:1px solid var(--color-dark-gray);}#fallback-form form.fallback .input-wrapper input[type=checkbox]:checked:after{background-color:var(--color-elastic-blue);border-color:var(--color-elastic-blue);}#fallback-form form.fallback .input-wrapper input[type=checkbox]:checked:before{content:"";height:12px;left:5px;position:absolute;top:0px;width:7px;z-index:1;border-right:2px solid rgb(255,255,255);border-bottom:2px solid rgb(255,255,255);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}#fallback-form form.fallback .input-wrapper::-webkit-input-placeholder{font-size:14px;line-height:24px;}#fallback-form form.fallback .input-wrapper::-moz-placeholder{font-size:14px;line-height:24px;}#fallback-form form.fallback .input-wrapper:-ms-input-placeholder{font-size:14px;line-height:24px;}#fallback-form form.fallback .input-wrapper:-moz-placeholder{font-size:14px;line-height:24px;}#fallback-form form.fallback label{font-size:14px;font-weight:600;line-height:24px !important;text-align:left;width:100% !important;margin-bottom:0;margin-top:24px;}#fallback-form form.fallback .asterix{font-weight:700;color:var(--color-dark-orange);}#fallback-form form.fallback .submit-form{cursor:pointer;min-width:140px;width:max-content;padding-right:16px;padding-left:16px;-webkit-transition:all 200ms ease-in;transition:all 200ms ease-in;background-color:var(--color-elastic-blue);color:var(--color-white);height:50px;font-weight:700;text-align:center;letter-spacing:0.025em;margin:0;border:1px solid var(--color-elastic-blue);border-radius:4px;cursor:pointer;}#fallback-form form.fallback .submit-form:hover{background:var(--color-dark-blue);border-color:var(--color-dark-blue);}#fallback-form form.fallback .submit-form:active{border-color:var(--color-light-blue);}#fallback-form form.fallback .submit-form:focus{box-shadow:none;}.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap,.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap{margin-bottom:24px;}.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=text],.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=email],.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=number],.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel],.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=url],.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=text],.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=email],.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=number],.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=tel],.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap input[type=url]{height:40px !important;}.mkto-form-wrapper.long-form #marketo-fe-form .mktoForm .mktoFieldWrap select,.marketo-form.long-form #marketo-fe-form .mktoForm .mktoFieldWrap select{height:auto !important;}.mkto-form-wrapper.inline #marketo-fe-form{position:relative;width:100%;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm{width:100% !important;padding:0px;position:relative;display:inline-flex;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoOffset,.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoAsterix{display:none;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol{margin-bottom:0 !important;float:none;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap{width:100%;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoHtmlText{display:none !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoHtmlText p{margin:0 !important;line-height:0 !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap input[type=email],.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap select{min-width:289px;width:100% !important;max-width:350px !important;margin-top:4px;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError{position:absolute !important;padding-bottom:unset;bottom:-52px !important;width:max-content;z-index:99 !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError .mktoErrorArrowWrap{display:block;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError .mktoErrorArrowWrap .mktoErrorArrow{background:rgba(255,255,255,0.9);border:1px solid var(--color-dark-orange) !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError .mktoErrorMsg{border:1px solid var(--color-dark-orange) !important;color:var(--color-dark-orange) !important;padding:8px !important;background:rgba(255,255,255,0.9) !important;border-radius:0 !important;width:auto !important;margin-top:7px !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoButtonRow{margin-top:4px;margin-left:16px;width:max-content !important;align-self:flex-end;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap{margin-left:0px !important;}.mkto-form-wrapper.inline .success-message{max-width:455px;width:100%;margin:0 auto;}.mkto-form-wrapper.inline.fallback{width:100%;max-width:455px;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback{display:inline-flex;align-items:end;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .input-wrapper input,.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .input-wrapper select{min-width:307px;width:100% !important;max-width:350px !important;margin-top:4px;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .button-wrapper{margin-top:4px;margin-left:16px;}.mkto-form-wrapper.inline.center #marketo-fe-form{margin-left:auto;margin-right:auto;}.mkto-form-wrapper.inline.center #marketo-fe-form .mktoForm{justify-content:center;}.mkto-form-wrapper.inline.center.fallback{max-width:455px !important;margin-left:auto;margin-right:auto;}.mkto-form-wrapper.inline.center.fallback #fallback-form{text-align:center;}.mkto-form-wrapper.inline.center .error-message{margin-top:16px;}@media screen and (max-width:1200px){.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap input[type=email],.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap select{min-width:270px;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback{width:100%;margin:0;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .input-wrapper input,.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .input-wrapper select{min-width:270px;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .button-wrapper{width:100%;}}@media screen and (max-width:991px){.react-tabs .react-tabs__tab{font-size:14px;}.mkto-form-wrapper.inline{margin-left:auto;margin-right:auto;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm{position:relative;display:block;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap{width:100%;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap input[type=email],.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap select{width:100% !important;max-width:unset !important;min-width:unset;margin-top:0;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError{width:auto;position:relative !important;top:8px;bottom:unset !important;padding-bottom:0;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError .mktoErrorMsg{padding:0 !important;width:auto !important;border:none !important;background:transparent !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoFormCol .mktoFieldWrap .mktoError .mktoErrorArrowWrap{display:none !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoButtonRow{margin-top:16px;margin-left:0;width:100% !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap{margin-left:0px !important;}.mkto-form-wrapper.inline #marketo-fe-form .mktoForm .mktoButtonRow .mktoButtonWrap .mktoButton{width:100% !important;}.mkto-form-wrapper.inline.fallback{max-width:455px;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback{display:block;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .input-wrapper input,.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .input-wrapper select{width:100% !important;max-width:unset !important;min-width:unset;margin-top:0;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .button-wrapper{margin:16px 0 0 0;}.mkto-form-wrapper.inline.fallback #fallback-form form.fallback .button-wrapper .submit-form{width:100% !important;}}.success-message{background:var(--color-white);color:var(--color-dark-teal) !important;border:1px solid var(--color-dark-teal) !important;padding:8px;text-align:center;}.success-message a{color:var(--color-dark-teal) !important;}.filter-wrapper{padding:32px 0px;}.filter-wrapper .header{display:flex;justify-content:space-between;border-bottom:1px solid var(--color-dark-gray);}.filter-wrapper .filter-row{width:100%;display:grid;grid-column-gap:32px;grid-row-gap:32px;grid-template-columns:1fr 1fr 1fr 1fr;align-items:baseline;}.filter-wrapper .filter-row .filter-column{width:100%;}.filter-wrapper .filter-row .filter-label{font-size:14px;font-weight:600;margin-bottom:5px;}@media screen and (max-width:991px){.filter-wrapper .container{padding:0 15px;}}@media screen and (max-width:768px){.filter-wrapper .header{padding-bottom:8px;}.filter-wrapper .container{padding:0 15px;}.filter-wrapper .filter-row{grid-template-columns:1fr 1fr;grid-template-rows:auto auto;}}@media screen and (max-width:575px){.filter-wrapper .header{display:flex;flex-direction:column;}.filter-wrapper .filter-row{grid-template-columns:1fr;}.filter-wrapper .filter-row .filter-column{margin:0 auto;width:300px;}}.card-small-padding{padding:8px;}.card-medium-padding{padding:16px;}.card-large-padding{padding:32px;}.card-xlarge-padding{padding:40px;}.card-xxlarge-padding{padding:48px;}.card-grid{display:-ms-grid;display:grid;grid-auto-columns:1fr;grid-template-columns:repeat(2,1fr);grid-template-rows:auto auto;grid-row-gap:32px;grid-column-gap:32px;}.card-grid-1x1{margin-right:auto;margin-left:auto;gap:32px;}@media (min-width:992px){.card-grid-1x1{gap:64px;}}.card-grid-1x1,.card-grid-1x1-sidebar{display:grid;justify-content:stretch;grid-auto-columns:1fr;grid-template-areas:".";grid-template-columns:1fr;grid-template-rows:auto;}.card-grid-1x1.col-sm-8,.card-grid-1x1-sidebar.col-sm-8{padding:0px;}.card-grid-1x1 .card-footer div:first-child,.card-grid-1x1-sidebar .card-footer div:first-child{margin-right:24px;}.card-grid-2x1{display:grid;margin-right:auto;margin-left:auto;justify-content:stretch;grid-auto-columns:1fr;grid-template-areas:".";grid-template-columns:repeat(2,1fr);grid-template-rows:auto;}.card-grid-2x1 .card-footer.align-self-left div:first-child{margin-right:24px;}.card-grid-3x1{display:grid;margin-right:auto;margin-left:auto;padding-left:0px;justify-content:stretch;grid-template-areas:".";grid-template-columns:repeat(3,1fr);grid-auto-columns:1fr;grid-template-rows:auto;}.card-grid-3x1 .card-footer.align-self-left div:first-child{margin-right:24px;}.card-grid-4x1{display:grid;margin-right:auto;margin-left:auto;justify-content:stretch;grid-column-gap:32px;grid-row-gap:32px;grid-template-columns:repeat(4,1fr);grid-template-rows:auto;}@media screen and (max-width:991px){.card-grid-3x1{grid-auto-flow:row;grid-template-areas:".";grid-template-columns:1fr 1fr;grid-template-rows:repeat(2,auto);}.card-grid-4x1{grid-row-gap:32px;grid-template-columns:1fr 1fr;grid-template-rows:auto auto;}}@media screen and (max-width:768px){.card-grid-3x1,.card-grid-4x1{grid-template-columns:1fr 1fr;}}@media screen and (max-width:575px){.card-grid-2x1{grid-template-columns:1fr;grid-template-rows:repeat(2,auto);}.card-grid-3x1{grid-template-columns:1fr;grid-template-rows:repeat(3,auto);}.card-grid-4x1{grid-template-columns:1fr;grid-template-rows:repeat(4,auto);}}.react-tabs .react-tabs__tab{cursor:pointer;margin-bottom:-2px;padding:0px 16px;margin-left:0;margin-right:0;}.react-tabs .react-tabs__tab h2{color:var(--color-black);font-size:16px;line-height:24px;padding-bottom:16px;font-weight:400;}.react-tabs .react-tabs__tab:focus{outline:0px none;}.react-tabs .react-tabs__tab:hover{border-bottom:2px solid var(--color-ink);}.react-tabs .react-tabs__tab--selected{color:var(--color-elastic-blue);cursor:text;display:block;margin-bottom:-2px;border-bottom:4px solid var(--carousel-tab-hover-border-color);}.react-tabs .react-tabs__tab--selected h2{color:var(--color-elastic-blue);}.react-tabs .react-tabs__tab--selected:hover{border-color:var(--color-elastic-blue);}.react-tabs .react-tabs__tab-panel{display:none;}.react-tabs .react-tabs__tab-panel--selected{display:block;}.instruction-module .react-tabs ul{border-bottom:0;}.instruction-module .react-tabs .top-tabs .react-tabs__tab{color:rgb(52,55,65);font-weight:400;height:40px;line-height:40px;margin:0px;padding:0px;text-align:center;text-transform:unset;width:200px;border-width:1px;border-style:solid;border-color:rgb(0,120,160);display:flex;justify-content:center;align-items:center;}.instruction-module .react-tabs .top-tabs .react-tabs__tab h2{padding-bottom:2px;}.instruction-module .react-tabs .top-tabs .react-tabs__tab--selected{background-color:var(--color-elastic-blue);}.instruction-module .react-tabs .top-tabs .react-tabs__tab--selected h2{color:#FFFFFF !important;}.instruction-module .react-tabs .vertical-tabs .react-tabs__tab h2{font-size:18px;line-height:22px;font-family:Inter,arial,sans-serif;}@media screen and (min-width:768px){.react-tabs .vertical-tabs .react-tabs__tab-list{border-bottom:0;border-left:1px solid var(--color-dark-gray);}.react-tabs .vertical-tabs .react-tabs__tab{margin-bottom:0;border-left:2px solid transparent;padding:8px 16px;}.react-tabs .vertical-tabs .react-tabs__tab h2{padding:5px 0;}.react-tabs .vertical-tabs .react-tabs__tab:hover{border-bottom:0;border-left:2px solid var(--color-ink);}.react-tabs .vertical-tabs .react-tabs__tab--selected{border-bottom:0;border-left:2px solid var(--color-elastic-blue);}.react-tabs .vertical-tabs .react-tabs__tab--selected:hover{border-left:2px solid var(--color-elastic-blue);}}@media screen and (max-width:767px){.code-carousel .react-tabs .react-tabs__tab-list{display:flex;flex-wrap:wrap;flex-direction:unset;margin-bottom:10px;}.code-carousel .react-tabs .react-tabs__tab{border-bottom:2px solid transparent;}.code-carousel .react-tabs .react-tabs__tab:hover{border-bottom:2px solid var(--color-ink);}.code-carousel .react-tabs .react-tabs__tab--selected{border-bottom:2px solid var(--carousel-tab-border-color);}.code-carousel .react-tabs .react-tabs__tab--selected:hover{border-bottom:4px solid var(--carousel-tab-hover-border-color);}}.carousel .carousel-one-column .react-tabs__tab,.carousel .carousel-two-column__tab-labels-left .react-tabs__tab{color:var(--carousel-tab-color);cursor:pointer;margin-left:0;margin-right:0;position:relative;font-size:16px;line-height:22px;font-weight:700;font-style:normal;}.carousel .carousel-one-column .react-tabs__tab:focus,.carousel .carousel-two-column__tab-labels-left .react-tabs__tab:focus{outline:0px none;}.carousel .carousel-one-column .react-tabs__tab h2,.carousel .carousel-two-column__tab-labels-left .react-tabs__tab h2{color:var(--carousel-tab-color);font-size:16px;line-height:24px;font-weight:400;padding:0px;}.carousel .carousel-one-column .react-tabs__tab--selected,.carousel .carousel-two-column__tab-labels-left .react-tabs__tab--selected{cursor:text;display:block;cursor:text;}.carousel .carousel-one-column .carousel-asset .card-deck-container-block.container,.carousel .carousel-one-column .carousel-asset .illustration-icon-grid-container-block.container,.carousel .carousel-two-column__tab-labels-left .carousel-asset .card-deck-container-block.container,.carousel .carousel-two-column__tab-labels-left .carousel-asset .illustration-icon-grid-container-block.container{padding:0px;}.carousel .carousel-asset-code .carousel-asset-code-block{background-image:url(https://assets.website-files.com/5d35f5b2989a23dd99c4cb9a/5dd5be9fcd567c46f05e5544_image-dots-browser-16-colored.svg);background-repeat:no-repeat;background-position:32px 32px;background-color:var(--color-light-gray);height:500px;overflow-y:scroll;padding:40px 32px 32px;position:relative;-moz-box-shadow:0 10px 20px 0 rgba(152,162,179,0.25);-webkit-box-shadow:0 10px 20px 0 rgba(152,162,179,0.25);-o-box-shadow:0 10px 20px 0 rgba(152,162,179,0.25);-ms-box-shadow:0 10px 20px 0 rgba(152,162,179,0.25);box-shadow:0 10px 20px 0 rgba(152,162,179,0.25);}.carousel .carousel-asset-code .carousel-asset-code-block .react-tabs__tab-panel{height:484px;overflow:auto;width:100%;}.carousel .carousel-asset-code .prettyprint{background-color:var(--color-light-gray);border:0px none !important;left:0;margin:20px auto 0;padding:16px;position:absolute;right:0;width:675px;}.carousel .carousel-asset-code .prettyprint ol li{background:none;}.carousel .carousel-asset-code .prettyprint .linenums{color:#999;display:contents;}.carousel .carousel-asset-code .prettyprint code{display:inline-block;left:0;overflow:hidden;position:relative;vertical-align:top;white-space:pre-wrap;width:90%;word-break:break-word;}.carousel .carousel-description{width:auto;max-width:854px;text-align:center;padding:0px 16px;margin-right:auto;margin-left:auto;}.carousel .icon-text-card-deck .container{padding-left:0px !important;padding-right:0px !important;}.carousel .icon-text-card.card .card-body{text-align:left;}.carousel .icon-text-card.card .card-body h3{font-size:24px;line-height:28px;}.carousel .icon-text-card.card .card-footer{text-align:left;}.carousel .icon-text-card.card .card-footer .card-footer{margin-top:16px !important;}@media screen and (max-width:991px) and (min-width:768px){.carousel .card.icon-text-card{width:100%;}}@media screen and (max-width:768px){.carousel .carousel .description{width:100%;margin:32px auto 8px auto;}}@media screen and (max-width:575px){.carousel .react-tabs__tab h2{font-size:14px !important;line-height:24px !important;}.carousel .icon-text-card-deck{margin:auto;}}.training .rail>div{position:relative;}.euiComboBox .euiFormControlLayoutIcons{position:absolute !important;}.euiComboBox .euiFormControlLayoutCustomIcon--clickable{border:0;background-color:transparent;padding:0;}.euiComboBox .euiFormControlLayoutClearButton{display:flex;justify-content:center;align-items:center;border:1px solid #98A2B3;}.css-1yifmy7-euiBadge-hollow{display:flex;align-items:center;}.euiBadge__iconButton.css-iqdgtj-euiBadge__iconButton-right{border:0;background:transparent;padding:0;}.euiComboBoxOptionsList__rowWrap{border-radius:6px;}.euiComboBoxOptionsList__rowWrap .euiFilterSelectItem{border:0;background:#fff;border-bottom:1px solid #EEF2F7;font-size:14px;font-weight:400;display:flex;align-items:center;}.euiComboBoxOptionsList__rowWrap .euiFilterSelectItem-isFocused{background-color:rgba(0,119,204,0.1);}@media (max-width:767px){.horizontal-scroll-table{width:100vw;overflow-x:auto;}}.comparison-table{max-width:830px;margin:0 auto;}.comparison-table thead{border-bottom:4px solid #000;}.comparison-table th{text-transform:uppercase;font-weight:700;letter-spacing:0.1em;padding:1rem 1.5rem;text-align:center;}.comparison-table td{padding:1rem 1.5rem;}.comparison-table td:not(:first-child){text-align:center;}.comparison-table tbody{font-size:0.875rem;}.comparison-table tbody tr{border-bottom:1px solid #ccc;}.comparison-table tfoot td{width:100%;color:#ccc;}.pricing-card.bg-dark-teal,.list.bg-dark-teal{--bullet-color:var(--color-dark-teal);}.pricing-card.bg-yellow,.list.bg-yellow{--bullet-color:var(--color-yellow);}.pricing-card.bg-elastic-teal,.list.bg-elastic-teal{--bullet-color:var(--color-elastic-teal);}.pricing-card.bg-pink,.list.bg-pink{--bullet-color:var(--color-pink);}.pricing-card.bg-blurple,.list.bg-blurple{--bullet-color:var(--color-blurple);}.list.dark-teal{--bullet-color:var(--color-dark-teal);}.list.yellow{--bullet-color:var(--color-yellow);}.list.elastic-teal{--bullet-color:var(--color-elastic-teal);}.list.pink{--bullet-color:var(--color-pink);}.list.blurple{--bullet-color:var(--color-blurple);}.serverless-pricing-table{width:100%;border-spacing:32px 0;table-layout:fixed;height:1px;}.serverless-pricing-table h4{letter-spacing:-0.04em;line-height:1.1;}.serverless-pricing-table tr{height:100%;}@media (min-width:767px){.serverless-pricing-table tr{border-bottom:1px solid var(--color-dark-gray);}}.serverless-pricing-table tr:last-child{border:none;}@media (max-width:767px){.serverless-pricing-table tr:not(:first-of-type){display:none;visibility:hidden;}}.serverless-pricing-table th{padding:0 0.5rem;}.serverless-pricing-table th:first-child{padding:0 1rem 1.5rem;}.serverless-pricing-table th:last-child{padding-right:0;}.serverless-pricing-table td,.serverless-pricing-table th{padding:0 0.5rem;vertical-align:top;height:100%;}.serverless-pricing-table td:first-child,.serverless-pricing-table th:first-child{padding:1.5rem 1rem 0 1.5rem;}@media (max-width:767px){.serverless-pricing-table td:first-child,.serverless-pricing-table th:first-child{border-bottom:none;padding:0;margin:0;}}.serverless-pricing-table td:last-child,.serverless-pricing-table th:last-child{padding-right:0;}@media (max-width:767px){.serverless-pricing-table td,.serverless-pricing-table th{display:block;height:initial;padding:0;margin:0 0 1.5rem;border-bottom:1px solid var(--color-dark-gray);}}.serverless-pricing-table td.feature-label,.serverless-pricing-table th.feature-label{font-family:'MierB','Inter',Arial,sans-serif;font-size:1.25rem;font-weight:700;letter-spacing:-0.02em;padding:1.5rem 1rem 1.5rem 1.5rem;}.serverless-pricing-table td.feature-label span:last-child,.serverless-pricing-table th.feature-label span:last-child{margin-top:6px;display:block;font-weight:normal;}.serverless-pricing-table td.feature,.serverless-pricing-table th.feature{vertical-align:middle;text-align:center;}.serverless-pricing-table td.feature .card-content,.serverless-pricing-table th.feature .card-content{padding:24px 0;height:100%;display:flex;flex-direction:column;justify-content:center;}.serverless-pricing-table td.feature .card-content *,.serverless-pricing-table th.feature .card-content *{vertical-align:middle;}.serverless-pricing-table .card-content{border-left:1px solid var(--color-dark-gray);border-right:1px solid var(--color-dark-gray);background:#fff;padding:0 0.5rem;}.serverless-pricing-table .card-content__container{padding:0 0.5rem 1.5rem;display:flex;flex-flow:column nowrap;align-items:center;justify-content:space-between;}.serverless-pricing-table .card-content__container p{margin:0;}.serverless-pricing-table .card-content__container .button{width:max-content;margin:0 auto;align-self:end;}.serverless-pricing-table .card-content__content{flex:1;display:grid;}.serverless-pricing-table .card-content.header{display:flex;flex-flow:column nowrap;justify-content:space-between;}.serverless-pricing-table .button-unstyled{padding:8px 24px;min-height:50px;display:inline-block;border:2px solid transparent;width:max-content;margin:0 auto;align-self:end;}.serverless-pricing-table .header{padding:0;}.serverless-pricing-table .card-content__header,.serverless-pricing-table .card-content__includes{padding:0 0.5rem;}.serverless-pricing-table .card-content__includes{padding:2rem 0.5rem;border-top:1px solid var(--color-dark-gray);}.serverless-pricing-table .border-bottom{border-bottom:1px solid var(--color-dark-gray);border-bottom-left-radius:16px;border-bottom-right-radius:16px;}.serverless-pricing-table .borderless-bottom{border-bottom:none;}.serverless-pricing-table .pricing-card{border-top-left-radius:16px;border-top-right-radius:16px;height:100%;padding-top:16px;}.serverless-pricing-table .pricing-card .card-label{padding:0.875rem 0;}.serverless-pricing-table .pricing-card .header{height:100%;border-top-left-radius:16px;border-top-right-radius:16px;border-top:1px solid var(--color-dark-gray);}.serverless-pricing-table .topic-heading{color:var(--color-light-ink);font-size:1rem;font-weight:700;line-height:22px;letter-spacing:0.1em;text-transform:uppercase;}.serverless-pricing-table .price{font-family:'MierB','Inter',Arial,sans-serif;font-size:1.75rem;font-weight:700;letter-spacing:-0.04em;margin-top:8px;}.serverless-pricing-table .list{max-width:250px;width:max-content;margin:0 auto;text-align:left;text-indent:-1.5rem;}.serverless-pricing-table .list li{font-weight:normal;margin-bottom:0.75rem;}.serverless-pricing-table .list li:before{content:"✓";position:relative;top:-2px;left:0;display:inline-block;background-color:var(--bullet-color,black);border-radius:50%;border-style:none;height:16px;width:16px;font-size:0.75rem;line-height:normal;color:#fff;padding-top:0;padding-left:3px;margin-right:0.5rem;text-indent:0;}.mobile-container{border-top:1px solid var(--color-dark-gray);margin:2rem 0 0;padding:1rem 0 0;}@media (min-width:767px){.mobile-container{display:none;visibility:hidden;}}.mobile-container__item{margin:1rem 0;}.mobile-container .topic-heading{padding-bottom:0.25rem;}.mobile-container__price-heading{font-weight:normal;}.mobile-container__price{font-weight:700;}.card-content--stretch .card-content__includes{min-height:373px;}.feature .pricing{margin:0 0 1rem;}.optional-eyebrow{display:block;font-size:1rem;text-transform:uppercase;color:var(--color-dark-teal);letter-spacing:0.1rem;}.pill>.topic-heading{font-size:0.875rem;}#LbltempCheckBoxforForm{padding-left:20px;}#marketo-fe-form .mktoForm .mktoFieldWrap .mktoCheckboxList{margin:0;}#LbltempCheckbox1{padding-left:20px;}#tempCheckbox1{margin-top:5px;}
Elastic StackとDocker Composeを使いはじめる:パート2
「Elastic ® StackとDocker Composeを使いはじめる」のパート2にようこそ。 パート1のブログでは 、Docker Composeの基本と、単一ノードクラスターにElasticsearch ® 、Kibana ® 、Logstash ® 、Metricbeat、Filebeatを含めてローカルのプレイグラウンドとして立ち上げる方法を確認しました。まだ読んでいない場合は、この記事に進む前にお読みください。
このブログでは、前に説明したクラスターに、Fleet、Agent、APM、デモアプリケーションなどの追加機能を実装します。快適なPOC環境を構築しましょう。なお、Docker Composeは、たとえクラスターサイズが大きくても本番環境には推奨されていないことにご注意ください。
もちろん、すでに使い慣れていてコードを知りたいだけの場合は、 GitHubレポジトリで手早くファイルを入手できます 。
それでは早速始めましょう。
Agentから、Fleet、APMまで これらの用語や製品に詳しくなくても問題ありません。最初にこれらの機能の内容や、これらが役立つ理由を手短かにご説明します。
このクラスターの元のアーキテクチャーは、監視とファイルインジェスチョンの基本に注目したものでした。それを表現したのがこちらです。
Elastic Agent:簡単な概要 まずはElastic Agentといくつかの関連用語からご紹介します。
Elastic Agent は、ログやメトリックなど、さまざまな種類のデータの一元的なホスト監視を実現します。また、セキュリティ脅威からの保護、オペレーティングシステムデータの照会、リモートサービス、ハードウェアデータ転送などの機能も提供します。Elastic Agentはインフラ全体で監視機能のデプロイを合理化して高速化します。各エージェントはポリシーに関連付けられており、そのポリシーは、新しいデータソース、セキュリティ対策、追加機能の統合を組み込むための更新が可能です。
Elastic統合機能群 は、外部ソースからデータを迅速かつ簡単に収集してインサイトを獲得できるように設計されています。多くの場合、これらの統合機能群では、事前構築済みの設定、ダッシュボード、視覚化機能、パイプラインを使用して、メトリックや、ログ、イベントの解釈に役立てることができます。統合のページはローカルのKibanaインスタンス内にあり、Elastic Agentやそのポリシーと組み合わせて統合機能群の参照、インストール、設定を簡単に行うことができます。利用可能な統合のリストは Elastic Webサイト でも確認できます。
ポリシー は、Elastic Agentがどのように機能するかを定義する設定と統合の総称です。Elastic Agentポリシーには複数の統合を割り当てることができるため、エージェントで何のデータをキャプチャするかを柔軟に設定できます。Elastic Agentポリシーを複数のエージェントに割り当てると、Fleetを使用して多くのエージェントをさらに大規模に管理および設定できます。
Fleet は、Elastic Agentと関連ポリシーを一元管理するためのKibana内のユーザーインターフェースです。このユーザーインターフェースを使用すると、各エージェントのヘルス、インストールされているバージョン、最新のチェックイン時刻またはアクティビティの時刻、ポリシー情報を確認できます。各Elasticエージェントへの通信は、Fleet Serverを介してFleetで管理されます。これにより、チェックイン時にポリシーの新しい更新をリモートでプッシュしたり、エージェントのバイナリや統合をアップグレードしたりすることができます。
Fleet Server は、Fleetと、デプロイされたすべてのElasticエージェント間の通信のコーディネーターとして実行される、Elastic Agentのインスタンスです。
* 基本的な用語の説明は以上です。 *
AgentとFleetに関するすべてのトピックの詳細については、 Elasticのドキュメントをご確認ください 。
Elastic AgentをFleetと組み合わせてログやメトリックを収集し、ポリシーを管理する方法をご紹介します。アーキテクチャーを示した以下の図をご覧ください。
Elastic APMとカスタムWebアプリ Elastic APM は、Elastic Stack上に構築されたアプリケーションパフォーマンス監視機能です。 Elastic APM Agent を使用してコードをインストルメントすると、メトリック、トレース、ログ、エラー、例外を収集し、それらをElasticsearchに送信してAPMユーザーインターフェースで表示することができ、トラブルシューティングやパフォーマンスに関する疑問を軽減できます。
Elastic APMは、 クラウドでも、ローカルでのセルフマネージドでも 設定可能です。APMのローカルインスタンスを管理する場合、 スタンドアロンのAPM Serverバイナリを管理する か、APMを 統合機能としてElastic Agentを通じて 使用するかを選択できます。
今回のローカルPOCでは、Elastic AgentとFleetサービスで管理されたEastic APMを使用しています。
監視対象となるアプリケーションがなければ、アプリケーションのパフォーマンスを監視する機能 はあまり役に立ちません。いずれかの Elastic APM Agent を使用してインストルメントしたいコードがすでにあるのが理想です。まだない場合は、 GitHubレポジトリ に格納されている小さなPythonアプリケーションを使用して基本的なテストを実行することができます。
新しいアーキテクチャー 再びアーキテクチャー図を見て、配置を確認しましょう。
新しいFleet-Serverコンテナーがあることがわかります。このコンテナーはElastic Agentを実行することで、Elastic AgentをすべてのエージェントとElasticクラスターの中央通信ポイントとして機能させています。Elastic Agentは、カスタムWebアプリケーションとKibanaの両方からテレメトリー情報を収集するために、Elastic APM統合を実行しています。
通信とアクセス Dockerを使い始めるときによく問題になるのが、通信のしくみのわかりづらさです。すでに説明したコンテナー、ポート、証明書、URLに関する知識を念頭に置きながら、改めて少し引いた視点から新しいアーキテクチャーを確認し、さまざまな要素がどのように通信し合っているかを見てみましょう。 docker-compose.yml ファイル内には、さまざまなコンテナーの証明書の生成のために使用されるコードが見られました。コードの内容はこのようになります。
echo "Creating certs" ;
echo - ne \
"instances:\n" \
" - name: es01\n" \
" dns:\n" \
" - es01\n" \
" - localhost\n" \
" ip:\n" \
" - 127.0.0.1\n" \
" - name: kibana\n" \
" dns:\n" \
" - kibana\n" \
" - localhost\n" \
" ip:\n" \
" - 127.0.0.1\n" \
" - name: fleet-server\n" \
" dns:\n" \
" - fleet-server\n" \
" - localhost\n" \
" ip:\n" \
" - 127.0.0.1\n" \
> config / certs / instances . yml ;
このコードのブロックにより、 instances.yml というファイルが作成されます。このファイルは"setup"コンテナー内に、Docker Engine内のすべてのコンテナー名とそのDNSエントリーのリストとともに配置されます。このファイルを elasticsearch-certutilユーティリティ と組み合わせて使用して、各コンテナーの証明書を作成し、コンテナー間の通信およびユーザーとコンテナーの間の通信を保護します。 すべてのコンテナが、次のように docker-compose.yml で設定したデフォルトのネットワークを使用して相互に通信します。
networks :
default :
name : elastic
このネットワークはDocker Engineの 内部 にあり、すべてのコンテナーが相互に通信し、他のコンテナーの名前を解決できるようにしています。お使いのブラウザーからのトラフィックがコンテナーに到達できるように、各サービスで必要なポートは公開します。以下に例を示します。
es01 :
depends_on :
setup :
condition : service_healthy
image : docker . elastic . co / elasticsearch / elasticsearch : $ { STACK_VERSION }
labels :
co . elastic . logs / module : elasticsearch
volumes :
- certs : /usr/ share / elasticsearch / config / certs
- esdata01 : /usr/ share / elasticsearch / data
ports :
- $ { ES_PORT }: 9200
environment :
- node . name = es01
- cluster . name = $ { CLUSTER_NAME }
- discovery . type = single - node
...
具体的には "ports:" セクションに注目します。これは、"host:container"の形式で指定されたポートをマッピングするようにDocker Composeに指示しています。この例では"${ES_PORT}"が .env ファイルから取得した9200 に置き替えられ、それがお使いのコンピューター(ホスト)上で開かれます。9200 は、ホストのマップ先となるコンテナー上のポートにもなります。これで、お使いのブラウザーから https://localhost:9200 にアクセスすると、トラフィックがes01コンテナーに送信されるようになります。
Elasticsearchは、ノード間通信用にデフォルトでポート9300も開きます。Dockerエンジン内のその他のコンテナーは、必要に応じてこのポートにアクセスできますが、このポートは非公開なのでホストからはアクセスできません。
新しいアーキテクチャーを使用してこれらの概念を視覚化してみると、次のようになります。
この図では、"metricbeat01"コンテナーは、"es01"と"logstash01"に付けた名前を解決することができます。また、同じDockerネットワーク内に存在しているため、"logstash01"にある非公開の監視ポート9600にもアクセスできます。
ただし、9200でElasticsearchに、5601でKibanaにアクセスするには、マシンにトラフィックをDockerネットワークと適切なコンテナーにルーティングさせるために"localhost"にアクセスする必要があることがわかります。 最後に、これらのサービスのいずれかを参照するために使用するアドレスの決定は難しい場合があります。Elasticネットワークを使用して設定された別のコンテナーにいずれかのコンテナーがアクセスしている場合は、適切なサービス名またはコンテナー名を使用する必要があることに注意してください。ただし、お使いのホストマシンからのトラフィックがいずれかのコンテナーにアクセスしている場合は、 docker-compose.yml で正しいポートが公開されていることを確認し、localhost経由でそのポートにアクセスする必要があります。
これらの設定はローカルでの開発を始めるための方法ですが、本番環境での使用は推奨されていないことにも注意してください。
実装 それでは、具体的な実装の方法を説明します。
最初に、基本スタックを簡単に確認してからいくつかの変更点に注目します。これには、ファイル構造、 .env ファイル、 docker-compose.yml などがあります。
ファイル構造
Elastic AgentとAPMの両方に、より具体的な設定を追加できるようにするため、ファイル構造に新しい kibana.yml とともにカスタムWebアプリのすべてのコードと設定を保持するための"app"フォルダーが追加されました。
.env .env ファイル( GitHubリンクはこちら )での変更点はほとんどありません。以下に示すとおり、Fleet、APM Server、APMシークレットトークン用の新しいポートのみが例外的に変更されています。 シークレットトークンは、後で行う実装時にAPM Serverへのリクエストを承認するために使用されます。詳しくは、 ドキュメント でご確認ください。
# Port to expose Fleet to the host
FLEET_PORT = 8220
# Port to expose APM to the host
APMSERVER_PORT = 8200
# APM Secret Token for POC environments only
ELASTIC_APM_SECRET_TOKEN = supersecrettoken
本ブログに記載しているパスワードやキーはデモ目的のものであり、実際の環境ではすぐに変更する必要があることにご注意ください。
docker-compose.yml docker-compose.yml ファイルには、基本スタックにいくつかの追加要素があります。つまり、"Fleet Server"と"webapp"用のコンテナーに、ボリュームの追加や、前述の証明書生成用サーバーリストへのfleet-serverの追加などが行われました。
ファイルの 全容はGitHubで確認できます が、その一部をここで説明します。
環境変数に関する注意
既存のサービスでは、証明書が指定された環境変数がコンテナーまたは対応する設定ファイルに渡される場合もあります。
.env ファイルと同様に、 docker-compose.yml の環境変数を使用すると、コンテナーに変数を渡せるようになります。この方法で、コンテナー上で変数"CA_CERT"を証明書パスと同等のものとして一度設定すると、その変数を必要に応じてmetricbeat.ymlファイルのどこでも使用できるようになります。たとえば、CA_CERTを更新する必要がある場合、 docker-compose.yml でパスを1度更新してから、metricbeatコンテナーを再デプロイするだけで済みます。
metricbeat01コンテナーと metricbeat.yml ファイルは、"CA_CERT"環境変数を渡してymlファイルで複数回使用する好例です。
環境変数の設定と使用について詳しくは、こちらをご覧ください 。
docker-compose.yml("fleet-server"コンテナー) "fleet-server"コンテナーを docker-compose.yml ファイル( GitHubリンクはこちら )に追加することで、Elastic Agentのイメージをプルする追加のコンテナが起動します。エージェントのイメージは、エッジデータの収集と、Fleet管理サーバーの設定に使用されるベースイメージの両方に使用されます。
これはローカルPOCであるため、証明書のチェックの厳格さを緩和するために、追加フラグをいくつか使用していることに注意してください。本番環境では、すべての証明書を適切に発行して検証する必要があります。
前述のように、通信用に2つのポートを公開しています。
ports :
- $ { FLEET_PORT }: 8220
- $ { APMSERVER_PORT }: 8200
"8220"は、Agent/Fleetの通信宛てのすべてのトラフィックを処理します。 "8200"は、APMサーバーに使用されるすべてのトラフィックを処理します。これはAgentがAPM統合機能を取り込んでいるためです。 主な環境設定の一部をここに示します。
注:シンセティックテストも設定して実行する場合は、代わりに"docker.elastic.co/beats/elastic-agent-complete:${STACK_VERSION}"のDockerイメージを使用する必要があります。これについて本記事では説明しませんが、詳しくは Elasticのドキュメント でご確認ください。
docker-compose.yml("kibana"コンテナー) "kibana"コンテナーには2点の変更が必要です( GitHub リンクはこちら)。1つ目は"volumes"セクションの、 docker-compose.yml ファイルと kibana.yml ファイルの間の非常に重要な接続です。この行は、ローカルの kibana.yml ファイルをDockerに"バインドマウント"して使用するように指示しています。
- ./ kibana . yml : /usr/ share / kibana / config / kibana . yml : ro
次に、環境変数の一番下に簡単な変更が追加され、もともと .env ファイルに設定されていたAPMシークレットトークンを通過できるようになっています。
- ELASTIC_APM_SECRET_TOKEN = $ { ELASTIC_APM_SECRET_TOKEN }
kibana.yml 新しいymlファイルが追加され、FleetとAgentを含めてKibanaを設定できるようになりました( GitHubリンクはこちら )。
特に、 xpack.fleet.packages を使用すると、パッケージがアセットを自動的にプルするように指定できます。
xpack . fleet . packages :
- name : fleet_server
version : latest
- name : system
...
また、 xpack.fleet.agentPolicies を使用すると、最初のFleetとAgentに使用される基本ポリシーを定義できます。
xpack . fleet . agentPolicies :
- name : Fleet - Server - Policy
id : fleet - server - policy
namespace : default
monitoring_enabled :
- logs
- metrics
...
UIを使用しないポリシーの設定について詳しくは、Elasticのドキュメントでご確認ください 。
また、Elastic APMと、関連するAPMパッケージアセットをサポートするポリシーも追加されています。
- name : apm - 1
package :
name : apm
inputs :
- type : apm
enabled : true
vars :
- name : host
value : 0.0 . 0.0 : 8200
- name : secret_token
value : $ { ELASTIC_APM_SECRET_TOKEN }
サーバーのURLとsecret_tokenを設定して、確実にアプリケーションが適切に通信できるようにします。
さらに、 telemetry.enabled: "true" も追加されました。これで、独自のKibanaインスタンスに対してElastic APMを実行し、APMの用途を広げることができます。
docker-compose.yml("webapp"コンテナー)
webapp :
build :
context : app
volumes :
- "/var/lib/docker/containers:/var/lib/docker/containers:ro"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro"
- "/proc:/hostfs/proc:ro"
- "/:/hostfs:ro"
ports :
- 8000 : 8000
ElasticのサンプルWebアプリでは、Dockerを使用したアプリケーションの構築とデプロイを支援するため、 dockerfile を使用しています。
このコンテナー設定は、"context: app"ビルドコマンドに大きく依存しています。Dockerでは、"app"がフォルダーであり、そのフォルダー内にDockerfileがあることが前提とされています。これらの属性はより具体的にすることもできますが、今回の目的を考えると、デフォルトの前提のままでまったく問題ありません。
Docker Composeは、このコンテナーをビルドする際、"app"フォルダーを読み取り、コンテナーで使用されるイメージをビルドする方法の指示が記述されたdockerfileを取得します。
また、ポート8000を公開するように指定し、Metribeatでリソースの監視に使用されているものと類似するいくつかの"ボリューム"を渡します。
app/dockerfile
# syntax=docker/dockerfile:1
FROM python : 3.9 - slim - buster
WORKDIR / app
COPY requirements . txt requirements . txt
RUN pip3 install - r requirements . txt
COPY main . py main . py
CMD [ "uvicorn" , "main:app" , "--host" , "0.0.0.0" , "--port" , "8000" , "--log-level" , "info" , "--workers" , "1" ]
これで、dockerfileは"python:3.9-slim-buster"イメージをベースにプルするようになっています。ここから/appフォルダーが作成され、requirements.txtファイルがコピーされ、pip3経由で要件がインストールされます。
その後、main.pyアプリケーションがコピーされ、main.pyに組み込まれたUvicornアプリケーションの実行を試みます。
注:キャッシングが目的の場合は、dockerfileでの操作の順番が重要です。dockerファイル内で呼び出されるファイルのいずれかを変更すると、キャッシュが破棄され、ファイルが新たにプルされます。通常は、最も頻繁に変更されるファイルをdockerfileの後ろの方に配置して、変更の頻度が低いか、変更が発生しないファイルがビルドプロセス用にキャッシュされたままでいられるようにします。
app/main.py main.pyアプリケーション( GitHub )は、 FastAPI と NiceGUI を組み合わせた非常にシンプルなアプリケーションです。mainアプリケーションはStarlette Elastic APM Agentにインストルメントされており、いくつかのボタンを使用して、エラーやメッセージを意図的にAPM環境にスローする呼び出しを行うことができます。
Python:
from elasticapm . contrib . starlette import ElasticAPM , make_apm_client
apm = make_apm_client ({
'SERVICE_NAME' : 'my_python_service' ,
'SECRET_TOKEN' : 'supersecrettoken' ,
'SERVER_URL' : 'http://fleet-server:8200' ,
'ENVIRONMENT' : 'development'
})
app = FastAPI ()
app . add_middleware ( ElasticAPM , client = apm )
apm . capture_message ( f "Custom Message: {message}" )
@app . get ( "/error" )
async def throw_error ():
try :
1 / 0
except Exception as e :
apm . capture_exception ()
return { "message" : "Failed Successfully :)" }
上記のコードスニペットでは、APMライブラリをインポートし、APMクライアントを作成して、FastAPIアプリケーションにミドルウェアを追加していることがわかります。
このアプリケーションは、Elastic APMを操作する方法のサンプルにすぎません。
Docker Compose up すべての設定が完了したので、クラスターを起動しましょう。
docker-compose upコマンドを使用すると、すべてのコンテナーが起動され、 https://localhost:5601 でKibanaにログインできるようになります。Kibana用に証明書を用意したため、HTTPSを使用する必要があり、ブラウザーに表示される証明書の警告をクリックする必要がある可能性がありますので注意してください。 ログインしたら、ハンバーガーメニュー > [Management](管理) > [Fleet] からFleetに移動できます。
移動したら、[Agents](エージェント)メニューの下に1つのホストが表示されます。[Fleet]ページでは、クラスターに登録したすべてのエージェントを詳しく確認できます。また、ポリシーを作成または変更したり、新しいエージェントを登録したり、グローバルFleet設定を更新したりすることもできます。
しかし、CPUとメモリの使用率のフィールドが更新されていないことにお気づきでしょうか。同様に、[Host](ホスト)のリンクをクリックすると、ログも作成されていないようです。さらに調べてみると、fleet-serverコンテナーのログに次のようなエラーが見つかりました。
{ "log.level" : "info" , "message" : "Attempting to reconnect to backoff(elasticsearch(http://localhost:9200)) with 17 reconnect attempt(s)" , "component" :{ "binary" : "metricbeat" , "dataset" : "elastic_agent.metricbeat" , "id" : "http/metrics-monitoring" , "type" : "http/metrics" }, "log" :{ "source" : "http/metrics-monitoring" }, "log.origin" :{ "file.line" : 139 , "file.name" : "pipeline/client_worker.go" }, "service.name" : "metricbeat" , "ecs.version" : "1.6.0" , "log.logger" : "publisher_pipeline_output" , "ecs.version" : "1.6.0" }
{ "log.level" : "error" , "message" : "Error dialing dial tcp 127.0.0.1:9200: connect: connection refused" , "component" :{ "binary" : "metricbeat" , "dataset" : "elastic_agent.metricbeat" , "id" : "http/metrics-monitoring" , "type" : "http/metrics" }, "log" :{ "source" : "http/metrics-monitoring" }, "service.name" : "metricbeat" , "ecs.version" : "1.6.0" , "log.logger" : "esclientleg" , "log.origin" :{ "file.line" : 38 , "file.name" : "transport/logging.go" }, "network" : "tcp" , "address" : "localhost:9200" , "ecs.version" : "1.6.0" }
これは、Elastic AgentがデフォルトでローカルのElasticsearchインスタンスにデータをロギングしようと試みていたことが原因であり、Docker環境としては正しい状態ではありません。
これ解決するには、[Fleet] > [Settings](設定)のUIで、いくつかの更新を行う必要があります。
では、見てみましょう。
出力の再構成と証明書の追加 [Fleet] > [Settings](設定)に移動したら、[Outputs](出力)セクションを確認して、 [Actions](アクション)ヘッダーの下にある [Edit] (編集)ボタンをクリックします。
これにより、インターフェースの右側からスライドアウトが表示され、デフォルトの出力を変更できるようになります。
[Hosts](ホスト)フィールドと[Elasticsearch CA trusted fingerprint](Elasticsearch CAの信頼されたフィンガープリント)フィールドを変更し、[Advanced YAML configuration](高度なYAML設定)セクションを変更します。
しかし、まだすべての情報が揃っているわけではありません。今度はターミナルに移動して情報を取得します。
まず、クラスターからCA証明書をプルする必要があります。パート1で使用したのと同じコマンドを使用します。
docker cp es-cluster-es01-1:/usr/share/elasticsearch/config/certs/ca/ca.crt /tmp/.
注:このコマンドは、 docker-compose.yml ファイルの実行元のディレクトリ、または .env ファイルで指定されている COMPOSE_PROJECT_NAME 変数によって異なります。
次に、証明書のフィンガープリントを取得する必要があります。そのためには、OpenSSLコマンドを使用できます。
openssl x509 -fingerprint -sha256 -noout -in /tmp/ca.crt | awk -F"=" {' print $2 '} | sed s/://g
これで、次のような値が提供されます。
5A7464CEABC54FA60CAD3BDF16395E69243B827898F5CCC93E5A38B8F78D5E72
最後に、証明書全体をyml形式に変換する必要があります。これは、"cat"コマンドを使用するか、テキストエディターで証明書を開くだけで実行できます。
cat /tmp/ca.crt
証明書のテキストを取得できたら、それをyml形式に追加し、これらすべての情報を先ほどのFleet設定画面に入力します。
[Hosts](ホスト)には「 https://es01:9200 」と入力します。Fleetサーバーをホストするコンテナーが、es01コンテナーと通信してデータを送信するしくみを理解しているためです。
[Elasticsearch CA trusted fingerprint](Elasticsearch CAの信頼されたフィンガープリント)フィールドに、生成されたフィンガープリントを入力します。
最後に、[Advanced YAML configuration](高度なYAML設定)に証明書のテキストを追加します。 これはyml設定であるため、スペースが正しく使用されていないとエラーがスローされます。
冒頭は以下のようになります。
ssl :
certificate_authorities :
- |
次に、証明書のテキストをペーストします。インデントが正しいことを確認してください。
例:
[Save and Apply Settings](設定を保存して適用) > [Save and Deploy](保存してデプロイ)を必ずクリックしてください。
Elastic Agentデータの確認 保存とデプロイが完了した後、エージェントタブに戻り、エージェント名をクリックすると、CPUとメモリーの使用率が適切に表示され、ログも作成されていることを確認できます。
ここから、[ View more agent metrics ](エージェントメトリックをさらに表示)をクリックしてエージェントダッシュボードに移動し、追加のデータを確認することもできます 。
Agentの監視に関する情報について詳しくは、 ドキュメント を確認してください。
Elastic APMデータの確認 ハンバーガーメニュー > [Observability](オブザーバビリティ) > [Overview](概要)に移動すると、流入してくるElastic APMメトリックの一部も確認できるようになります。
特に、[APM] > [Services](サービス)に移動すると、Kibanaとデモアプリケーションの両方を確認できます。
これで、サービスをドリルダウンして、Elastic APMがキャプチャしている情報の種類を理解できるようになります。
Elastic Stackによるトラブルシューティングとシームレスな拡張 「Elastic StackとDocker Composeを使いはじめる」シリーズのパート2では、さらなるセキュリティと、Elastic Agent、Fleet、Elastic APMなどの機能に注目しました。Elastic APMの実装時にも、Dockerfileを介したカスタムアプリケーションの追加が行われます。
こうすることで、機能の開発とテストのためのローカル学習プラットフォームが実現します。
Elastic APM Agentを組み込んでアプリケーションを監視すれば、今後のアプリケーションの機能強化とトラブルシューティングが大幅にしやすくなります。Elastic AgentとFleetサービスを使用することで、インストルメンテーションを簡単に拡張できるようになるのです。
今回実施したのはElastic AgentとElastic APMでしたが、この設定は OTelの設定 にも役立つことを覚えておいてください。
より本番環境に対応したクラスターへ移行する準備ができたら、 Elastic Cloud の機能を確認して、多くの統合を備えた本番環境にローカルで学習した内容をシームレスに移行する方法を確認してください。
本記事で説明したすべてのファイルは GitHubで入手できます 。質問やプルリクエストもお気軽にどうぞ。
本記事に記述されているあらゆる機能ないし性能のリリースおよびタイミングは、Elasticの単独裁量に委ねられます。現時点で提供されていないあらゆる機能ないし性能は、すみやかに提供されない可能性、または一切の提供が行われない可能性があります。