20、提升开发效率:Ruby监控工具与插件开发指南

Ruby监控与Rails插件开发

提升开发效率:Ruby监控工具与插件开发指南

1. 使用god监控系统进程

在系统管理中,自动监控所有应用程序是一项重要任务。然而,部分应用程序的监控颇具挑战,因为需要检查诸多方面以确保其正常运行。这时,就需要一个能用成熟编程语言进行配置的监控工具,god便是这样的工具,它完全用Ruby编写。

1.1 安装god

使用以下命令安装god:

$ gem install god
1.2 配置god监控订单导入守护进程

以下是一个监控订单导入守护进程的god配置文件示例:

# Download administration/monitoring/god_conf.rb
God.load File.join(File.dirname(__FILE__), 'email_conf.rb')
control_script = '/tmp/order_import_control.rb'

God.watch do |w|
  w.name = 'order_import'
  w.interval = 60.seconds
  w.start = "#{control_script} start"
  w.stop = "#{control_script} stop"
  w.restart = "#{control_script} restart"
  w.start_grace = 10.seconds
  w.restart_grace = 10.seconds
  w.pid_file = '/tmp/order_import.rb.pid'
  w.group = 'server'
  w.behavior(:clean_pid_file)

  w.start_if do |start|
    start.condition(:process_running) do |c|
      c.interval = 20.seconds
      c.running = false
      c.notify = 'admin'
    end
  end

  w.restart_if do |restart|
    restart.condition(:memory_usage) do |c|
      c.above = 100.megabytes
      c.times = [3, 5]
      c.notify = 'admin'
    end

    restart.condition(:cpu_usage) do |c|
      c.above = 60.percent
      c.times = 5
      c.notify = %w(admin boss)
    end
  end
end

配置文件的具体解释如下:
- 全局参数 :在第5 - 13行定义了进程的逻辑名称、监控间隔、启动/停止/重启命令以及PID文件的名称。若不指定 pid_file 参数,god会自动将程序作为守护进程运行。
- 特殊命令 :第15行指定在进程启动或停止前执行的特殊命令,如删除崩溃进程的PID文件。
- 监控规则
- 启动规则 :第17行开始的 start_if 方法定义了进程启动的条件。当进程未运行时,god会每20秒检查一次,并在进程未运行时启动它,同时通知管理员。
- 重启规则 :第25行开始的 restart_if 方法定义了进程重启的条件。当进程的内存使用超过100MB(在5次检查中有3次超过)或CPU使用率超过60%(连续5次检查)时,进程将被重启,并通知管理员或老板。

1.3 配置邮件通知

所有邮件收件人和设置都在单独的文件中指定,并包含在主配置文件中:

# Download administration/monitoring/email_conf.rb
God::Contacts::Email.message_settings = {
  :from => 'god@example.com'
}

God::Contacts::Email.server_settings = {
  :address => 'smtp.example.com',
  :port => 25,
  :domain => 'example.com',
  :authentication => :plain,
  :user_name => 'sysadm',
  :password => 't0p$ecret'
}

God.contact(:email) do |c|
  c.name = 'admin'
  c.email = 'admin@example.com'
end

God.contact(:email) do |c|
  c.name = 'boss'
  c.email = 'boss@example.com'
end

此配置文件设置了邮件的发件人、邮件服务器的地址、端口、认证方式等信息,并定义了收件人(管理员和老板)。

1.4 启动god并查看日志

使用以下命令启动god并查看日志:

mschmidt> god -D -c god_conf.rb

-D 选项表示不将god作为守护进程运行,以便在控制台查看日志输出。启动后,god会自动检测到订单导入进程未运行并立即启动它,同时持续检查进程的CPU和内存使用情况。

使用以下命令查看进程的日志:

mschmidt> god log order_import

此命令将打印进程的最后1000条日志消息,并每秒更新一次。

1.5 monit与god的比较
工具 优点 缺点
monit 更成熟,社区更大,有商业支持,功能更多(如Web前端) 不支持Microsoft Windows
god 可用Ruby配置,可监控非守护进程脚本 不支持Microsoft Windows
2. 创建Rails应用的插件

在开发多个Ruby on Rails应用程序时,会积累大量可复用的代码。为避免手动复制和调整代码,可创建自己的插件和生成器。

2.1 创建插件

使用以下命令创建名为 acts_as_proprietary 的插件:

mschmidt> script/generate plugin acts_as_proprietary

命令成功运行后,会在 vendor/plugins 目录下创建一个名为 acts_as_proprietary 的子目录,包含以下文件:
- README :包含插件的相关信息。
- MIT-LICENSE :插件通常使用的MIT许可证副本。
- Rakefile :用于自动化任务。
- init.rb :插件初始化文件。
- install.rb :插件安装时运行的文件。
- uninstall.rb :插件卸载时运行的文件。
- lib/acts_as_proprietary.rb :插件的主要代码文件。
- tasks/acts_as_proprietary_tasks.rake :插件的任务文件。
- test/acts_as_proprietary_test.rb :插件的测试文件。

2.2 实现插件功能

以下是 lib/acts_as_proprietary.rb 文件的代码,为数据库模型添加了 dump 方法:

# Download administration/plugins/plugin_demo/vendor/plugins/acts_as_proprietary/lib/acts_as_proprietary.rb
module EnterprisePlugin
  module Acts
    module Proprietary
      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods
        def acts_as_proprietary(options = {})
          cattr_accessor :sort_attributes
          self.sort_attributes = options[:sort_attributes] || false
          include InstanceMethods
          extend SingletonMethods
        end
      end

      # This module contains instance methods.
      module InstanceMethods
        def dump
          result = "Model:#{self.class.name}\n"
          keys = attributes.keys
          keys.sort! if self.sort_attributes
          keys.each { |key| result << "#{key}:#{attributes[key]}\n" }
          result
        end
      end

      # This module contains class methods.
      module SingletonMethods
      end
    end
  end
end

代码解释如下:
- 命名空间 :使用三个嵌套的模块声明为插件代码选择了明确的命名空间,避免命名冲突。
- included 方法 :在第4行定义,当模块被包含在其他模块或类中时调用,将 ClassMethods 模块的方法添加到包含模块或类中。
- acts_as_proprietary 方法 :在 ClassMethods 模块中定义,接受一个选项哈希,用于控制模型属性在转储前是否排序。
- dump 方法 :在 InstanceMethods 模块中定义,将模型的类名和属性信息转换为格式化的文本。

2.3 初始化插件

init.rb 文件中添加以下代码,使插件在Rails应用启动时可用:

# Download administration/plugins/plugin_demo/vendor/plugins/acts_as_proprietary/init.rb
require 'acts_as_proprietary'
ActiveRecord::Base.send(
  :include,
  EnterprisePlugin::Acts::Proprietary
)

此代码加载 acts_as_proprietary 库,并将新功能添加到 ActiveRecord::Base 类中,使其在所有模型类中可用。

2.4 测试插件

创建一个 Customer 模型,并使用 acts_as_proprietary 插件:

# Download administration/plugins/plugin_demo/db/migrate/20080712165043_create_customers.rb
create_table :customers do |t|
  t.string :forename
  t.string :surname
  t.date :date_of_birth
  t.timestamps
end

Customer.create(
  :forename => 'John',
  :surname => 'Doe',
  :date_of_birth => Date.new(1968, 7, 22)
)

# Download administration/plugins/plugin_demo/app/models/customer.rb
class Customer < ActiveRecord::Base
  acts_as_proprietary :sort_attributes => true
end

在控制台中测试 dump 方法:

mschmidt> ruby script/console
Loading development environment (Rails 2.1.0)
>> puts Customer.find(1).dump
Model:Customer
created_at:Sat Jul 12 16:57:07 UTC 2008
date_of_birth:1968-07-22
forename:John
id:1
surname:Doe
updated_at:Sat Jul 12 16:57:07 UTC 2008
=> nil

可以看到, dump 方法成功输出了模型的信息。

3. 创建Rails应用的生成器

许多企业应用程序共享通用功能,为避免代码复制,可创建生成器自动创建Rails代码。

3.1 创建插件和生成器

使用以下命令创建一个带有生成器的插件:

mschmidt> script/generate plugin acme_monitoring --with-generator

命令创建了一个名为 vendor/plugins/acme_monitoring/generators 的子目录,为每个新生成器需要在该目录下创建一个以生成器名称命名的子目录。这里生成器名为 info_controller ,创建相应的子目录。

3.2 实现生成器代码

以下是 info_controller 生成器的代码:

# Download administration/plugins/generator_demo/vendor/plugins/acme_monitoring/generators/info_controller/info_controller_generator.rb
class InfoControllerGenerator < Rails::Generator::Base
  def initialize(runtime_args, runtime_options = {})
    super
    @application_name = args.shift || 'UnknownApplication'
    @custom_methods = args || []
  end

  def manifest
    record do |m|
      m.template(
        'info_controller.rb',
        'app/controllers/info_controller.rb',
        :collision => :skip,
        :assigns => {
          :application_name => @application_name,
          :custom_methods => @custom_methods
        }
      )

      m.directory 'app/views/info'
      @custom_methods.each do |method|
        m.template(
          'view.html.erb',
          "app/views/info/#{method}.html.erb",
          :collision => :skip,
          :assigns => { :method_name => method }
        )
      end
    end
  end
end

代码解释如下:
- initialize 方法 :读取命令行传递的参数,第一个参数为应用程序名称,其余参数为要创建的自定义方法列表。
- manifest 方法 :返回一个 Rails::Generator::Manifest 对象,描述要创建的文件和目录。使用 template 方法创建控制器和视图文件,使用 directory 方法创建视图目录。

3.3 生成器模板文件

以下是 info_controller 类的模板文件:

# Download administration/plugins/generator_demo/vendor/plugins/acme_monitoring/generators/info_controller/templates/info_controller.rb
class InfoController < ApplicationController
  def status
    application_name = '<%= application_name %>'
    status = "Everything's OK with #{application_name}."
    render :text => status
  end

  <% for method in custom_methods %>
    <% next if method == 'status' %>
    def <%= method %>
      # Your code here.
    end
  <% end %>
end

以下是视图的模板文件:

# Download administration/plugins/generator_demo/vendor/plugins/acme_monitoring/generators/info_controller/templates/view.html.erb
<%= method_name %>: Your view code here.
3.4 测试生成器

使用以下命令测试 info_controller 生成器:

mschmidt> script/generate info_controller --svn FancyApplication init

生成器将创建 app/controllers/info_controller.rb app/views/info/init.html.erb 文件,并将生成的文件添加到当前的Subversion仓库中。

3.5 安装插件

将插件代码上传到网络服务器(如HTTP服务器、Subversion仓库或Git仓库)后,使用以下命令安装插件:

mschmidt> ./script/plugin install svn://example.com/acme_monitoring

综上所述,使用god可以方便地监控系统进程,创建Rails应用的插件和生成器可以提高代码复用性和开发效率。在实际开发中,可以根据需求选择合适的工具和方法。

提升开发效率:Ruby监控工具与插件开发指南

4. 总结与拓展应用
4.1 工具与方法总结
  • 监控工具 :god是一个强大的系统监控工具,它使用Ruby进行配置,能够自动监控各种应用程序。通过设置启动、重启条件以及邮件通知等功能,可以及时发现并处理系统问题。
  • 插件开发 :在Rails应用中创建插件可以避免代码的重复复制和手动调整,提高代码的复用性。通过定义模块和方法,可以为模型添加新的功能。
  • 生成器开发 :生成器可以自动创建Rails代码,减少手动编写代码的工作量。通过定义生成器的逻辑和模板文件,可以快速生成控制器、视图等文件。

以下是一个简单的总结表格:
| 工具/方法 | 作用 | 优点 |
| ---- | ---- | ---- |
| god | 系统进程监控 | 可用Ruby配置,可监控非守护进程脚本 |
| Rails插件 | 代码复用 | 避免手动复制和调整代码,提高开发效率 |
| Rails生成器 | 自动生成代码 | 减少手动编写代码的工作量,提高代码一致性 |

4.2 拓展应用场景
  • 更多监控场景 :god不仅可以监控订单导入守护进程,还可以监控Mongrel进程、数据库服务器、文件、目录、网络服务等。可以根据实际需求,编写不同的配置文件来监控各种应用程序。
  • 插件功能扩展 :在创建插件时,可以根据业务需求添加更多的功能。例如,可以为 acts_as_proprietary 插件添加更多的方法,或者支持更多的配置选项。
  • 生成器定制 :生成器可以根据不同的业务需求进行定制。例如,可以创建一个生成器来生成特定格式的报表控制器和视图,或者生成特定的数据库迁移文件。
5. 操作流程回顾与流程图
5.1 操作流程回顾
  • god监控系统进程
    1. 安装god: gem install god
    2. 编写god配置文件,包括全局参数、监控规则和邮件通知设置。
    3. 启动god并查看日志: god -D -c god_conf.rb
    4. 查看进程日志: god log order_import
  • 创建Rails应用插件
    1. 创建插件: script/generate plugin acts_as_proprietary
    2. 编写插件代码,包括主要功能和初始化代码。
    3. 测试插件:在模型中使用插件并调用相应的方法。
  • 创建Rails应用生成器
    1. 创建带有生成器的插件: script/generate plugin acme_monitoring --with-generator
    2. 编写生成器代码,包括初始化方法和manifest方法。
    3. 编写生成器模板文件。
    4. 测试生成器: script/generate info_controller --svn FancyApplication init
    5. 安装插件: ./script/plugin install svn://example.com/acme_monitoring
5.2 mermaid格式流程图
graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(开始):::process --> B{选择操作}:::process
    B -->|监控系统进程| C(安装god):::process
    C --> D(编写god配置文件):::process
    D --> E(启动god并查看日志):::process
    E --> F(查看进程日志):::process
    B -->|创建Rails插件| G(创建插件):::process
    G --> H(编写插件代码):::process
    H --> I(测试插件):::process
    B -->|创建Rails生成器| J(创建带有生成器的插件):::process
    J --> K(编写生成器代码):::process
    K --> L(编写生成器模板文件):::process
    L --> M(测试生成器):::process
    M --> N(安装插件):::process
    F --> O(结束):::process
    I --> O
    N --> O
6. 注意事项与最佳实践
6.1 注意事项
  • 监控工具 :在使用god进行监控时,要确保邮件通知配置正确,避免无法收到通知。同时,要根据系统的实际情况合理设置监控条件,避免频繁的误报。
  • 插件开发 :在创建插件时,要注意命名空间的使用,避免与其他插件或代码产生冲突。同时,要编写详细的文档,方便其他开发者使用和维护。
  • 生成器开发 :在编写生成器时,要考虑到各种可能的输入情况,确保生成的代码符合预期。同时,要支持标准的命令行选项,如 --help 等。
6.2 最佳实践
  • 代码复用 :在开发过程中,尽量使用插件和生成器来复用代码,避免重复劳动。
  • 自动化测试 :为插件和生成器编写自动化测试代码,确保代码的正确性和稳定性。
  • 文档编写 :编写详细的文档,包括使用说明、配置选项、示例代码等,方便其他开发者使用和维护。
7. 总结与展望

通过使用god进行系统监控以及在Rails应用中创建插件和生成器,可以显著提高开发效率和代码质量。在未来的开发中,可以进一步探索这些工具和方法的更多应用场景,结合新的技术和需求,不断优化和扩展功能。

同时,随着技术的不断发展,可能会出现更多优秀的监控工具和开发方法。开发者可以持续关注行业动态,学习和应用新的技术,以更好地应对各种开发挑战。

希望本文介绍的内容能够帮助开发者更好地掌握这些技术,提升开发效率,创造出更优秀的应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值