You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 line
2.2 KiB

  1. -module(performance_monitor).
  2. -behaviour(gen_server).
  3. -export([start_link/0, init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  4. -export([start_monitoring/1, stop_monitoring/1, get_metrics/1, generate_report/1]).
  5. -record(state, {
  6. monitors = #{}, % 监控对象集合
  7. metrics = #{}, % 性能指标数据
  8. alerts = [], % 告警信息
  9. start_time = undefined
  10. }).
  11. -record(monitor_data, {
  12. type, % 监控类型
  13. metrics = [], % 指标列表
  14. threshold = #{}, % 阈值设置
  15. callback % 回调函数
  16. }).
  17. %% API
  18. start_link() ->
  19. gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
  20. start_monitoring(Target) ->
  21. gen_server:call(?MODULE, {start_monitoring, Target}).
  22. stop_monitoring(Target) ->
  23. gen_server:call(?MODULE, {stop_monitoring, Target}).
  24. get_metrics(Target) ->
  25. gen_server:call(?MODULE, {get_metrics, Target}).
  26. generate_report(Target) ->
  27. gen_server:call(?MODULE, {generate_report, Target}).
  28. %% 内部函数
  29. collect_metrics(Target) ->
  30. % 收集各种性能指标
  31. #{
  32. cpu_usage => get_cpu_usage(Target),
  33. memory_usage => get_memory_usage(Target),
  34. response_time => get_response_time(Target),
  35. throughput => get_throughput(Target)
  36. }.
  37. analyze_performance(Metrics) ->
  38. % 分析性能数据
  39. #{
  40. avg_response_time => calculate_average(maps:get(response_time, Metrics)),
  41. peak_memory => get_peak_value(maps:get(memory_usage, Metrics)),
  42. bottlenecks => identify_bottlenecks(Metrics)
  43. }.
  44. generate_alerts(Metrics, Thresholds) ->
  45. % 生成性能告警
  46. lists:filtermap(
  47. fun({Metric, Value}) ->
  48. case check_threshold(Metric, Value, Thresholds) of
  49. {true, Alert} -> {true, Alert};
  50. false -> false
  51. end
  52. end,
  53. maps:to_list(Metrics)
  54. ).
  55. create_report(Target, Metrics) ->
  56. % 生成性能报告
  57. #{
  58. target => Target,
  59. timestamp => os:timestamp(),
  60. metrics => Metrics,
  61. analysis => analyze_performance(Metrics),
  62. recommendations => generate_recommendations(Metrics)
  63. }.