diff --git a/jsonnet/kube-prometheus/components/grafana.libsonnet b/jsonnet/kube-prometheus/components/grafana.libsonnet
index eb208123c4cd0d1cb11666ab7ec01e9c27614851..939fbbc3e40988ca5fc4d642d630de6740781222 100644
--- a/jsonnet/kube-prometheus/components/grafana.libsonnet
+++ b/jsonnet/kube-prometheus/components/grafana.libsonnet
@@ -26,45 +26,54 @@ local defaults = {
   rawDashboards: {},
   folderDashboards: {},
   containers: [],
+  datasources: [],
+  config: {},
 };
 
 function(params) {
   local g = self,
-  config:: defaults + params,
-  //local g.config = defaults + params,
+  cfg:: defaults + params,
   // Safety check
-  assert std.isObject(g.config.resources),
+  assert std.isObject(g.cfg.resources),
 
   local glib = (import 'github.com/brancz/kubernetes-grafana/grafana/grafana.libsonnet') + {
     _config+:: {
-      namespace: g.config.namespace,
+      namespace: g.cfg.namespace,
       versions+:: {
-        grafana: g.config.version,
+        grafana: g.cfg.version,
       },
       imageRepos+:: {
-        grafana: g.config.imageRepos,
+        grafana: g.cfg.imageRepos,
       },
       prometheus+:: {
-        name: g.config.prometheusName,
+        name: g.cfg.prometheusName,
       },
       grafana+:: {
-        labels: g.config.commonLabels,
-        dashboards: g.config.dashboards,
-        resources: g.config.resources,
-        rawDashboards: g.config.rawDashboards,
-        folderDashboards: g.config.folderDashboards,
-        containers: g.config.containers,
-      },
+        labels: g.cfg.commonLabels,
+        dashboards: g.cfg.dashboards,
+        resources: g.cfg.resources,
+        rawDashboards: g.cfg.rawDashboards,
+        folderDashboards: g.cfg.folderDashboards,
+        containers: g.cfg.containers,
+        config+: g.cfg.config,
+      } + (
+        // Conditionally overwrite default setting.
+        if std.length(g.cfg.datasources) > 0 then
+          { datasources: g.cfg.datasources }
+        else {}
+      ),
     },
   },
 
+  // Add object only if user passes config and config is not empty
+  [if std.objectHas(params, 'config') && std.length(params.config) > 0 then 'config']: glib.grafana.config,
   service: glib.grafana.service,
   serviceAccount: glib.grafana.serviceAccount,
   deployment: glib.grafana.deployment,
   dashboardDatasources: glib.grafana.dashboardDatasources,
   dashboardSources: glib.grafana.dashboardSources,
 
-  dashboardDefinitions: if std.length(g.config.dashboards) > 0 then {
+  dashboardDefinitions: if std.length(g.cfg.dashboards) > 0 then {
     apiVersion: 'v1',
     kind: 'ConfigMapList',
     items: glib.grafana.dashboardDefinitions,
@@ -74,8 +83,8 @@ function(params) {
     kind: 'ServiceMonitor',
     metadata: {
       name: 'grafana',
-      namespace: g.config.namespace,
-      labels: g.config.commonLabels,
+      namespace: g.cfg.namespace,
+      labels: g.cfg.commonLabels,
     },
     spec: {
       selector: {