通过ES分析异常情况

ES提供了强大的分析能力,使我们可以通过服务日志发现一些隐藏的问题。尽量提高系统的全面监控能力,及时发现系统性风险。

一、目标

分析维度:

1、利用http状态码

通过nginx的日志统计http状态码,根据各状态码的变化趋势进行预警。

2、利用请求次数

通过统计各个域名或接口的请求次数,发现流量变化趋势。

3、利用响应时间

统计接口的响应时间,发现服务器的负载问题或程序问题。


错误依据:

1、增长或下降趋势的环比趋势

2、考虑到每天的变化,引入同比变化,包括天、周、月同比。避免误报。


二、思路

1、多维度分析

域名、接口、后端IP、状态


2、多时间段拆分

分钟、10分钟、30分钟、一小时、一天、一周、一月


3、排除异常

IP白名单过滤,域名白名单过滤


三、实现

1、监控域名的访问个数和响应时间

根据域名分桶,使用agga进行统计。

基准值为1分钟时:对比值取上一分钟、10分钟前、30分钟前、上一小时同一分钟、上一天同一分钟、上一周同一分钟。分别取对应的权重值。并保存以供后续分析使用。

针对请求量较小的基准值取5分钟。

ES查询:

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gt": "now-1m"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "count_domain": {
      "terms": {
        "field": "server_name.keyword",
        "size": 100
      },
      "aggs": {
        "avgreq_domain": {
          "avg": {
            "field": "upstream_response_time"
          }
        }
      }
    }
  }
}


2、监控服务器的访问个数和响应时间

根据后端机IP分桶,使用agga进行统计。

ES查询:

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gt": "now-1m"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "count_domain": {
      "terms": {
        "field": "beat.name.keyword",
        "size": 100
      },
      "aggs": {
        "avgreq_domain": {
          "avg": {
            "field": "upstream_response_time"
          }
        }
      }
    }
  }
}


3、监控接口的访问个数和响应时间

根据接口请求path分桶,使用agga进行统计。

ES查询:

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gt": "now-1m"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "count_domain": {
      "terms": {
        "field": "request_uri.keyword",
        "size": 100
      },
      "aggs": {
        "avgreq_domain": {
          "avg": {
            "field": "upstream_response_time"
          }
        }
      }
    }
  }
}


4、结合域名服务器IP和接口统计

先根据服务器IP分桶再根据接口请求path分桶,使用agga进行统计。

ES查询:

{
  "size": 1,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gt": "now-1m"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "count_domain": {
      "terms": {
        "field": "server_name.keyword",
        "size": 1000
      },
      "aggs": {
        "count_serverip": {
          "terms": {
            "field": "beat.name.keyword",
            "size": 1000
          },
          "aggs": {
            "count_path": {
              "terms": {
                "field": "request_uri.keyword",
                "size": 1000
              },
              "aggs": {
                "avgreq_path": {
                  "avg": {
                    "field": "upstream_response_time"
                  }
                }
              }
            },
            "avgreq_serverip": {
              "avg": {
                "field": "upstream_response_time"
              }
            }
          }
        },
        "avgreq_domain": {
          "avg": {
            "field": "upstream_response_time"
          }
        }
      }
    },
    "avgreq_all": {
      "avg": {
        "field": "upstream_response_time"
      }
    }
  }
}






文章分类