PageSourceSearch

https://www.checklyhq.com/_next/static/chunks/pages/product/pulumi-provider-41b1081a528ec8c4.js

js checklyhq.com collected 2026-09-24 15:25:48 UTC 38,589 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7929,8648],{17963:(e,t,s)=>{"use strict";s.d(t,{A:()=>o});var r=s(14232);let a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,s)=>s?s.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)},c=function(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return t.filter((e,t,s)=>!!e&&""!==e.trim()&&s.indexOf(e)===t).join(" ").trim()};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,r.forwardRef)((e,t)=>{let{color:s="currentColor",size:a=24,strokeWidth:i=2,absoluteStrokeWidth:o,className:n="",children:d,iconNode:m,...h}=e;return(0,r.createElement)("svg",{ref:t,...l,width:a,height:a,stroke:s,strokeWidth:o?24*Number(i)/Number(a):i,className:c("lucide",n),...h},[...m.map(e=>{let[t,s]=e;return(0,r.createElement)(t,s)}),...Array.isArray(d)?d:[d]])}),o=(e,t)=>{let s=(0,r.forwardRef)((s,l)=>{let{className:o,...n}=s;return(0,r.createElement)(i,{ref:l,iconNode:t,className:c("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...n})});return s.displayName=a(e),s}},58725:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(17963).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},66668:(e,t,s)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/product/pulumi-provider",function(){return s(73235)}])},67651:(e,t,s)=>{"use strict";s.d(t,{AH:()=>o,Bt:()=>d,Et:()=>i,Wr:()=>n,Y1:()=>m,YM:()=>h,jk:()=>r,y1:()=>a});let r=[{src:"/logos/customers/vercel.svg",alt:"Vercel",scale:.75},{src:"/logos/customers/carhartt.svg",alt:"Carhartt",scale:1},{src:"/logos/customers/crowdstrike-white.svg",alt:"CrowdStrike",scale:1},{src:"/logos/customers/airbus.svg",alt:"Airbus",scale:.8},{src:"/logos/customers/fanatics.svg",alt:"Fanatics",scale:1},{src:"/logos/customers/mistral-white.svg",alt:"Mistral",scale:1},{src:"/logos/customers/servicenow-white.svg",alt:"ServiceNow",scale:1},{src:"/logos/customers/gofundme.svg",alt:"GoFundMe",scale:1},{src:"/logos/customers/hopper.svg",alt:"Hopper",scale:1},{src:"/logos/customers/1password.png",alt:"1Password",scale:1},{src:"/logos/customers/fastly.svg",alt:"Fastly",scale:.75},{src:"/logos/customers/total-wine.svg",alt:"Total Wine",scale:1}],a=[{src:"/logos/customers/carhartt.svg",alt:"Carhartt",scale:1},{src:"/logos/customers/airbus.svg",alt:"Airbus",scale:.8},{src:"/logos/customers/crowdstrike-white.svg",alt:"CrowdStrike",scale:1,marginTop:6},{src:"/logos/customers/vercel.svg",alt:"Vercel",scale:.75},{src:"/logos/customers/fanatics.svg",alt:"Fanatics",scale:1},{src:"/logos/customers/mistral-white.svg",alt:"Mistral",scale:1},{src:"/logos/customers/puma.svg",alt:"Puma",scale:1},{src:"/logos/customers/servicenow-white.svg",alt:"ServiceNow",scale:1},{src:"/logos/customers/gofundme.svg",alt:"GoFundMe",scale:1},{src:"/logos/customers/total-wine.svg",alt:"Total Wine",scale:1},{src:"/logos/customers/hopper.svg",alt:"Hopper",scale:1},{src:"/logos/customers/fastly.svg",alt:"Fastly",scale:.75},{src:"/logos/customers/1password.png",alt:"1Password",scale:1}],c=[{alt:"Airbus",height:"h-6",width:90,h:24,onDark:"airbus.svg",onLight:"airbus-dark.svg"},{alt:"CrowdStrike",height:"h-6",width:90,h:24,onDark:"crowdstrike-white.svg",onLight:"crowdstrike-dark.svg"},{alt:"Mistral",height:"h-6",width:90,h:24,onDark:"mistral-white.svg",onLight:"mistral-dark.svg"},{alt:"Puma",height:"h-9",width:135,h:36,onDark:"puma.svg",onLight:"puma-dark.svg"},{alt:"Carhartt",height:"h-6",width:90,h:24,onDark:"carhartt.svg",onLight:"carhartt-dark.svg"},{alt:"ServiceNow",height:"h-6",width:90,h:24,onDark:"servicenow-white.svg",onLight:"servicenow-dark.svg"},{alt:"Total Wine",height:"h-6",width:90,h:24,onDark:"total-wine.svg",onLight:"total-wine-dark.svg"},{alt:"Wiz",height:"h-9",width:135,h:36,onDark:"wiz-white.svg",onLight:"wiz.svg"}],l=e=>t=>({src:"/logos/customers/".concat(t[e]),alt:t.alt,height:t.height,width:t.width,h:t.h}),i=c.map(l("onDark")),o=c.map(l("onLight")),n=[{src:"/logos/customers/vercel.svg",alt:"Vercel",scale:.75},{src:"/logos/customers/1password.png",alt:"1Password",scale:1},{src:"/logos/customers/airbus.svg",alt:"Airbus",scale:.85},{src:"/logos/customers/crowdstrike-white.svg",alt:"CrowdStrike",scale:1},{src:"/logos/customers/fanatics.svg",alt:"Fanatics",scale:1},{src:"/logos/customers/fastly.svg",alt:"Fastly",scale:.75},{src:"/logos/customers/mistral-white.svg",alt:"Mistral",scale:1},{src:"/logos/customers/puma.svg",alt:"Puma",scale:.95},{src:"/logos/customers/servicenow-white.svg",alt:"ServiceNow",scale:1},{src:"/logos/customers/gofundme.svg",alt:"GoFundMe",scale:1},{src:"/logos/customers/total-wine.svg",alt:"Total Wine",scale:1},{src:"/logos/customers/hopper.svg",alt:"Hopper",scale:1},{src:"/logos/customers/carhartt.svg",alt:"Carhartt",scale:1},{src:"/logos/customers/wiz-white.svg",alt:"Wiz",scale:.85}],d=[{src:"/logos/customers/vercel.svg",alt:"Vercel",scale:.75},{src:"/logos/customers/1password.png",alt:"1Password",scale:1},{src:"/logos/customers/crowdstrike-white.svg",alt:"CrowdStrike",scale:1},{src:"/logos/customers/wiz-white.svg",alt:"Wiz",scale:.9},{src:"/logos/customers/servicenow-white.svg",alt:"ServiceNow",scale:1},{src:"/logos/customers/mistral-white.svg",alt:"Mistral",scale:1},{src:"/logos/customers/fastly.svg",alt:"Fastly",scale:.75},{src:"/logos/customers/chronosphere.webp",alt:"Chronosphere",scale:1},{src:"/logos/customers/railway.png",alt:"Railway",scale:.9}
1,{src:"/logos/customers/render.svg",alt:"Render",scale:.8},{src:"/logos/customers/commercetools.svg",alt:"commercetools",scale:.9},{src:"/logos/customers/locus.png",alt:"Locus",scale:1},{src:"/logos/customers/loyal-health.png",alt:"Loyal Health",scale:1},{src:"/logos/customers/solutia.webp",alt:"Solutia",scale:1}],m=[{src:"/logos/customers/truelayer.svg",alt:"TrueLayer",scale:.85},{src:"/logos/customers/dvag.png",alt:"DVAG",scale:.7}],h=[{src:"/logos/customers/carhartt.svg",alt:"Carhartt",scale:1},{src:"/logos/customers/puma.svg",alt:"Puma",scale:1},{src:"/logos/customers/total-wine.svg",alt:"Total Wine",scale:1},{src:"/logos/customers/fanatics.svg",alt:"Fanatics",scale:1},{src:"/logos/customers/gofundme.svg",alt:"GoFundMe",scale:1},{src:"/logos/customers/hopper.svg",alt:"Hopper",scale:1},{src:"/logos/customers/vio.svg",alt:"Vio.com",scale:.8}]},73235:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>E});var r=s(37876),a=s(14232),c=s(67651),l=s(54587),i=s.n(l),o=s(48230),n=s.n(o),d=s(62867),m=s(58725),h=s(69065),u=s(93628),p=s(97642),g=s(28908);let x="Checkly's Pulumi Provider for Monitoring",y="Define and manage Checkly monitors as code with the Pulumi provider. Version, review, and deploy checks alongside your infrastructure.",v="".concat(h.pc,"/product/pulumi-provider/"),f={url:"https://images.prismic.io/checklyhq/1cd5e53f-cacf-406c-9dc5-d5418b766369_Checkly-Pulumi-hero.png?auto=compress,format",alt:"Checkly's Pulumi provider for monitoring",width:1500,height:1335},w="/docs/integrations/iac/pulumi/overview/",k={prompt:"#20DF66",cmd:"#ffffff",dim:"#6e85a4",add:"#4fd785",ok:"#4fd785",type:"#c5d3e6",name:"#dbe5f2",url:"#5cb0ff",warn:"#e8a33d"},b=e=>{let{title:t,lines:s,compact:a}=e;return(0,r.jsxs)("div",{className:"w-full rounded-xl overflow-hidden border border-blue-300/20",style:{background:"#0a1929"},children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 px-4 py-2.5 border-b border-white/[0.06]",style:{background:"#0d2137"},children:[(0,r.jsxs)("span",{className:"flex gap-1.5","aria-hidden":"true",children:[(0,r.jsx)("span",{className:"w-2.5 h-2.5 rounded-full",style:{background:"#FF5F56"}}),(0,r.jsx)("span",{className:"w-2.5 h-2.5 rounded-full",style:{background:"#FFBD2E"}}),(0,r.jsx)("span",{className:"w-2.5 h-2.5 rounded-full",style:{background:"#27C93F"}})]}),(0,r.jsx)("span",{className:"ml-2 font-mono text-[11px] text-gray-500",children:t})]}),(0,r.jsx)("div",{className:"overflow-x-auto font-mono ".concat(a?"p-4 text-[11.5px] leading-[1.7]":"p-5 md:p-6 text-[12.5px] md:text-[13px] leading-[1.75]"),children:s.map((e,t)=>(0,r.jsx)("div",{className:"whitespace-pre",children:0===e.length?" ":e.map((e,t)=>(0,r.jsx)("span",{style:{color:e.c?k[e.c]:"#93a8c4"},children:e.t},t))},t))})]})},j=e=>[{t:"$ ",c:"prompt"},{t:e,c:"cmd"}],N=e=>[{t:e,c:"dim"}],C=e=>[{t:e}],P=[j("pulumi up"),C("Previewing update (prod)"),[],[{t:"     Type                            Name                   Plan",c:"dim"}],[{t:" +   ",c:"add"},{t:"pulumi:pulumi:Stack             ",c:"type"},{t:"acme-monitoring-prod   ",c:"name"},{t:"create",c:"add"}],[{t:" +   ",c:"add"},{t:"├─ checkly:index:AlertChannel   ",c:"type"},{t:"oncall-slack           ",c:"name"},{t:"create",c:"add"}],[{t:" +   ",c:"add"},{t:"├─ checkly:index:CheckGroup     ",c:"type"},{t:"storefront             ",c:"name"},{t:"create",c:"add"}],[{t:" +   ",c:"add"},{t:"├─ checkly:index:Check          ",c:"type"},{t:"products-api           ",c:"name"},{t:"create",c:"add"}],[{t:" +   ",c:"add"},{t:"└─ checkly:index:Check          ",c:"type"},{t:"add-to-cart            ",c:"name"},{t:"create",c:"add"}],[],C("Resources:"),[{t:"    + 5 to create",c:"add"}],[],[{t:"Do you want to perform this update? ",c:"type"},{t:"yes",c:"cmd"}],C("Updating (prod)"),[],[{t:"     Type                            Name                   Status",c:"dim"}],[{t:" +   ",c:"add"},{t:"pulumi:pulumi:Stack             ",c:"type"},{t:"acme-monitoring-prod   ",c:"name"},{t:"created (6s)",c:"ok"}],[{t:" +   ",c:"add"},{t:"├─ checkly:index:AlertChannel   ",c:"type"},{t:"oncall-slack           ",c:"name"},{t:"created (1s)",c:"ok"}],[{t:" +   ",c:"add"},{t:"├─ checkly:index:CheckGroup     ",c:"type"},{t:"storefront             ",c:"name"},{t:"created (1s)",c:"ok"}],[{t:" +   ",c:"add"},{t:"├─ checkly:index:Check          ",c:"type"},{t:"products-api           ",c:"name"},{t:"created (2s)",c:"ok"}],[{t:" +   ",c:"add"},{t:"└─ checkly:index:Check          ",c:"type"},{t:"add-to-cart            ",c:"name"},{t:"created (2s)",c:"ok"}],[],C("Resources:"),[{t:"    + 5 created",c:"add"}],[],C("Duration: 6s")],S=[{n:"01",title:"Define a check",description:"A checkly.Check is a Pulumi resource like any other. Point a BROWSER check at the Playwright spec in your repo, pick the regions and cadence, and Pulumi tracks it in state from here on.",file:"checks.ts",code:'// checks.ts\nimport { readFileSync } from "fs"\nimport * as checkly from "@checkly/pulumi"\n\n// The Playwright spec lives next to the app code it exercises\nexport const addToCart = new checkly.Check("add-to-cart", {\n  name: "Add to cart",\n  type: "BROWSER",\n  activated: true,\n  frequency: 5,\n  locations: ["us-east-1", "eu-central-1"],\n  tags: ["pulumi", "storefront"],\n  script: readFileSync("./__checks__/add-to-cart.spec.ts", "utf-8"),\n})'},{n:"02",title:"Group related checks",description:"A checkly.CheckGroup carries shared locations, tags, and concurrency. Checks join it through groupId, which resolves from the group output at deploy time. No ID copied out of a dashboard.",file:"checks.ts",code:'// checks.ts\nconst storefront = new checkly.CheckGroup("storefront", {\n  name: "Storefront",\n  activated: true,\n  concurrency: 2,\n  apiCheckDefaults: {},\n  locations: ["us-east-1", "eu-central-1"],\n  tags: ["pulumi", "storefront"],\n  useGlobalAlertSettings: true,\n})\n\nnew checkly.Check("add-to-cart", {\n  name: "Add to cart",\n  type: "BROWSER",\n  activated: true,\n  frequency: 5,\n  locations: ["us-east-1", "eu-central-1"],\n  script: readFileSync("./__checks__/add-to-cart.spec.ts", "utf-8"),\n  // Group membership is a resource reference, not a copied ID\n  groupId: storefront.id.apply((id) => parseInt(id)),\n})'},{n:"03",title:"Add an alert channel",description:"A checkly.AlertChannel for Slack, email, Opsgenie, PagerDuty, or a webhook. Subscribe the group once and every check inside it pages the same place. The webhook URL stays in your environment, not in the file.",file:"alerts.ts",code:'// alerts.ts\nconst oncallSlack = new checkly.AlertChannel("oncall-slack", {\n  slack: {\n    url: process.env.SLACK_WEBHOOK_URL!,\n    channel: "#oncall-storefront",\n  },\n})\n\nconst storefront = new checkly.CheckGroup("storefront", {\n  name: "Storefront",\n  activated: true,\n  concurrency: 2,\n  apiCheckDefaults: {},\n  locations: ["us-east-1", "eu-central-1"],\n  tags: ["pulumi", "storefront"],\n  useGlobalAlertSettings: true,\n  // Every check in the group inherits this subscription\n  alertChannelSubscriptions: [\n    { activated: true, channelId: oncallSlack.id.apply((id) => parseInt(id)) },\n  ],\n})'}],T=[{n:"01",title:"Create a Pulumi project",description:"Install the Pulumi CLI, then scaffold a project in the language your infra already uses.",lines:[j("mkdir acme-monitoring && cd acme-monitoring"),j("pulumi new typescript"),N("project name: (acme-monitoring)"),N("stack name: (dev) prod"),[{t:"Created stack ",c:"dim"},{t:"'prod'",c:"name"}],C("Your new project is ready to go!")]},{n:"02",title:"Install the provider",description:"One package. Python, Go, and .NET teams install pulumi-checkly, the Go module, or Pulumi.Checkly instead.",lines:[j("npm install @checkly/pulumi"),[],[{t:"added 1 package in 2s",c:"dim"}]]},{n:"03",title:"Provide your credentials",description:"Your account ID and an API key from app.checklyhq.com. Set them as environment variables, or store them on the stack with pulumi config set so the whole team shares them.",lines:[j("export CHECKLY_ACCOUNT_ID=<your-account-id>"),j("export CHECKLY_API_KEY=cu_<your-api-key>"),[],N("# or, scoped to the stack and encrypted at rest:"),j("pulumi config set checkly:accountId <your-account-id>"),j("pulumi config set checkly:apiKey cu_<your-api-key> --secret")]},{n:"04",title:"Preview, then apply",description:"pulumi up shows the diff first. Confirm it and the checks exist in Checkly seconds later, tracked in state.",lines:[j("pulumi up"),C("Previewing update (prod)"),[],[{t:" +   ",c:"add"},{t:"checkly:index:Check   ",c:"type"},{t:"products-api   ",c:"name"},{t:"create",c:"add"}],[],[{t:"Do you want to perform this update? ",c:"type"},{t:"yes",c:"cmd"}],[{t:" +   ",c:"add"},{t:"checkly:index:Check   ",c:"type"},{t:"products-api   ",c:"name"},{t:"created (2s)",c:"ok"}]]}],I=["Check","CheckGroup","AlertChannel","PlaywrightCheckSuite","UrlMonitor","TcpMonitor","DnsMonitor","IcmpMonitor","HeartbeatMonitor","PrivateLocation","StatusPage","Dashboard","MaintenanceWindow","EnvironmentVariable","Snippet"],A=["TypeScript / JavaScript","Python","Go",".NET"],L=[{question:"What is the Checkly Pulumi provider?",answer:"A Pulumi resource provider, published as @checkly/pulumi on npm and in the Pulumi registry, that lets you declare Checkly checks, groups, alert channels, status pages, private locations, and the rest of your monitoring setup as resources in a Pulumi program. pulumi up creates and updates them the same way it manages your cloud infrastru
1cture."},{question:"Which languages does the provider support?",answer:"TypeScript and JavaScript via @checkly/pulumi, Python via pulumi-checkly, Go via github.com/checkly/pulumi-checkly/sdk/v2/go/checkly, and .NET via the Pulumi.Checkly NuGet package. Use whichever language the rest of your Pulumi program is written in."},{question:"Should I use the Pulumi provider or the Checkly CLI?",answer:"The Checkly CLI is the primary monitoring-as-code path: TypeScript constructs, npx checkly test to run checks locally and in CI before deploying, and the deepest coverage of new features. Pick the Pulumi provider when your team already manages infrastructure in Pulumi and wants monitors in the same program, state, and review flow. Both talk to the same Checkly account."},{question:"How do I authenticate the provider?",answer:"Provide a Checkly account ID and API key. Set them as the CHECKLY_ACCOUNT_ID and CHECKLY_API_KEY environment variables, or store them on the stack with pulumi config set checkly:accountId and pulumi config set checkly:apiKey --secret so the key is encrypted in your stack config."},{question:"Can I edit Pulumi-managed checks in the Checkly web app?",answer:"You can, but you should not. Manage each resource either through Pulumi or through the UI. Editing a Pulumi-managed check in the UI creates drift that the next pulumi up will overwrite or fail on. Keep Pulumi-managed monitoring in Pulumi."},{question:"Which Checkly resources can I create with Pulumi?",answer:"Check (API and browser), PlaywrightCheckSuite, CheckGroup, AlertChannel, UrlMonitor, TcpMonitor, DnsMonitor, IcmpMonitor, HeartbeatMonitor, PrivateLocation, StatusPage and StatusPageService, Dashboard, MaintenanceWindow, EnvironmentVariable, Snippet, and ClientCertificate. The full reference lives in the Pulumi registry."},{question:"Does Checkly also have a Terraform provider?",answer:"Yes. The Terraform provider covers the same resources for teams standardised on HashiCorp tooling. Pulumi, Terraform, and the Checkly CLI all manage the same account, so pick the one your infrastructure already speaks."}];function _(e){let{question:t,answer:s}=e,[c,l]=(0,a.useState)(!1),i=(0,a.useRef)(null),[o,n]=(0,a.useState)(0);return(0,a.useEffect)(()=>{i.current&&n(i.current.scrollHeight)},[s]),(0,r.jsxs)("div",{className:"border border-blue-300/20 transition-[border-color] duration-200 ease-out hover:border-blue-300/35",children:[(0,r.jsxs)("button",{type:"button","aria-expanded":c,className:"flex justify-between items-center px-8 py-6 w-full text-left text-white cursor-pointer md:px-10",onClick:()=>l(e=>!e),children:[(0,r.jsx)("span",{className:"text-lg select-none",children:t}),(0,r.jsx)(m.A,{className:"w-5 h-5 shrink-0",style:{transform:c?"rotate(180deg)":"rotate(0deg)",transition:"transform 200ms cubic-bezier(0.23, 1, 0.32, 1)"}})]}),(0,r.jsx)("div",{ref:i,style:{maxHeight:c?"".concat(o,"px"):"0px",opacity:+!!c,transition:c?"max-height 260ms cubic-bezier(0.23, 1, 0.32, 1), opacity 240ms ease-out":"max-height 160ms cubic-bezier(0.23, 1, 0.32, 1), opacity 120ms ease-out",overflow:"hidden"},children:(0,r.jsx)("div",{className:"px-8 pb-8 text md:px-10",children:(0,r.jsx)("p",{children:s})})})]})}function E(){let[e,t]=(0,a.useState)(!1),s=(0,a.useRef)(null);return(0,a.useEffect)(()=>{let e=new IntersectionObserver(s=>{let[r]=s;r.isIntersecting&&(t(!0),e.disconnect())},{threshold:.15});return s.current&&e.observe(s.current),()=>e.disconnect()},[]),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.bV,{title:x,description:y,canonical:v,openGraph:{url:v,title:x,description:y,images:[f]},additionalLinkTags:(0,u.N)(v)}),(0,r.jsx)(g.A,{slug:"pulumi-provider",variant:"product",url:v,title:x,description:y,image:f.url,faqs:L}),(0,r.jsxs)("div",{className:"theme-dark",children:[(0,r.jsx)("section",{className:"pt-20 pb-24 section section-feature-hero sm:pt-24 2xl:pt-28",children:(0,r.jsx)("div",{className:"container",children:(0,r.jsxs)("div",{className:"grid grid-cols-1 gap-12 items-center lg:grid-cols-2 lg:gap-16",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("span",{className:"hero-enter hero-enter-1 inline-flex items-center gap-2 px-3.5 py-1.5 text-sm font-medium rounded-full border text-blue-200/80 border-blue-300/20",style:{background:"rgba(0, 117, 255, 0.06)"},children:[(0,r.jsx)("span",{className:"font-mono text-xs text-checkly-blue",children:"@checkly/pulumi"}),"Checkly Pulumi Provider"]}),(0,r.jsxs)("h1",{className:"mt-5 text-4xl hero-enter hero-enter-2 title md:text-4xl lg:text-5xl text-balance",children:["Monitors in the ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"same Pulumi program"}
1)," as the infrastructure they watch"]}),(0,r.jsx)("p",{className:"mt-6 max-w-lg hero-enter hero-enter-3 text",children:"Declare Checkly checks, groups, and alert channels as Pulumi resources in TypeScript, Python, Go, or .NET. They ship in the same pull request as the service, preview in the same plan, and land with the same pulumi up."}),(0,r.jsxs)("div",{className:"flex flex-row flex-wrap gap-3 items-center mt-10 hero-enter hero-enter-4",children:[(0,r.jsx)("a",{href:"https://app.checklyhq.com/signup",className:"whitespace-nowrap button button-primary button-sm",children:"Start for free"}),(0,r.jsx)(n(),{href:w,className:"whitespace-nowrap button button-secondary button-sm",children:"Read the docs"})]})]}),(0,r.jsxs)("div",{className:"relative hero-enter hero-enter-3",children:[(0,r.jsx)("div",{className:"absolute pointer-events-none",style:{inset:"12% 4% -16px",background:"radial-gradient(ellipse at 50% 100%, rgba(59,130,246,0.22) 0%, transparent 70%)",filter:"blur(28px)",zIndex:0}}),(0,r.jsx)("div",{className:"relative",style:{zIndex:1},children:(0,r.jsx)(p.z,{title:"index.ts",code:'// index.ts\nimport * as checkly from "@checkly/pulumi"\n\nnew checkly.Check("products-api", {\n  name: "Products API",\n  type: "API",\n  activated: true,\n  frequency: 5,\n  locations: ["us-east-1", "eu-central-1"],\n  tags: ["pulumi", "storefront"],\n  degradedResponseTime: 3000,\n  maxResponseTime: 10000,\n  request: {\n    method: "GET",\n    url: "https://api.acme.dev/v1/products",\n    assertions: [\n      { source: "STATUS_CODE", comparison: "EQUALS", target: "200" },\n      { source: "JSON_BODY", property: "$.items", comparison: "NOT_EMPTY" },\n    ],\n  },\n  useGlobalAlertSettings: true,\n})',size:"sm"})})]})]})})}),(0,r.jsxs)("section",{ref:s,className:"pt-6 pb-20",children:[(0,r.jsx)("div",{className:"container px-4 mx-auto mb-6",style:{opacity:+!!e,transform:e?"translateY(0)":"translateY(24px)",transition:"opacity 0.45s cubic-bezier(0.23, 1, 0.32, 1), transform 0.45s cubic-bezier(0.23, 1, 0.32, 1)"},children:(0,r.jsx)("h2",{className:"mx-auto max-w-xl font-medium text-center text-md text",children:"Trusted by teams that keep monitoring in version control"})}),(0,r.jsx)("div",{className:"container",style:{opacity:+!!e,transform:e?"translateY(0)":"translateY(24px)",transition:"opacity 0.45s cubic-bezier(0.23, 1, 0.32, 1) 0.08s, transform 0.45s cubic-bezier(0.23, 1, 0.32, 1) 0.08s"},children:(0,r.jsx)("div",{className:"grid grid-cols-2 gap-y-7 gap-x-8 justify-items-center items-center px-4 mx-auto max-w-5xl sm:grid-cols-3 sm:px-0 md:grid-cols-4 lg:grid-cols-6",children:c.jk.map((e,t)=>(0,r.jsx)("div",{className:"flex justify-center items-center",style:{width:"".concat(128*e.scale,"px"),height:"40px"},children:(0,r.jsx)(i(),{src:e.src,alt:e.alt,width:128*e.scale,height:40*e.scale,className:"object-contain opacity-70 filter brightness-0 invert",style:{width:"auto",height:"auto"},unoptimized:!0})},t))})})]}),(0,r.jsx)("section",{className:"py-16 md:py-24",children:(0,r.jsxs)("div",{className:"container",children:[(0,r.jsxs)("div",{className:"mb-12 max-w-3xl",children:[(0,r.jsxs)("h2",{className:"text-4xl title md:text-5xl text-balance",children:["Your infrastructure is declared. Your monitoring is the"," ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"exception"})]}),(0,r.jsx)("p",{className:"mt-5 text-lg text",children:"Most teams that run Pulumi still click monitors together in a dashboard, so the checks drift from the services they watch and nobody reviews the change. The provider closes that gap: a check is a resource next to the load balancer it tests."})]}),(0,r.jsxs)("div",{className:"grid grid-cols-1 border-t border-l border-blue-300/20 lg:grid-cols-3",children:[(0,r.jsxs)("div",{className:"p-8 border-r border-b border-blue-300/20 bg-white/[0.02]",children:[(0,r.jsx)("h3",{className:"text-xl font-medium text-white title",children:"One program, one plan, one apply"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-gray-400",children:"Checks live in the same stack as the service. pulumi preview shows the monitor changes beside the infra changes, and one pulumi up lands both. Resource references resolve at deploy time, so a check can target the URL Pulumi just created."}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2 mt-5",children:["pulumi preview","pulumi up","stack state","resource refs"].map(e=>(0,r.jsx)("span",{className:"px-2.5 py-1 font-mono text-[11px] rounded-md border text-blue-200/80 border-blue-300/20 bg-white/[0.02]",children:e},e))})]}),(0,r.jsxs)("div",{className:"p-8 border-r border-b border-blue-300/20 bg-white/[0.02]",children:[(0,r.jsx)("h3",{className:"text-xl font-medium text-white title",children:"The language you already write"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-gray-400",children:"The provider ships as an SDK for every major Pulumi language. Loop over services to generate checks, share a locations constant, wrap a check in a function your whole org calls. It is code, so it composes."}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2 mt-5",children:A.map(e=>(0,r.jsx)("span",{className:"px-2.5 py-1 font-mono text-[11px] rounded-md border text-blue-200/80 border-blue-300/20 bg-white/[0.02]",children:e},e))})]}),(0,r.jsxs)("div",{className:"p-8 border-r border-b border-blue-300/20 bg-white/[0.02]",children:[(0,r.jsx)("h3",{className:"text-xl font-medium text-white title",children:"Every Checkly resource"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-gray-400",children:"Not just checks. Groups, alert channels, status pages, private locations, maintenance windows, and environment variables are all resources, so the whole monitoring setup is reproducible from the repo."}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2 mt-5",children:I.map(e=>(0,r.jsx)("span",{className:"px-2.5 py-1 font-mono text-[11px] rounded-md border text-blue-200/80 border-blue-300/20 bg-white/[0.02]",children:e},e))})]})]})]})}),(0,r.jsx)("section",{className:"py-20 md:py-28",children:(0,r.jsxs)("div",{className:"container",children:[(0,r.jsxs)("div",{className:"mb-14 max-w-2xl",children:[(0,r.jsxs)("h2",{className:"text-4xl title md:text-5xl text-balance",children:["From one check to a ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"paged team"})," in three resources"]}),(0,r.jsx)("p",{className:"mt-5 text-lg text",children:"Define a check, group it with its neighbours, subscribe the group to an alert channel. Each step is a Pulumi resource that references the one before it."})]}),(0,r.jsx)("div",{className:"space-y-12",children:S.map((e,t)=>(0,r.jsxs)("div",{className:"grid grid-cols-1 gap-8 items-center lg:grid-cols-2 lg:gap-14 ".concat(t%2==1?"lg:[&>*:first-child]:order-2":""),children:[(0,r.jsxs)("div",{className:"lg:pr-6",children:[(0,r.jsxs)("div",{className:"flex gap-4 items-baseline",children:[(0,r.jsx)("span",{className:"font-mono text-2xl font-semibold text-checkly-blue",children:e.n}),(0,r.jsx)("h3",{className:"text-2xl font-medium title md:text-3xl",children:e.title})]}),(0,r.jsx)("p",{className:"mt-4 text-lg text",children:e.description})]}),(0,r.jsx)("div",{className:"flex justify-center items-center w-full min-w-0",children:(0,r.jsx)(p.z,{title:e.file,code:e.code,size:"sm"})})]},e.n))})]})}),(0,r.jsx)("section",{className:"py-20 md:py-28",children:(0,r.jsxs)("div",{className:"container gap-16 sidebar-container",children:[(0,r.jsxs)("div",{className:"section-sidebar lg:max-w-[40%]",children:[(0,r.jsxs)("h2",{className:"mb-6 text-3xl title md:text-4xl text-balance",children:["See the diff ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"before"})," anything changes in production"]}),(0,r.jsx)("p",{className:"mb-8 text-lg text",children:"pulumi up previews every create, update, and delete against the stack state and waits for a yes. A renamed alert channel or a t
1ightened assertion shows up as a line in the plan, reviewed by the same people who review the infra."}),(0,r.jsx)("ul",{className:"space-y-4",children:["Preview and apply in one command, or gate apply behind CI approval","Stack state means drift is detectable, and a rollback is a git revert","Separate stacks for dev, staging, and prod with per-stack config","Resource outputs (check IDs, group IDs) flow into other resources"].map((e,t)=>(0,r.jsxs)("li",{className:"flex gap-3 items-start",children:[(0,r.jsx)(i(),{src:"/images/Blue Check.png",alt:"",width:20,height:20,className:"mt-0.5 shrink-0"}),(0,r.jsx)("span",{className:"text",children:e})]},t))})]}),(0,r.jsx)("div",{className:"flex justify-center items-center w-full min-w-0 lg:flex-1",children:(0,r.jsx)(b,{title:"acme-monitoring \xb7 prod",lines:P})})]})}),(0,r.jsx)("section",{className:"py-16 md:py-24",children:(0,r.jsxs)("div",{className:"container",children:[(0,r.jsxs)("div",{className:"mb-12 max-w-3xl",children:[(0,r.jsxs)("h2",{className:"text-4xl title md:text-5xl text-balance",children:["Three ways to write monitoring as code. ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"Pick one."})]}),(0,r.jsx)("p",{className:"mt-5 text-lg text",children:"The Checkly CLI is the primary path and gets new features first. The Pulumi and Terraform providers are for teams whose infrastructure already lives in one of those tools and who want monitoring in the same place. All three manage the same account."})]}),(0,r.jsxs)("div",{className:"grid grid-cols-1 border-t border-l border-blue-300/20 md:grid-cols-3",children:[(0,r.jsxs)("div",{className:"p-8 border-r border-b border-blue-300/20 bg-white/[0.02]",children:[(0,r.jsx)("span",{className:"font-mono text-[11px] uppercase tracking-wider text-gray-400",children:"primary path"}),(0,r.jsx)("h3",{className:"mt-2 text-xl font-medium text-white title",children:"Checkly CLI"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-gray-400",children:"TypeScript constructs, npx checkly test to run checks locally and in CI before deploying, and the fastest access to new check types. Start here unless you have a reason not to."}),(0,r.jsx)(n(),{href:"/product/monitoring-as-code/",className:"inline-flex items-center mt-5 text-sm font-medium text-checkly-blue hover:underline",children:"Monitoring as code with the CLI"})]}),(0,r.jsxs)("div",{className:"p-8 border-r border-b border-blue-300/20 bg-white/[0.02]",children:[(0,r.jsx)("span",{className:"font-mono text-[11px] uppercase tracking-wider text-checkly-blue",children:"this page"}),(0,r.jsx)("h3",{className:"mt-2 text-xl font-medium text-white title",children:"Pulumi provider"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-gray-400",children:"Your infra is a Pulumi program. Monitors become resources in it, in the same language, previewed and applied with the same command. Manage each resource in Pulumi or in the UI, never both."}),(0,r.jsx)("a",{href:"https://www.pulumi.com/registry/packages/checkly/",className:"inline-flex items-center mt-5 text-sm font-medium text-checkly-blue hover:underline",target:"_blank",rel:"noreferrer",children:"Provider reference on the Pulumi registry"})]}),(0,r.jsxs)("div",{className:"p-8 border-r border-b border-blue-300/20 bg-white/[0.02]",children:[(0,r.jsx)("span",{className:"font-mono text-[11px] uppercase tracking-wider text-gray-400",children:"sibling"}),(0,r.jsx)("h3",{className:"mt-2 text-xl font-medium text-white title",children:"Terraform provider"}),(0,r.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-gray-400",children:"The same resources in HCL for teams standardised on Terraform. Same account, same checks, different state file."}),(0,r.jsx)(n(),{href:"/product/terraform-provider/",className:"inline-flex items-center mt-5 text-sm font-medium text-checkly-blue hover:underline",children:"Checkly Terraform provider"})]})]})]})}),(0,r.jsx)("section",{className:"py-20 md:py-28",children:(0,r.jsxs)("div",{className:"container",children:[(0,r.jsxs)("div",{className:"mb-14 max-w-2xl",children:[(0,r.jsxs)("h2",{className:"text-4xl title md:text-5xl text-balance",children:["Get started in ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"four steps"})]}),(0,r.jsxs)("p",{className:"mt-5 text-lg text",children:["From an empty directory to a check running in production. The full walkthrough, including the Playwright example, is in the"," ",(0,r.jsx)(n(),{href:w,className:"text-checkly-blue hover:underline",children:"Pulumi provider docs"}),"."]})]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-8 lg:grid-cols-2",children:T.map(e=>(0,r.jsxs)("div",{className:"flex flex-col p-6 border border-blue-300/20 rounded-2xl bg-white/[0.02] md:p-8",children:[(0,r.jsxs)("div",{className:"flex gap-4 items-baseline",children:[(0,r.jsx)("span",{className:"font-mono text-xl font-semibold text-checkly-blue",children:e.n}),(0,r.jsx)("h3",{className:"text-xl font-medium title md:text-2xl",children:e.title})]}),(0,r.jsx)("p",{className:"mt-3 mb-6 text-sm leading-relaxed text-gray-400",children:e.description}),(0,r.jsx)("div",{className:"mt-auto",children:(0,r.jsx)(b,{title:"zsh",lines:e.lines,compact:!0})})]},e.n))}),(0,r.jsx)("div",{className:"p-8 mt-16 border border-blue-300/20 rounded-2xl md:p-10 bg-white/[0.02]",children:(0,r.jsxs)("div",{className:"flex flex-col gap-6 justify-between items-start md:flex-row md:items-center",children:[(0,r.jsxs)("div",{className:"max-w-xl",children:[(0,r.jsx)("h3",{className:"text-xl font-medium text-white title",children:"One owner per resource"}),(0,r.jsx)("p",{className:"mt-2 text-sm leading-relaxed text-gray-400",children:"Resources created by Pulumi should be changed through Pulumi. Editing them in the Checkly web app creates drift the next pulumi up will over
1write or fail on. If you want to explore in the UI first, do it on checks Pulumi does not manage."})]}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2.5",children:["@checkly/pulumi 2.x","pulumi-checkly","Pulumi.Checkly","open source on GitHub"].map(e=>(0,r.jsx)("span",{className:"px-3.5 py-2 font-mono text-xs rounded-lg border text-blue-200/80 border-blue-300/20 bg-white/[0.02]",children:e},e))})]})})]})}),(0,r.jsx)("section",{className:"py-20 md:py-24",children:(0,r.jsxs)("div",{className:"container sidebar-container",children:[(0,r.jsxs)("div",{className:"section-sidebar",children:[(0,r.jsx)("h2",{className:"mb-6 text-3xl title md:text-4xl",children:"Frequently asked questions"}),(0,r.jsx)("p",{className:"text mb-8 max-w-[350px]",children:"Everything you need to know about running Checkly monitoring from a Pulumi program."})]}),(0,r.jsx)("div",{className:"flex-1 w-full",children:(0,r.jsx)("div",{className:"space-y-4",children:L.map((e,t)=>(0,r.jsx)(_,{question:e.question,answer:e.answer},t))})})]})}),(0,r.jsx)("section",{className:"py-24",children:(0,r.jsx)("div",{className:"container",children:(0,r.jsxs)("div",{className:"mx-auto max-w-4xl text-center",children:[(0,r.jsxs)("h2",{className:"mb-6 text-4xl font-medium title md:text-5xl lg:text-6xl text-balance",children:["Put monitoring in the ",(0,r.jsx)("span",{className:"text-checkly-blue",children:"same pull request"})]}),(0,r.jsx)("p",{className:"mx-auto mb-8 max-w-2xl text-lg text",children:"Install @checkly/pulumi, declare a check next to the service it watches, and run pulumi up. The next review of your infra includes the monitoring too."}),(0,r.jsxs)("div",{className:"flex flex-col gap-4 justify-center items-center sm:flex-row",children:[(0,r.jsx)("a",{href:"https://app.checklyhq.com/signup",className:"button button-checkly-blue",children:"Start for free"}),(0,r.jsx)(n(),{href:"/demo-request/",className:"button button-secondary",children:"Book a demo"})]}),(0,r.jsx)("p",{className:"mt-4 text-sm text-gray-500",children:"No credit card required."})]})})})]})]})}},93628:(e,t,s)=>{"use strict";s.d(t,{N:()=>c});let r={"":"/home.md","/pricing":"/pricing.md","/product/api-monitoring":"/product/api-monitoring.md","/product/monitoring-as-code":"/product/monitoring-as-code.md","/product/synthetic-monitoring":"/product/synthetic-monitoring.md","/product/traces":"/product/traces.md","/product/uptime-monitoring":"/product/uptime-monitoring.md","/product/dashboards":"/product/dashboards.md","/product/private-locations":"/product/private-locations.md","/product/status-pages":"/product/status-pages.md","/product/tcp-monitoring":"/product/tcp-monitoring.md","/product/terraform-provider":"/product/terraform-provider.md","/product/pulumi-provider":"/product/pulumi-provider.md","/cli":"/cli.md","/ai-reliability":"/ai-reliability.md","/availability/methodology":"/availability/methodology.md","/datadog-alternative":"/datadog-alternative.md","/new-relic-alternative":"/new-relic-alternative.md","/alternative-pingdom":"/alternative-pingdom.md"};var a=s(69065);function c(e){if(!e)return[];let t=e;if(/^https?:\/\//i.test(e))try{t=new URL(e).pathname}catch(e){return[]}return[{rel:"alternate",type:"text/markdown",href:"".concat(a.pc).concat(function(e){let t=(e.startsWith("/")?e:"/".concat(e)).replace(/\/+$/,"").toLowerCase(),s=r[t];return s||(t?"".concat(t,".md"):"/home.md")}(t))}]}},97642:(e,t,s)=>{"use strict";s.d(t,{z:()=>i});var r=s(37876),a=s(70008),c=s.n(a);s(65791),s(32271),s(17634);let l={md:{title:"px-5 py-3",titleText:"text-[12px]",body:"py-5",line:"text-[13.5px] leading-[1.75]",gutter:"pr-4 pl-5",gutterWidth:"3.5rem",code:"pr-10"},sm:{title:"px-4 py-2.5",titleText:"text-[11px]",body:"py-3.5",line:"text-[11.5px] leading-[1.6]",gutter:"pr-3 pl-4",gutterWidth:"2.75rem",code:"pr-8"},xs:{title:"px-3.5 py-2",titleText:"text-[10px]",body:"py-3",line:"text-[10px] leading-[1.55]",gutter:"pr-2.5 pl-3.5",gutterWidth:"2.25rem",code:"pr-6"}},i=e=>{let{code:t,title:s,className:a,size:i="md"}=e,o=t.trimEnd(),n=function(e){let t=[];return e.split("\n").map(e=>{var s;let r=t.join("");for(let r of null!=(s=e.match(/<span[^>]*>|<\/span>/g))?s:[])"</span>"===r?t.pop():t.push(r);return r+e+"</span>".repeat(t.length)})}(c().highlight(o,c().languages.typescript,"typescript")),d=l[i];return(0,r.jsxs)("div",{className:"w-full rounded-xl overflow-hidden bg-[#0a1929] ".concat(a||""),children:[s&&(0,r.jsx)("div",{className:"border-b border-white/[0.06] ".concat(d.title),children:(0,r.jsx)("span",{className:"font-mono text-gray-500 ".concat(d.titleText),children:s})}),(0,r.jsx)("div",{className:"overflow-x-auto ".concat(d.body),style:{WebkitMaskImage:"linear-gradient(to right, #000 calc(100% - 1.5rem), transparent)",maskImage:"linear-gradient(to right, #000 calc(100% - 1.5rem), transparent)"},children:n.map((e,t)=>(0,r.jsxs)("div",{className:"flex items-baseline font-mono whitespace-pre ".concat(d.line),children:[(0,r.jsx)("span",{className:"select-none text-right shrink-0 inline-block ".concat(d.gutter),style:{color:"#3a4a5c",minWidth:d.gutterWidth},children:t+1}),(0,r.jsx)("span",{className:d.code,dangerouslySetInnerHTML:{__html:e||" "}})]},t))})]})}}},e=>{e.O(0,[1679,8908,636,6593,8792],()=>e(e.s=66668)),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.