通过ES分析异常情况
- 2019-05-25 16:29:00
 - CJL 原创
 - 4270
 
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"
      }
    }
  }
}
    
                     发表评论