1"use strict";(globalThis.webpackChunkcoalesce_docs=globalThis.webpackChunkcoalesce_docs||[]).push([[5097],{76125(e,o,n){n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"catalog/integrations/data-viz/looker/index","title":"Looker","description":"Integrate Looker with the Catalog. Sync dashboards, looks, and metadata. Configure Catalog-managed or client-managed extraction.","source":"@site/docs/catalog/integrations/data-viz/looker/index.md","sourceDirName":"catalog/integrations/data-viz/looker","slug":"/catalog/integrations/data-viz/looker/","permalink":"/docs/catalog/integrations/data-viz/looker/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Looker","description":"Integrate Looker with the Catalog. Sync dashboards, looks, and metadata. Configure Catalog-managed or client-managed extraction.","keywords":["Looker","BI integration","Catalog","LookML","data visualization"],"processed":true},"sidebar":"catalogSidebar","previous":{"title":"Domo","permalink":"/docs/catalog/integrations/data-viz/domo"},"next":{"title":"Add an API Key to a Looker User","permalink":"/docs/catalog/integrations/data-viz/looker/add-an-api-key-to-a-looker-user"}}');var s=n(74848),r=n(28453);const i={title:"Looker",description:"Integrate Looker with the Catalog. Sync dashboards, looks, and metadata. Configure Catalog-managed or client-managed extraction.",keywords:["Looker","BI integration","Catalog","LookML","data visualization"],processed:!0},a=void 0,l={},d=[{value:"Requirements",id:"requirements",level:2},{value:"What Catalog Extracts From Looker",id:"what-catalog-extracts-from-looker",level:2},{value:"Catalog Managed",id:"catalog-managed",level:2},{value:"Client Managed",id:"client-managed",level:2},{value:"Doing a One Shot Extract",id:"doing-a-one-shot-extract",level:3},{value:"Running the Extraction Package",id:"running-the-extraction-package",level:3},{value:"Install the PyPI Package",id:"install-the-pypi-package",level:4},{value:"Run the PyPI Package",id:"run-the-pypi-package",level:4},{value:"Credentials",id:"credentials",level:4},{value:"Other Arguments",id:"other-arguments",level:4},{value:"How Looks and Dashboards Are Fetched",id:"how-looks-and-dashboards-are-fetched",level:4},{value:"Tuning Concurrency",id:"tuning-concurrency",level:4},{value:"Scheduling and Push to Catalog",id:"scheduling-and-push-to-catalog",level:3},{value:"Arguments",id:"arguments",level:4},{value:"Target Files",id:"target-files",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Lineage Drops After Database or Connection Changes",id:"lineage-drops-after-database-or-connection-changes",level:3},{value:"First Ingestion Runs Longer Than a Few Hours",id:"first-ingestion-runs-longer-than-a-few-hours",level:3},{value:"Looker Slows Down While the Extraction Runs",id:"looker-slows-down-while-the-extraction-runs",level:3},{value:"Looker Studio Versus LookML-Backed Looker Instances",id:"looker-studio-versus-lookml-backed-looker-instances",level:3},{value:"Cannot Validate API Credentials",id:"cannot-validate-api-credentials",level:3},{value:"Missing Dashboards or Explores After a Partial Git Migration",id:"missing-dashboards-or-explores-after-a-partial-git-migration",level:3},{value:"Browser Extension Panels Empty Inside Looker",id:"browser-extension-panels-empty-inside-looker",level:3}];function c(e){const o={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"Integrate Looker with the Catalog to sync dashboards, looks, and metadata."}),"\n",(0,s.jsxs)(o.p,{children:["After your Looker content syncs to Catalog, use the ",(0,s.jsx)(o.a,{href:"/docs/catalog/integrations/data-viz/looker/looker-chrome-extension",children:"Catalog browser extension in Looker"})," while viewing dashboards for descriptions, ownership, and related Catalog features."]}),"\n",(0,s.jsx)(o.h2,{id:"requirements",children:"Requirements"}),"\n",(0,s.jsx)(o.admonition,{title:"Warehouse Required",type:"warning",children:(0,s.jsx)(o.p,{children:"A Warehouse type integration must already be configured to complete the first ingestion of this integration."})}),"\n",(0,s.jsx)(o.p,{children:"To get things started with Looker in the Catalog, you will need:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Credentials of a Looker admin"}),"\n",(0,s.jsx)(o.li,{children:'An admin Looker API key. Follow the steps below "Create a Looker API Key"'}),"\n",(0,s.jsx)(o.li,{children:'Read-only access to your Looker Git repositories, one per LookML project. Follow the steps below "Provide access to your LookML"'}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"Related pages:"}),"\n",(0,s.jsx)(o.h2,{id:"what-catalog-extracts-from-looker",children:"What Catalog Extracts From Looker"}),"\n",(0,s.jsx)(o.p,{children:"Extraction reads two sources: the Looker API, and the LookML code in your Git repositories."}),"\n",(0,s.jsx)(o.p,{children:"From the Looker API:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Dashboards, with their tiles and filters"}),"\n",(0,s.jsx)(o.li,{children:"Looks, with the explore each one queries"}),"\n",(0,s.jsx)(o.li,{children:"Explores, with their dimensions, measures, and joins"}),"\n",(0,s.jsx)(o.li,{children:"LookML models, with the warehouse connections each model is allowed to use"}),"\n",(0,s.jsx)(o.li,{children:"Folders, users, groups, and roles"}),"\n",(0,s.jsx)(o.li,{children:"Warehouse connections and projects"}),"\n",(0,s.jsx)(o.li,{children:"30 days of content view history, which feeds dashboard popularity and frequent users"}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"From your LookML repositories:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"View files, which resolve each explore to the warehouse tables and columns behind it"}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"Looker objects appear in Catalog under Catalog's own names:"}),"\n",(0,s.jsxs)(o.table,{children:[(0,s.jsx)(o.thead,{children:(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.th,{children:"In Looker"}),(0,s.jsx)(o.th,{children:"In Catalog"})]})}),(0,s.jsxs)(o.tbody,{children:[(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:"Dashboard"}),(0,s.jsx)(o.td,{children:"Dashboard"})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:"Look"}),(0,s.jsx)(o.td,{children:"Tile"})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:"Explore"}),(0,s.jsx)(o.td,{children:"Viz model"})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:"Dimension or measure of an explore"}),(0,s.jsx)(o.td,{children:"Field"})]})]})]}),"\n",(0,s.jsx)(o.p,{children:"Catalog then computes lineage across those assets:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Warehouse table to explore, and on to the looks and dashboards built on it"}),"\n",(0,s.jsx)(o.li,{children:"Warehouse column to explore field, and on to the dashboards that display it"}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"Lineage stops wherever the warehouse side is missing: a table an Explore reads
1is only linked when your Warehouse integration ingests the database it lives in."}),"\n",(0,s.jsx)(o.h2,{id:"catalog-managed",children:"Catalog Managed"}),"\n",(0,s.jsxs)(o.p,{children:["Enter your credentials directly in the ",(0,s.jsx)(o.a,{href:"https://app.castordoc.com/settings/integrations",children:"Catalog App integration settings"}),". You need:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"base-url"}),": for example, ",(0,s.jsx)(o.code,{children:"http://looker.catalog.com"})]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"client-id"}),": API Key Client ID"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"client-secret"}),": API Key Client Secret"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["Give Catalog read-only access to your Looker Git repositories, one per LookML project. See how to ",(0,s.jsx)(o.a,{href:"/docs/catalog/integrations/data-viz/looker/provide-access-to-your-lookml",children:"provide access to your LookML code"}),"."]}),"\n",(0,s.jsx)(o.p,{children:"For your first sync, it can take up to 48 hours before ingestion completes. Catalog notifies you when it finishes."}),"\n",(0,s.jsxs)(o.p,{children:["If you prefer not to share credentials with Catalog, continue to ",(0,s.jsx)(o.a,{href:"#client-managed",children:"Client Managed"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"client-managed",children:"Client Managed"}),"\n",(0,s.jsx)(o.h3,{id:"doing-a-one-shot-extract",children:"Doing a One Shot Extract"}),"\n",(0,s.jsx)(o.p,{children:"For your trial, you can simply give us a one shot view of your BI tool. Run the extraction package below on a machine of your own, then send us the files it writes."}),"\n",(0,s.jsx)(o.h3,{id:"running-the-extraction-package",children:"Running the Extraction Package"}),"\n",(0,s.jsx)(o.h4,{id:"install-the-pypi-package",children:"Install the PyPI Package"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"pip install castor-extractor[looker]\n"})}),"\n",(0,s.jsxs)(o.p,{children:["For further details on the extractor PyPI package, see the ",(0,s.jsx)(o.a,{href:"https://pypi.org/project/castor-extractor/#pip-install",children:"castor-extractor PyPI page"}),"."]}),"\n",(0,s.jsx)(o.h4,{id:"run-the-pypi-package",children:"Run the PyPI Package"}),"\n",(0,s.jsx)(o.p,{children:"Once the package has been installed, you should be able to run the following command in your terminal:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"castor-extract-looker [arguments]\n"})}),"\n",(0,s.jsx)(o.p,{children:"The script will run and display logs as following:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"INFO - Extracting users from Looker API\nINFO - Fetched page 1 / 500 results\nINFO - Wrote output file: /tmp/catalog/1649079699-users.json\nINFO - Extracting folders from Looker API\nINFO - Wrote output file: /tmp/catalog/1649079699-folders.json\nINFO - Extracting looks from Looker API\nINFO - Wrote output file: /tmp/catalog/1649079699-looks.json\nINFO - Extracting dashboards from Looker API\nINFO - Wrote output file: /tmp/catalog/1649079699-dashboards.json\nINFO - Extracting lookml models from Looker API\nINFO - Wrote output file: /tmp/catalog/1649079699-lookml_models.json\nINFO - Extracting explores from Looker API\nINFO - Explore ecommerce/orders fetched\nINFO - Wrote output file: /tmp/catalog/1649079699-explores.json\n\n...\n\nINFO - Wrote output file: /tmp/catalog/1649079699-projects.json\nINFO - Wrote output file: /tmp/catalog/1649079699-summary.json\n"})}),"\n",(0,s.jsx)(o.h4,{id:"credentials",children:"Credentials"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-c"}),", ",(0,s.jsx)(o.code,{children:"--client-id"}),": API Key Client ID (mandatory)"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-s"}),", ",(0,s.jsx)(o.code,{children:"--client-secret"}),": API Key Client Secret (mandatory)"]}),"\n"]}),"\n",(0,s.jsx)(o.h4,{id:"other-arguments",children:"Other Arguments"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-b"}),", ",(0,s.jsx)(o.code,{children:"--base-url"}),": Looker base URL (mandatory)"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-o"}),", ",(0,s.jsx)(o.code,{children:"--output"}),": Target folder to store the extracted files (mandatory)"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-t"}),", ",(0,s.jsx)(o.code,{children:"--timeout"}),": Timeout (in s) parameter for Looker API"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"--log-to-stdout"}),": Will write all log outputs to ",(0,s.jsx)(o.code,{children:"stdout"})," instead of ",(0,s.jsx)(o.code,{children:"stderr"})]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-S"}),", ",(0,s.jsx)(o.code,{children:"--strict"}),": fails the extraction on the first item-level error, such as a look whose query no longer exists or an explore that no longer compiles. Without it, that item is skipped and the extraction carries on"]}),"\n"]}),"\n",(0,s.jsx)(o.h4,{id:"how-looks-and-dashboards-are-fetched",children:"How Looks and Dashboards Are Fetched"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"--search-per-folder"}),": fetches looks and dashboards folder by folder, one call per folder run in parallel, instead of one paginated search over the whole instance"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["Use ",(0,s.jsx)(o.code,{children:"--search-per-folder"})," when the instance-wide search returns fewer looks or dashboards than you expect, which happens on instances holding tens of thousands of them."]}),"\n",(0,s.jsx)(o.h4,{id:"tuning-concurrency",children:"Tuning Concurrency"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"--thread-pool-size"}),": number of parallel API calls, between 1 and 200, defaults to 20"]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"The thread pool drives the per-folder search above, the call that resolves each look to its explore, and the explore fetches. Lower it, to 5 for example, when extraction puts your Looker instance under more load than you want: fetching an explore compiles its LookML model server-side, so that concurrency lands on your own
1Looker infrastructure. Raising it past 10 gains nothing on the explore fetches, which stay within the connection pool of the Looker SDK."}),"\n",(0,s.jsxs)(o.p,{children:["Run any extractor command with ",(0,s.jsx)(o.code,{children:"--help"})," to print the full argument list."]}),"\n",(0,s.jsx)(o.h3,{id:"scheduling-and-push-to-catalog",children:"Scheduling and Push to Catalog"}),"\n",(0,s.jsx)(o.p,{children:"When moving out of trial, you'll want to refresh your Looker content in the Catalog. Here is how to do it:"}),"\n",(0,s.jsx)(o.p,{children:"The Catalog team will provide you with:"}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"Catalog Identifier"})," (an id for us to match your Looker files with your Catalog instance)"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"Catalog Token"})," An API Token"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["You can then use the ",(0,s.jsx)(o.code,{children:"castor-upload"})," command:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"castor-upload [arguments]\n"})}),"\n",(0,s.jsx)(o.h4,{id:"arguments",children:"Arguments"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-k"}),", ",(0,s.jsx)(o.code,{children:"--token"}),": Token provided by Catalog"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-s"}),", ",(0,s.jsx)(o.code,{children:"--source_id"}),": account id provided by Catalog"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-t"}),", ",(0,s.jsx)(o.code,{children:"--file_type"}),": source type to upload. Currently supported are ",0]}),"\n"]}),"\n",(0,s.jsx)(o.h4,{id:"target-files",children:"Target Files"}),"\n",(0,s.jsxs)(o.p,{children:["To specify the target files, provide ",(0,s.jsx)(o.strong,{children:"one"})," of the following:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-f"}),", ",(0,s.jsx)(o.code,{children:"--file_path"}),": to push a single file"]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"or"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"-d"}),", ",(0,s.jsx)(o.code,{children:"--directory_path"}),": to push several files at once (*)"]}),"\n"]}),"\n",(0,s.jsxs)(o.admonition,{title:"Directory Contents",type:"warning",children:[(0,s.jsxs)(o.p,{children:["(*) The tool will upload ",(0,s.jsx)(o.strong,{children:"all files"})," included in the given directory."]}),(0,s.jsx)(o.p,{children:"Make sure it contains only the extracted files before pushing."})]}),"\n",(0,s.jsx)(o.p,{children:"Then you'll have to schedule the script run and the push to the Catalog. Use your preferred scheduler to create this job."}),"\n",(0,s.jsx)(o.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(o.p,{children:"These scenarios apply to core Looker onboarding and first ingestion."}),"\n",(0,s.jsx)(o.h3,{id:"lineage-drops-after-database-or-connection-changes",children:"Lineage Drops After Database or Connection Changes"}),"\n",(0,s.jsxs)(o.p,{children:["When Explores resolve to a warehouse database your Warehouse integration does not ingest, lineage that depended on matching those tables can disappear after a successful Looker sync. That often follows a switch between development and production databases in LookML or a connection change. For symptoms, prevention, recovery steps, and verification, see ",(0,s.jsx)(o.a,{href:"/docs/catalog/navigate/lineage/lineage-troubleshooting#lineage-disappears-after-a-database-or-connection-change-in-lookml",children:"Lineage troubleshooting for Looker database and connection mismatches"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"first-ingestion-runs-longer-than-a-few-hours",children:"First Ingestion Runs Longer Than a Few Hours"}),"\n",(0,s.jsx)(o.p,{children:"Warehouse integrations must finish before visualization ingestion can complete. Large LookML repositories extend parsing time."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Resolution:"})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["Confirm the Warehouse integration listed under ",(0,s.jsx)(o.strong,{children:"Requirements"})," is healthy in ",(0,s.jsx)(o.strong,{children:"Settings > Integrations"}),"."]}),"\n",(0,s.jsx)(o.li,{children:"Verify read-only Git access to LookML still works from Catalog's perspective (SSH keys, tokens, branch protections)."}),"\n",(0,s.jsxs)(o.li,{children:["If ingestion stays unfinished beyond 48 hours while both prerequisites are green, contact ",(0,s.jsx)(o.a,{href:"mailto:[email protected]",children:"Coalesce Support"}),"."]}),"\n"]}),"\n",(0,s.jsx)(o.h3,{id:"looker-slows-down-while-the-extraction-runs",children:"Looker Slows Down While the Extraction Runs"}),"\n",(0,s.jsx)(o.p,{children:"Client-managed extraction calls the Looker API in parallel, and fetching an explore compiles its LookML model on your Looker instance. On a small instance, that c
1oncurrency is felt by everyone else using Looker at the same time."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Resolution:"})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["Lower ",(0,s.jsx)(o.code,{children:"--thread-pool-size"})," (default 20) until the load is acceptable, 5 for example."]}),"\n",(0,s.jsx)(o.li,{children:"Schedule the extraction outside your Looker peak hours."}),"\n"]}),"\n",(0,s.jsx)(o.h3,{id:"looker-studio-versus-lookml-backed-looker-instances",children:"Looker Studio Versus LookML-Backed Looker Instances"}),"\n",(0,s.jsx)(o.p,{children:"Looker Studio connections follow Google's OAuth and connector scopes. Classic Looker uses API keys and Git-backed LookML. Mixing setup steps between products causes auth errors."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Resolution:"})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsx)(o.li,{children:"Follow the integration path that matches your product (Looker with LookML vs Looker Studio OAuth apps)."}),"\n",(0,s.jsx)(o.li,{children:"After changing Google Cloud scopes for Looker Studio, wait for the provider cache to refresh before re-testing ingestion."}),"\n"]}),"\n",(0,s.jsx)(o.h3,{id:"cannot-validate-api-credentials",children:"Cannot Validate API Credentials"}),"\n",(0,s.jsx)(o.p,{children:"Wrong base URL format or revoked secrets surface as login failures in extractor logs."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Resolution:"})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["Confirm ",(0,s.jsx)(o.code,{children:"base-url"})," matches Looker's documented pattern (",(0,s.jsx)(o.code,{children:"https://company.looker.com"}),") without typos."]}),"\n",(0,s.jsx)(o.li,{children:"Rotate API keys in Looker admin, update Catalog credentials immediately, and revoke old secrets."}),"\n"]}),"\n",(0,s.jsx)(o.h3,{id:"missing-dashboards-or-explores-after-a-partial-git-migration",children:"Missing Dashboards or Explores After a Partial Git Migration"}),"\n",(0,s.jsx)(o.p,{children:"Catalog indexes what appears in the Looker API plus accessible LookML."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Resolution:"})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsx)(o.li,{children:"Confirm the Git branch Catalog reads matches production LookML."}),"\n",(0,s.jsx)(o.li,{children:"Run a fresh extraction after merges that rename explores or move files between folders."}),"\n"]}),"\n",(0,s.jsx)(o.h3,{id:"browser-extension-panels-empty-inside-looker",children:"Browser Extension Panels Empty Inside Looker"}),"\n",(0,s.jsx)(o.p,{children:"The Chrome extension depends on Catalog indexing your Looker assets first."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Resolution:"})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsx)(o.li,{children:"Finish at least one successful Looker ingestion before expecting extension tiles."}),"\n",(0,s.jsxs)(o.li,{children:["See ",(0,s.jsx)(o.a,{href:"/docs/catalog/integrations/data-viz/looker/looker-chrome-extension",children:"Catalog browser extension in Looker"})," for install steps."]}),"\n"]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453(e,o,n){n.d(o,{R:()=>i,x:()=>a});var t=n(96540);const s={},r=t.createContext(s);function i(e){const o=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]);
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.