<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Grafana Operator on Grafana Labs</title><link>https://grafana.com/docs/grafana/v12.4/as-code/infrastructure-as-code/grafana-operator/</link><description>Recent content in Grafana Operator on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/grafana/v12.4/as-code/infrastructure-as-code/grafana-operator/index.xml" rel="self" type="application/rss+xml"/><item><title>Manage folders, data sources, and dashboards using Grafana Operator</title><link>https://grafana.com/docs/grafana/v12.4/as-code/infrastructure-as-code/grafana-operator/operator-dashboards-folders-datasources/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/grafana/v12.4/as-code/infrastructure-as-code/grafana-operator/operator-dashboards-folders-datasources/</guid><content><![CDATA[&lt;h1 id=&#34;manage-folders-data-sources-and-dashboards-using-the-grafana-operator&#34;&gt;Manage folders, data sources, and dashboards using the Grafana Operator&lt;/h1&gt;
&lt;p&gt;This guide shows you how to manage data sources, folders, and dashboards using the Grafana Operator. You&amp;rsquo;ll create these resources declaratively using Kubernetes custom resources.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you begin, make sure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An existing Grafana Cloud stack&lt;/li&gt;
&lt;li&gt;Grafana Operator installed in your cluster, as shown in &lt;a href=&#34;/docs/grafana-cloud/as-code/infrastructure-as-code/grafana-operator/#installing-the-grafana-operator&#34;&gt;Grafana Operator Installation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;set-up-the-grafana-operator&#34;&gt;Set up the Grafana Operator&lt;/h2&gt;
&lt;p&gt;The Grafana Operator allows you to authenticate with your Grafana instance using the Grafana Custom Resource (CR).&lt;/p&gt;
&lt;h3 id=&#34;create-the-grafana-api-token-secret&#34;&gt;Create the Grafana API Token Secret&lt;/h3&gt;
&lt;p&gt;Store the Grafana API Token in a secret with the following content in a file named &lt;code&gt;grafana-token.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Secret
metadata:
  name: grafana-cloud-credentials
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
stringData:
  GRAFANA_CLOUD_INSTANCE_TOKEN: &amp;#39;&amp;lt;GRAFANA_API_KEY&amp;gt;&amp;#39;
type: Opaque&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_API_KEY&amp;gt;&lt;/code&gt;&lt;/em&gt;: API key from your Grafana instance. To create an API key, refer to &lt;a href=&#34;/docs/grafana/latest/administration/api-keys/&#34;&gt;Grafana API Key Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configure-the-grafana-custom-resource&#34;&gt;Configure the Grafana Custom Resource&lt;/h3&gt;
&lt;p&gt;Set up connection to your Grafana Cloud instance. Create a file named &lt;code&gt;grafana-cloud.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: grafana.integreatly.org/v1beta1
kind: Grafana
metadata:
  name: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
  labels:
    dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
spec:
  external:
    url: https://&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;.grafana.net/
    apiKey:
      name: grafana-cloud-credentials
      key: GRAFANA_CLOUD_INSTANCE_TOKEN&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of your Grafana Cloud stack&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;add-a-data-source&#34;&gt;Add a data source&lt;/h2&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This example uses the Prometheus data source. Note that the required arguments vary depending on the data source you select.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h3 id=&#34;create-a-data-source-configuration&#34;&gt;Create a data source configuration&lt;/h3&gt;
&lt;p&gt;Create and save a new YAML file &lt;code&gt;datasource.yml&lt;/code&gt; with your data source&amp;rsquo;s configuration:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDatasource
metadata:
  name: &amp;#39;&amp;lt;DATA_SOURCE_NAME&amp;gt;&amp;#39;
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
spec:
  instanceSelector:
    matchLabels:
      dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  allowCrossNamespaceImport: true
  datasource:
    access: proxy
    database: prometheus
    jsonData:
      timeInterval: 5s
      tlsSkipVerify: true
    name: &amp;#39;&amp;lt;DATA_SOURCE_NAME&amp;gt;&amp;#39;
    type: prometheus
    url: &amp;#39;&amp;lt;DATA_SOURCE_URL&amp;gt;&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;DATA_SOURCE_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of the data source to be added in Grafana&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;DATA_SOURCE_URL&amp;gt;&lt;/code&gt;&lt;/em&gt;: URL of your data source&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of your Grafana Cloud stack&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;add-a-dashboard-to-a-folder&#34;&gt;Add a dashboard to a folder&lt;/h3&gt;
&lt;p&gt;Use the following YAML definition to create a simple dashboard in the Grafana instance under a custom folder. If the folder defined under the &lt;code&gt;spec.folder&lt;/code&gt; field doesn&amp;rsquo;t exist, the operator creates it before placing the dashboard inside the folder.&lt;/p&gt;
&lt;p&gt;Prepare the dashboard configuration. In &lt;code&gt;dashboard.yml&lt;/code&gt;, define the dashboard and assign it to a folder:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: &amp;#39;&amp;lt;FOLDER_NAME&amp;gt;&amp;#39;
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
spec:
  instanceSelector:
    matchLabels:
      dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  folder: &amp;#39;&amp;lt;FOLDER_NAME&amp;gt;&amp;#39;
  json: &amp;gt;
    {
      &amp;#34;title&amp;#34;: &amp;#34;as-code dashboard&amp;#34;,
      &amp;#34;uid&amp;#34; : &amp;#34;ascode&amp;#34;
    }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;FOLDER_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of the folder in which you want the dashboard to be created&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of your Grafana Cloud stack&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;apply-the-kubernetes-manifests&#34;&gt;Apply the Kubernetes manifests&lt;/h2&gt;
&lt;p&gt;In a terminal, run the following commands from the directory where all of the above Kubernetes YAML definitions are located.&lt;/p&gt;
&lt;p&gt;Create Kubernetes Custom resources for all of the configurations:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;kubectl apply -f grafana-token.yml grafana-cloud.yml datasource.yml dashboard.yml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;validate-your-configuration&#34;&gt;Validate your configuration&lt;/h2&gt;
&lt;p&gt;After you apply the configurations, verify that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A new data source is visible in Grafana. In the following image, a data source named &lt;code&gt;InfluxDB&lt;/code&gt; was created.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/grafana-cloud/terraform/influxdb_datasource_tf.png&#34;
  alt=&#34;InfluxDB datasource&#34; width=&#34;1894&#34;
     height=&#34;342&#34;/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new dashboard and folder have been created in Grafana. In the following image, a dashboard named &lt;code&gt;InfluxDB Cloud Demos&lt;/code&gt; was created inside the &lt;code&gt;Demos&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/grafana-cloud/grizzly/grizzly-folder-dashboard-datasource.png&#34;
  alt=&#34;InfluxDB dashboard&#34; width=&#34;2550&#34;
     height=&#34;389&#34;/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ve successfully created a data source, folder, and dashboard using the Grafana Operator. Your Grafana resources are now managed declaratively through Kubernetes custom resources.&lt;/p&gt;
&lt;p&gt;To learn more about managing Grafana:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://grafana.github.io/grafana-operator/docs/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Operator documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/docs/grafana/latest/administration/provisioning/#dashboards&#34;&gt;Grafana dashboard provisioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/docs/grafana/latest/administration/provisioning/#data-sources&#34;&gt;Grafana data source provisioning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="manage-folders-data-sources-and-dashboards-using-the-grafana-operator">Manage folders, data sources, and dashboards using the Grafana Operator&lt;/h1>
&lt;p>This guide shows you how to manage data sources, folders, and dashboards using the Grafana Operator. You&amp;rsquo;ll create these resources declaratively using Kubernetes custom resources.&lt;/p></description></item><item><title>Manage dashboards with GitOps using ArgoCD</title><link>https://grafana.com/docs/grafana/v12.4/as-code/infrastructure-as-code/grafana-operator/manage-dashboards-argocd/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/grafana/v12.4/as-code/infrastructure-as-code/grafana-operator/manage-dashboards-argocd/</guid><content><![CDATA[&lt;h1 id=&#34;manage-grafana-dashboards-with-gitops-using-argocd&#34;&gt;Manage Grafana dashboards with GitOps using ArgoCD&lt;/h1&gt;
&lt;p&gt;This guide shows you how to set up a continuous deployment pipeline using ArgoCD to synchronize your Grafana dashboards with a Git repository. You&amp;rsquo;ll use the Grafana Dashboard Custom Resource provided by the Grafana Operator to manage dashboard configurations declaratively.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you begin, make sure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An existing Grafana Cloud stack&lt;/li&gt;
&lt;li&gt;A Kubernetes cluster with Grafana Operator installed, as shown in &lt;a href=&#34;/docs/grafana-cloud/as-code/infrastructure-as-code/grafana-operator/#installing-the-grafana-operator&#34;&gt;Grafana Operator Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ArgoCD installed on your Kubernetes cluster. Refer to the &lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/getting_started/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ArgoCD Installation Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Git repository to store your dashboard configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;set-up-your-git-repository&#34;&gt;Set up your Git repository&lt;/h2&gt;
&lt;p&gt;Create a directory structure in your repository to organize your Grafana and dashboard configurations. For this tutorial, create a folder named &lt;code&gt;grafana&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;set-up-the-grafana-operator&#34;&gt;Set up the Grafana Operator&lt;/h2&gt;
&lt;p&gt;The Grafana Operator allows you to authenticate with the Grafana instance using the Grafana Custom Resource (CR).&lt;/p&gt;
&lt;h3 id=&#34;create-the-grafana-api-token-secret&#34;&gt;Create the Grafana API Token Secret&lt;/h3&gt;
&lt;p&gt;Store the Grafana API Token in a secret. Create a file named &lt;code&gt;grafana-token.yml&lt;/code&gt; in the &lt;code&gt;grafana&lt;/code&gt; folder in your Git repository:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Secret
metadata:
  name: grafana-cloud-credentials
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
stringData:
  GRAFANA_CLOUD_INSTANCE_TOKEN: &amp;#39;&amp;lt;GRAFANA_API_KEY&amp;gt;&amp;#39;
type: Opaque&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_API_KEY&amp;gt;&lt;/code&gt;&lt;/em&gt;: API key from your Grafana instance. To create an API key, refer to &lt;a href=&#34;/docs/grafana/latest/administration/api-keys/&#34;&gt;Grafana API Key Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configure-the-grafana-custom-resource&#34;&gt;Configure the Grafana Custom Resource&lt;/h3&gt;
&lt;p&gt;Set up the connection to your Grafana Cloud instance. Create a file named &lt;code&gt;grafana-cloud.yml&lt;/code&gt; in the &lt;code&gt;grafana&lt;/code&gt; folder in your Git repository:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: grafana.integreatly.org/v1beta1
kind: Grafana
metadata:
  name: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
  labels:
    dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
spec:
  external:
    url: https://&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;.grafana.net/
    apiKey:
      name: grafana-cloud-credentials
      key: GRAFANA_CLOUD_INSTANCE_TOKEN&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of your Grafana Cloud Stack&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;add-dashboards-to-your-git-repository&#34;&gt;Add dashboards to your Git repository&lt;/h2&gt;
&lt;p&gt;In your &lt;code&gt;grafana&lt;/code&gt; directory, create a sub-folder called &lt;code&gt;dashboards&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This guide shows you how to create three separate dashboards. For all dashboard configurations, replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&lt;/code&gt;&lt;/em&gt;: Name of your Grafana Cloud Stack&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where the &lt;code&gt;grafana-operator&lt;/code&gt; is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;create-a-simple-dashboard&#34;&gt;Create a simple dashboard&lt;/h3&gt;
&lt;p&gt;Under the &lt;code&gt;dashboards&lt;/code&gt; folder, create a file named &lt;code&gt;simple-dashboard.yaml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: grafanadashboard-sample
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
spec:
  resyncPeriod: 30s
  instanceSelector:
    matchLabels:
      dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  json: &amp;gt;
    {
    &amp;#34;id&amp;#34;: null,
    &amp;#34;title&amp;#34;: &amp;#34;Simple Dashboard&amp;#34;,
    &amp;#34;tags&amp;#34;: [],
    &amp;#34;style&amp;#34;: &amp;#34;dark&amp;#34;,
    &amp;#34;timezone&amp;#34;: &amp;#34;browser&amp;#34;,
    &amp;#34;editable&amp;#34;: true,
    &amp;#34;hideControls&amp;#34;: false,
    &amp;#34;graphTooltip&amp;#34;: 1,
    &amp;#34;panels&amp;#34;: [],
    &amp;#34;time&amp;#34;: {
        &amp;#34;from&amp;#34;: &amp;#34;now-6h&amp;#34;,
        &amp;#34;to&amp;#34;: &amp;#34;now&amp;#34;
    },
    &amp;#34;timepicker&amp;#34;: {
        &amp;#34;time_options&amp;#34;: [],
        &amp;#34;refresh_intervals&amp;#34;: []
    },
    &amp;#34;templating&amp;#34;: {
        &amp;#34;list&amp;#34;: []
    },
    &amp;#34;annotations&amp;#34;: {
        &amp;#34;list&amp;#34;: []
    },
    &amp;#34;refresh&amp;#34;: &amp;#34;5s&amp;#34;,
    &amp;#34;schemaVersion&amp;#34;: 17,
    &amp;#34;version&amp;#34;: 0,
    &amp;#34;links&amp;#34;: []
    }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;create-a-dashboard-from-configmap&#34;&gt;Create a dashboard from ConfigMap&lt;/h3&gt;
&lt;p&gt;Under the &lt;code&gt;dashboards&lt;/code&gt; folder, create a file named &lt;code&gt;dashboard-from-cm.yaml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: dashboard-definition
  namespace: &amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;
data:
  json: &amp;gt;
    {
    &amp;#34;id&amp;#34;: null,
    &amp;#34;title&amp;#34;: &amp;#34;Simple Dashboard from ConfigMap&amp;#34;,
    &amp;#34;tags&amp;#34;: [],
    &amp;#34;style&amp;#34;: &amp;#34;dark&amp;#34;,
    &amp;#34;timezone&amp;#34;: &amp;#34;browser&amp;#34;,
    &amp;#34;editable&amp;#34;: true,
    &amp;#34;hideControls&amp;#34;: false,
    &amp;#34;graphTooltip&amp;#34;: 1,
    &amp;#34;panels&amp;#34;: [],
    &amp;#34;time&amp;#34;: {
        &amp;#34;from&amp;#34;: &amp;#34;now-6h&amp;#34;,
        &amp;#34;to&amp;#34;: &amp;#34;now&amp;#34;
    },
    &amp;#34;timepicker&amp;#34;: {
        &amp;#34;time_options&amp;#34;: [],
        &amp;#34;refresh_intervals&amp;#34;: []
    },
    &amp;#34;templating&amp;#34;: {
        &amp;#34;list&amp;#34;: []
    },
    &amp;#34;annotations&amp;#34;: {
        &amp;#34;list&amp;#34;: []
    },
    &amp;#34;refresh&amp;#34;: &amp;#34;5s&amp;#34;,
    &amp;#34;schemaVersion&amp;#34;: 17,
    &amp;#34;version&amp;#34;: 0,
    &amp;#34;links&amp;#34;: []
    }
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: grafanadashboard-from-configmap
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
spec:
  instanceSelector:
    matchLabels:
      dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  configMapRef:
    name: dashboard-definition
    key: json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;create-a-dashboard-from-grafanacom&#34;&gt;Create a dashboard from Grafana.com&lt;/h3&gt;
&lt;p&gt;Under the &lt;code&gt;dashboards&lt;/code&gt; folder, create a file named &lt;code&gt;dashboard-from-id.yaml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: node-exporter-latest
  namespace: &amp;#39;&amp;lt;GRAFANA_OPERATOR_NAMESPACE&amp;gt;&amp;#39;
spec:
  instanceSelector:
    matchLabels:
      dashboards: &amp;#39;&amp;lt;GRAFANA_CLOUD_STACK_NAME&amp;gt;&amp;#39;
  grafanaCom:
    id: 1860&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;configure-argocd-to-sync-the-git-repository&#34;&gt;Configure ArgoCD to sync the Git repository&lt;/h2&gt;
&lt;p&gt;After you commit all changes to Git, log in to the ArgoCD user interface or use the CLI.&lt;/p&gt;
&lt;h3 id=&#34;create-an-argocd-application&#34;&gt;Create an ArgoCD application&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Using the UI:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;New App&lt;/strong&gt; and complete the form with your Git repository details and the path to your &lt;code&gt;grafana&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Directory Recurse&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Set the sync policy to &lt;strong&gt;Automatic&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Using the CLI:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Prepare an application manifest named &lt;code&gt;argo-application.yaml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: Grafana
  namespace: &amp;#39;&amp;lt;ARGOCD_NAMESPACE&amp;gt;&amp;#39;
spec:
  destination:
    name: &amp;#39;&amp;#39;
    namespace: &amp;#39;&amp;#39;
    server: &amp;#39;https://kubernetes.default.svc&amp;#39;
  source:
    path: &amp;#39;&amp;lt;PATH_TO_GRAFANA_FOLDER&amp;gt;&amp;#39;
    repoURL: &amp;#39;&amp;lt;GIT_REPO_URL&amp;gt;&amp;#39;
    targetRevision: HEAD
    directory:
      recurse: true
  sources: []
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
    retry:
      limit: 2
    backoff:
      duration: 5s
      maxDuration: 3m0s
      factor: 2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the placeholders with your values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;GIT_REPO_URL&amp;gt;&lt;/code&gt;&lt;/em&gt;: URL of your Git repository&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;PATH_TO_GRAFANA_FOLDER&amp;gt;&lt;/code&gt;&lt;/em&gt;: Path to the &lt;code&gt;grafana&lt;/code&gt; folder in your repository&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;&amp;lt;ARGOCD_NAMESPACE&amp;gt;&lt;/code&gt;&lt;/em&gt;: Namespace where ArgoCD is deployed in your Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create the application in ArgoCD:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;kubectl apply -f argo-application.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;verify-sync-status-in-argocd&#34;&gt;Verify sync status in ArgoCD&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Monitor the newly created ArgoCD application to ensure it successfully syncs your dashboard configuration&lt;/li&gt;
&lt;li&gt;Visit the ArgoCD dashboard and check the sync status. If it&amp;rsquo;s successful, your Grafana dashboards should be up to date with the configuration from your Git repository&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;update-your-dashboards&#34;&gt;Update your dashboards&lt;/h2&gt;
&lt;p&gt;To update an existing dashboard:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make changes to the dashboard JSON configuration in your Git repository&lt;/li&gt;
&lt;li&gt;Commit and push the changes&lt;/li&gt;
&lt;li&gt;ArgoCD detects the update and synchronizes the changes to your Custom Resource&lt;/li&gt;
&lt;li&gt;Grafana Operator then syncs changes to the Grafana instance&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;validate-your-dashboard-updates&#34;&gt;Validate your dashboard updates&lt;/h3&gt;
&lt;p&gt;Log in to your Grafana dashboard and confirm that the changes are applied. You should see the dashboard updates reflected in the Grafana UI.&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ve successfully set up a GitOps workflow to manage Grafana dashboards using ArgoCD and the Grafana Operator. Your dashboards are now version-controlled and can be consistently deployed across environments. This approach provides a reliable and auditable way to manage observability dashboards and scale your operations.&lt;/p&gt;
&lt;p&gt;To learn more about managing Grafana using Grafana Operator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://grafana.github.io/grafana-operator/docs/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Operator documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/docs/grafana/latest/administration/provisioning/#dashboards&#34;&gt;Grafana dashboard provisioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/user-guide/best_practices/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ArgoCD best practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;additional-considerations&#34;&gt;Additional considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You can install the Grafana Operator&amp;rsquo;s Helm Chart using ArgoCD to manage your setup with GitOps&lt;/li&gt;
&lt;li&gt;You can follow a similar setup for Grafana Folders and other resources&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="manage-grafana-dashboards-with-gitops-using-argocd">Manage Grafana dashboards with GitOps using ArgoCD&lt;/h1>
&lt;p>This guide shows you how to set up a continuous deployment pipeline using ArgoCD to synchronize your Grafana dashboards with a Git repository. You&amp;rsquo;ll use the Grafana Dashboard Custom Resource provided by the Grafana Operator to manage dashboard configurations declaratively.&lt;/p></description></item></channel></rss>