{
  "tags": [],
  "title": "NGINX Ingress controller",
  "widgets": [
    {
      "layout": {
        "x": 0,
        "y": 0,
        "width": 3,
        "height": 1
      },
      "definition": {
        "type": "query_value",
        "title": "Controller Request Volume",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.requests{$controller,$controller_class,namespace:$namespace.value}.as_rate()",
                "aggregator": "avg",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "query1"
              }
            ],
            "response_format": "scalar"
          }
        ],
        "autoscale": true,
        "precision": 2,
        "text_align": "center",
        "custom_unit": "/s"
      }
    },
    {
      "layout": {
        "x": 3,
        "y": 0,
        "width": 3,
        "height": 1
      },
      "definition": {
        "type": "query_value",
        "title": "Controller Connections",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.nginx.process.connections{$controller,$controller_class,$namespace}.rollup(avg, 120)",
                "aggregator": "avg",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "query1"
              }
            ],
            "response_format": "scalar"
          }
        ],
        "autoscale": true,
        "precision": 2,
        "text_align": "center"
      }
    },
    {
      "layout": {
        "x": 6,
        "y": 0,
        "width": 3,
        "height": 1
      },
      "definition": {
        "type": "query_value",
        "title": "Controller Success Rate (non-4|5xx responses)",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.requests{$controller,$controller_class,namespace:$namespace.value,!status:4*,!status:5*}.as_rate()",
                "aggregator": "avg",
                "data_source": "metrics"
              },
              {
                "name": "query2",
                "query": "sum:nginx_ingress.controller.requests{$controller,$controller_class,namespace:$namespace.value}.as_rate()",
                "aggregator": "avg",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "(query1 / query2) * 100"
              }
            ],
            "response_format": "scalar",
            "conditional_formats": [
              {
                "value": 95,
                "palette": "white_on_gray",
                "comparator": ">="
              },
              {
                "value": 99,
                "palette": "white_on_gray",
                "comparator": ">="
              },
              {
                "value": 99.5,
                "palette": "white_on_red",
                "comparator": ">="
              }
            ]
          }
        ],
        "autoscale": true,
        "precision": 2,
        "text_align": "center",
        "custom_unit": "%"
      }
    },
    {
      "layout": {
        "x": 9,
        "y": 0,
        "width": 1,
        "height": 1
      },
      "definition": {
        "type": "query_value",
        "title": "Config Reloads",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "avg:nginx_ingress.controller.success{$controller,$controller_class,$namespace}",
                "aggregator": "avg",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "query1"
              }
            ],
            "response_format": "scalar"
          }
        ],
        "autoscale": true,
        "precision": 2,
        "text_align": "center"
      }
    },
    {
      "layout": {
        "x": 10,
        "y": 0,
        "width": 2,
        "height": 1
      },
      "definition": {
        "type": "query_value",
        "title": "Last Config Failed",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.config.last.reload.successful{$controller,$namespace} by {controller_pod}",
                "aggregator": "last",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "count_not_null(query1)"
              }
            ],
            "response_format": "scalar"
          }
        ],
        "autoscale": true,
        "precision": 2,
        "text_align": "center"
      }
    },
    {
      "layout": {
        "x": 0,
        "y": 1,
        "width": 6,
        "height": 2
      },
      "definition": {
        "type": "timeseries",
        "title": "Ingress Request Volume",
        "yaxis": {
          "max": "auto",
          "min": "auto",
          "label": "",
          "scale": "linear",
          "include_zero": true
        },
        "requests": [
          {
            "style": {
              "palette": "dog_classic",
              "line_type": "solid",
              "line_width": "normal"
            },
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.requests{$controller,$controller_class,$namespace,$ingress} by {ingress}.as_rate()",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "query1"
              }
            ],
            "display_type": "area",
            "response_format": "timeseries"
          }
        ],
        "show_legend": true,
        "legend_layout": "auto",
        "legend_columns": [
          "avg",
          "min",
          "max",
          "value",
          "sum"
        ]
      }
    },
    {
      "layout": {
        "x": 6,
        "y": 1,
        "width": 6,
        "height": 2
      },
      "definition": {
        "type": "timeseries",
        "title": "Ingress Success Rate (non-4|5xx responses)",
        "yaxis": {
          "max": "auto",
          "min": "auto",
          "label": "",
          "scale": "linear",
          "include_zero": false
        },
        "requests": [
          {
            "style": {
              "palette": "dog_classic",
              "line_type": "solid",
              "line_width": "normal"
            },
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.requests{$controller,$controller_class,namespace:$namespace.value,$ingress,!status:4*,!status:5*} by {ingress}.as_rate()",
                "data_source": "metrics"
              },
              {
                "name": "query2",
                "query": "sum:nginx_ingress.controller.requests{$controller,$controller_class,namespace:$namespace.value,$ingress} by {ingress}.as_rate()",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "formula": "(query1 / query2) * 100"
              }
            ],
            "display_type": "line",
            "response_format": "timeseries"
          }
        ],
        "show_legend": true,
        "legend_layout": "auto",
        "legend_columns": [
          "avg",
          "min",
          "max",
          "value",
          "sum"
        ]
      }
    },
    {
      "layout": {
        "x": 0,
        "y": 3,
        "width": 4,
        "height": 2
      },
      "definition": {
        "type": "timeseries",
        "title": "Network I/O pressure",
        "yaxis": {
          "max": "auto",
          "min": "auto",
          "label": "",
          "scale": "linear",
          "include_zero": true
        },
        "requests": [
          {
            "style": {
              "palette": "dog_classic",
              "line_type": "solid",
              "line_width": "normal"
            },
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.request.size.sum{$controller,$controller_class,$namespace}.as_rate()",
                "data_source": "metrics"
              },
              {
                "name": "query2",
                "query": "sum:nginx_ingress.controller.response.size.sum{$controller,$controller_class,$namespace}.as_rate()",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "alias": "Received",
                "formula": "query1"
              },
              {
                "alias": "Sent",
                "formula": "-query2"
              }
            ],
            "display_type": "area",
            "response_format": "timeseries"
          }
        ],
        "show_legend": true,
        "legend_layout": "auto",
        "legend_columns": [
          "avg",
          "min",
          "max",
          "value",
          "sum"
        ]
      }
    },
    {
      "layout": {
        "x": 4,
        "y": 3,
        "width": 4,
        "height": 2
      },
      "definition": {
        "type": "timeseries",
        "title": "Average Memory Usage",
        "yaxis": {
          "max": "auto",
          "min": "auto",
          "label": "",
          "scale": "linear",
          "include_zero": false
        },
        "requests": [
          {
            "style": {
              "palette": "dog_classic",
              "line_type": "solid",
              "line_width": "normal"
            },
            "queries": [
              {
                "name": "query1",
                "query": "avg:nginx_ingress.controller.nginx.process.resident.memory.bytes{$controller,$controller_class,$namespace}",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "alias": "nginx",
                "formula": "query1"
              }
            ],
            "display_type": "line",
            "response_format": "timeseries"
          }
        ],
        "show_legend": true,
        "legend_layout": "auto",
        "legend_columns": [
          "avg",
          "min",
          "max",
          "value",
          "sum"
        ]
      }
    },
    {
      "layout": {
        "x": 8,
        "y": 3,
        "width": 4,
        "height": 2
      },
      "definition": {
        "type": "timeseries",
        "title": "Average CPU Usage",
        "yaxis": {
          "max": "auto",
          "min": "auto",
          "label": "",
          "scale": "linear",
          "include_zero": false
        },
        "requests": [
          {
            "style": {
              "palette": "dog_classic",
              "line_type": "solid",
              "line_width": "normal"
            },
            "queries": [
              {
                "name": "query1",
                "query": "sum:nginx_ingress.controller.nginx.process.cpu.seconds.total{$controller,$controller_class,$namespace}.as_rate()",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "alias": "nginx",
                "formula": "query1"
              }
            ],
            "display_type": "line",
            "response_format": "timeseries"
          }
        ],
        "show_legend": true,
        "legend_layout": "auto",
        "legend_columns": [
          "avg",
          "min",
          "max",
          "value",
          "sum"
        ]
      }
    },
    {
      "layout": {
        "x": 0,
        "y": 5,
        "width": 12,
        "height": 2
      },
      "definition": {
        "type": "query_table",
        "title": "Ingress Percentile Response Times and Transfer Rates",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "p50:nginx_ingress.controller.request.duration.seconds{$controller,$controller_class,$namespace,$ingress} by {ingress}",
                "aggregator": "last",
                "data_source": "metrics"
              },
              {
                "name": "query2",
                "query": "p90:nginx_ingress.controller.request.duration.seconds{$controller,$controller_class,$namespace,$ingress} by {ingress}",
                "aggregator": "last",
                "data_source": "metrics"
              },
              {
                "name": "query3",
                "query": "p99:nginx_ingress.controller.request.duration.seconds{$controller,$controller_class,$namespace,$ingress} by {ingress}",
                "aggregator": "last",
                "data_source": "metrics"
              },
              {
                "name": "query4",
                "query": "sum:nginx_ingress.controller.request.size.sum{$controller,$controller_class,$namespace,$ingress} by {ingress}.as_rate()",
                "aggregator": "last",
                "data_source": "metrics"
              },
              {
                "name": "query5",
                "query": "sum:nginx_ingress.controller.response.size.sum{$controller,$controller_class,$namespace,$ingress} by {ingress}.as_rate()",
                "aggregator": "last",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "limit": {
                  "count": 50,
                  "order": "desc"
                },
                "formula": "query1"
              },
              {
                "formula": "query2"
              },
              {
                "formula": "query3"
              },
              {
                "formula": "query4"
              },
              {
                "formula": "query5"
              }
            ],
            "response_format": "scalar"
          }
        ],
        "has_search_bar": "auto"
      }
    },
    {
      "layout": {
        "x": 0,
        "y": 7,
        "width": 12,
        "height": 2
      },
      "definition": {
        "type": "query_table",
        "title": "Ingress Certificate Expiry",
        "requests": [
          {
            "queries": [
              {
                "name": "query1",
                "query": "avg:nginx_ingress.controller.ssl.expire.time.seconds{kubernetes_pod_name:$controller.value,namespace:$namespace.value,$ingress} by {host}",
                "aggregator": "last",
                "data_source": "metrics"
              }
            ],
            "formulas": [
              {
                "limit": {
                  "count": 50,
                  "order": "desc"
                },
                "formula": "query1"
              }
            ],
            "response_format": "scalar"
          }
        ],
        "has_search_bar": "auto"
      }
    }
  ],
  "description": "Converted from Grafana dashboard https://grafana.com/grafana/dashboards/9614 (by gonzalesraul). Ingress-nginx supports a rich collection of prometheus metrics. If you have prometheus and grafana installed on your cluster then prometheus will already be scraping this data due to the scrape annotation on the deployment.",
  "layout_type": "ordered",
  "reflow_type": "fixed",
  "template_variables": [
    {
      "name": "namespace",
      "prefix": "controller_namespace",
      "default": "*",
      "available_values": []
    },
    {
      "name": "controller_class",
      "prefix": "controller_class",
      "default": "*",
      "available_values": []
    },
    {
      "name": "controller",
      "prefix": "controller_pod",
      "default": "*",
      "available_values": []
    },
    {
      "name": "ingress",
      "prefix": "ingress",
      "default": "*",
      "available_values": []
    }
  ]
}