ELK Stackでシステム監視 FreeBSDのportsでELK Stack6系をインストール

FreeBSDのportsのelasticsearch5にJNAへのシンボリックリンクの貼り間違いバグがあって、それの修正をお願いしたら同じバグを持っていたelasticsearch6も一緒に修正された。
そして一昨日、待ちに待ったlogstash6のportsも登場した。
そこでこの機会にelasticsearch, logstash, kibanaをそれぞれ5系から6系に変えることにした。この3点は少なくともメジャーバージョンは合わせておいた方がトラブらないという話を聞いていたが、logstash6がなかなか登場しないので5系を使っていた。特にLogstashとKibanaはX-Packの関係で同じバージョンが良さげ。

elasticsearch6とkibana6のインストール

# cd /usr/ports/textproc/elasticsearch6
# make install
# cd /usr/ports/sysutils/logstash6
# make install
# /usr/ports/textproc/kibana6
# make install
/etc/rc.conf (追記3行 ただし5系を入れていたなら変更無し)
1
2
3
4
5
elasticsearch_enable="YES"
elasticsearch_login_class="root"
logstash_enable="YES"
logstash_log="YES"            #インストールから様子見の期間だけ
kibana_enable="YES"

elasticsearch6の設定と起動

elasticsearch6の設定と起動は前回と同じで問題なし。

/usr/local/etc/elasticsearch/elasticsearch.yml
1
2
3
4
5
6
7
8
path.data: /var/db/elasticsearch
path.logs: /var/log/elasticsearch
path.scripts: /usr/local/libexec/elasticsearch
network.host: localhost
http.port: 9200

xpack.ml.enabled: false          #以下2行X-Packで使わない(使えない)機能を指定
xpack.security.enabled: false

X-Packインストールまでにelasticsearchを起動するなら最後の2行はコメントにしておく。

/usr/local/etc/elasticsearch/jvm.options
1
2
-Xms2g
-Xmx2g

メモリの割当てだけ変えておく。初期値の1GBはあまりにも小さすぎる。

elasticsearch6にX-Packをインストール

elasticsearch5にはX-Packをインストールするためのports (elasticsearch5-x-pack)が用意されていたのでそれを入れるだけだったが、elasticsearch6のportsにはそのようなportsが用意されていないので手動でインストールすることになる。

で、X-Packプラグインをインストールするためのツールは/usr/local/lib/elasticsearch/binにあるelasticsearch-plugin。 portsで入れると何故か /usr/local/bin/elasticsearch-plugin があるのでそれが使えそうに見えるが、同じディレクトリに elasticsearch-env が無いので使えない。 /usr/local/lib/elasticsearch/bin/elasticsearch-env を /usr/local/bin/ にコピーするか /usr/local/lib/elasticsearch/bin に移動してからそこの elasticsearch-plugin を実行する。(たぶんportsの考慮漏れ)
elasticsearch-plugin は同じディレクトリの elasticsearch-env を呼ぶが、それを見ると初期値ではx-packなどの設定置き場が /usr/local/lib/elasticsearch/config になっているみたい。
そこで /usr/local/lib/elasticsearch/config を作成してからX-Packをインストールする。
portsバージョンelasticsearch6-6.2.2_6で修正された模様

# mkdir /usr/local/lib/elasticsearch/config
# /usr/local/lib/elasticsearch/bin/elasticsearch-plugin install x-pack
# cd /usr/local/lib/elasticsearch/bin
# wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.x.x.zip  (正しいバージョン指定)
# ./elasticsearch-plugin install file:///usr/local/lib/elasticsearch/bin/x-pack-6.x.x.zip
-> Downloading x-pack from elastic
[=================================================] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.io.FilePermission \\.\pipe\* read,write
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* java.net.SocketPermission * connect,accept,resolve
* java.security.SecurityPermission createPolicy.JavaPolicy
* java.security.SecurityPermission getPolicy
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setPolicy
* java.util.PropertyPermission * read,write
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]y
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@        WARNING: plugin forks a native controller        @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
This plugin launches a native controller that is not subject to the Java
security manager nor to system call filters.

Continue with installation? [y/N]y
Elasticsearch keystore is required by plugin [x-pack-security], creating...
-> Installed x-pack with: x-pack-core,x-pack-deprecation,x-pack-graph,x-pack-logstash,x-pack-ml,x-pack-monitoring,x-pack-security,x-pack-upgrade,x-pack-watcher

2018年4月12日追記:
Kibanaは以前からプラグインコマンドからプラグイン名指定でX-Packをインストールしようとすると失敗していたが、ElasticSearchでも6.2.3からはプラグイン名指定ではX-Packのインストールが失敗するようになったので先にX-Packのファイルをダウンロードしてファイル名指定でインストールするという方法に変更した。

kibana6の設定

kibana6の設定も以前の記事と基本的に同じ。つまり、やらなければならないことも同じ。

/usr/local/etc/kibana.yml
1
2
3
4
5
6
7
server.port: 5601
#server.host: "localhost"
server.host: "192.168.52.20"  #Kibanaの動いているホストの(監視側セグメントの)IPアドレス
elasticsearch.url: "http://localhost:9200"
path.data: /var/db/kibana     #←無い筈なので追加 (重要)
xpack.ml.enabled: false
xpack.security.enabled: false

X-Packインストールまでにkibanaを起動するなら最後の2行はコメントにしておく。


# mkdir /var/db/kibana

kibana6にX-Packをインストール

kibana5にはX-Packをインストールするためのports (kibana5-x-pack)が用意されていたのでそれを入れるだけだったが、kibana6のportsにはそのようなportsが用意されていないので手動でインストールすることになる。
2018年3月6日現在のportsではMakefileが間違っているのでkibanaの関連ツールがインストールされない。
/usr/ports/textproc/kibana6/work/kibana-6.2.2-linux-x86_64/bin にある以下2つのファイルを/usr/local/www/kibana6/bin にコピーする。(面倒なのでディレクトリごと)。

  • kibana-keystore
  • kibana-plugin

また、/usr/local/www/kibana6/config/kibana.ymlを必要とするようなのでディレクトリを作成して/usr/local/etc/kibana.ymlにシンボリックリンクを張る。portsバージョンkibana6-6.2.2_2で修正された模様

# cp -pR /usr/ports/textproc/kibana6/work/kibana-6.2.2-linux-x86_64/bin /usr/local/www/kibana6/
# mkdir /usr/local/www/kibana6/config
# ln -s /usr/local/etc/kibana.yml /usr/local/www/kibana6/config/kibana.yml

なお、インストールした後にmake cleanしていて /usr/ports/textproc/kibana6/work以下が掃除済み(存在しない)の場合は、以下を実行でファイルが出来る。

# cd /usr/ports/textproc/elasticsearch6
# make fetch        (ファイル取得済みの筈なので今回は不要)
# make extract      ←今回はこれだけ
# make patch        (今回欲しいファイルがパッチ対象ではないので不要)
# make configure    (今回はビルド無しで良いので不要)
# make build        (今回はビルド無しで良いので不要)

kibana-pluginを実行してX-Packをインストールする。elastic社のサイトのドキュメントでは bin/kibana-plugin install x-pack を実行するとある。そこで、以下。

# /usr/local/www/kibana6/bin/kibana-plugin install x-pack
DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
Attempting to transfer from x-pack
Attempting to transfer from https://artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-6.2.2.zip
Transferring 269704442 bytes..............

上手く行くようで何故かファイルの転送中に停まってしまうみたいで何時間もこのままに。
中断して以下。

# cd /tmp
# wget https://artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-6.2.2.zip
# /usr/local/www/kibana6/bin/kibana-plugin install file:///tmp/x-pack-6.2.2.zip
Attempting to transfer from file:///tmp/x-pack-6.2.2.zip
Transferring 269704442 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete
# chown -R www:www /usr/local/www/kibana6

好みの問題かも知れないけどkibana6ディレクトリ以下のオーナーを変更。

Logstash6の設定

/usr/local/etc/logstash/logstash.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
input {
        #Beats
        beats {
                port => 5044
        }

        #Collectd
        udp {
                port => 25826
                buffer_size => 262144
                workers => 4
                queue_size => 8192
                codec => collectd { }
                type => "collectd"
        }
}

output {
        elasticsearch {
                hosts => [ "localhost:9200" ]
        }
}
/usr/local/logstash/config/jvm.options (変更)
1
2
-Xms1g
-Xmx1g

上の2つの値は初期値。必要に応じて増やす。データの流量が少なくて簡単なことしかしなければ初期値で十分。

Logstash6にX-Packをインストール

Logstashのファイルは/usr/local/logstash/にある。portsでインストールすると実行用のファイルに実行権限が付いてしないのでそれを付けるところから。

# chmod +x /usr/local/logstash/bin/benchmark.sh
# chmod +x /usr/local/logstash/bin/cpdump
# chmod +x /usr/local/logstash/bin/dependencies-report
# chmod +x /usr/local/logstash/bin/ingest-convert.sh
# chmod +x /usr/local/logstash/bin/logstash-keystore
# chmod +x /usr/local/logstash/bin/logstash-plugin       ← 今回使うのはこれ
# chmod +x /usr/local/logstash/bin/logstash.lib.sh         ← logstash-pluginから呼び出される
# chmod +x /usr/local/logstash/bin/pqcheck
# chmod +x /usr/local/logstash/bin/ruby
# chmod +x /usr/local/logstash/bin/system-install

# /usr/local/logstash/bin/logstash-plugin install x-pack
expr: illegal option -- C
expr: usage: expr [-e] expression

Downloading file: https://artifacts.elastic.co/downloads/logstash-plugins/x-pack/x-pack-6.2.2.zip
Downloading [=============================================================] 100%
Installing file: /tmp/studtmp-fe4cc2f4d060d661a2cdc1a53b50f56c125fbf33c63fc2ca412ce6cce245/x-pack-6.2.2.zip
Install successful
/usr/local/etc/logstash/logstash.yml (追加) (logstash.confじゃない)
1
2
3
xpack.monitoring.elasticsearch.url: http://localhost:9200
xpack.monitoring.elasticsearch.username: 
xpack.monitoring.elasticsearch.password:

今回はusernameとpasswordは指定しない。

ELK Stackの起動

# service elasticsearch start
# service logstash start
# service kibana start

Kibanaは起動コマンド実行後ブラウザで利用可能になるまで数分ほど待たされるかも。
特にKibanaはX-Packを入れた後の初起動は利用可能になるまで15分以上かかるかも。

X-Pack ライセンス投入

ライセンス投入は以前のELK Stackインストールの記事参照。

初稿ではKibanaのX-Packインストール後にKibanaが動かないと思って確認すると書いたが、時間がかかるだけだったよう。

KibanaでX-Packを確認
X-PackをインストールするとKibanaのメニューに[Monitoring]が表示されてX-Packをインストールしたアプリケーションが表示される。この記事ではelasticsearchとKibanaとLogstashにX-Packをインストールしたのでそれが表示されている。

関連記事:

ELK Stackでシステム監視 FreeBSDにMetricbeatをインストールしてみる

FreeBSDのportsのbeatsは暫く壊れたまま放置されていたが、2018年3月に入ってようやく直してくれたみたい。このbeatsというports/pkgは以前は個別のbeat (Filebeat, Metricbeat, Packetbeat) だったports/pkgを統合したもの。統合後にHeartbeatを追加して現在は4つのbeat(s)になっている。
Beatsはシリーズ名(ファミリー名)みたいなもので4種以外にもたくさんあるのでこのports名はどうなんだろうというのが正直な気持ち。
そんなことはどうでもいいので、とりあえずインストールしてみた。

Go言語とBeatsをportsでインストール
# cd /usr/ports/lang/go
# make install clean
# cd /usr/ports/sysutils/beats
# make install clean

ビルドするBeatを選ぶ画面が出るので基本的にはFilebeat, Heartbeat, Metricbeat, Packetbeatの4つにチェック(初期値のまま)。ただし、この記事ではその内のMetricbeatしか扱わない。

/etc/rc.conf (1行追記)
metricbeat_enable="YES"
Metricbeatで使用可能なモジュールを確認する。
# metricbeat modules list -path.config /usr/local/etc
Enabled:
metric_system

Disabled:

Systemモジュールしか使えないのかしら?
なんかこのコマンド全然意味をなさないっぽいんだけど使い方が違うのかしら。 Debugログを表示したところ以下が使えるみたい。

モジュール
  • docker
  • mongodb
  • mysql
  • postgresql
  • system
  • uwsgi

MetricSet
  • aerospike/namespace
  • apache/status
  • ceph/cluster_disk
  • ceph/cluster_health
  • ceph/cluster_status
  • ceph/monitor_health
  • ceph/osd_df
  • ceph/osd_tree
  • ceph/pool_disk
  • couchbase/bucket
  • couchbase/cluster
  • couchbase/node
  • docker/container
  • docker/cpu
  • docker/diskio
  • docker/healthcheck
  • docker/image
  • docker/info
  • docker/memory
  • docker/network
  • dropwizard/collector
  • elasticsearch/node
  • elasticsearch/node_stats
  • etcd/leader
  • etcd/self
  • etcd/store
  • golang/expvar
  • golang/heap
  • graphite/server
  • haproxy/info
  • haproxy/stat
  • http/json
  • http/server
  • jolokia/jmx
  • kafka/consumergroup
  • kafka/partition
  • kibana/status
  • kubernetes/container
  • kubernetes/event
  • kubernetes/node
  • kubernetes/pod
  • kubernetes/state_container
  • kubernetes/state_deployment
  • kubernetes/state_node
  • kubernetes/state_pod
  • kubernetes/state_replicaset
  • kubernetes/system
  • kubernetes/volume
  • logstash/node
  • logstash/node_stats
  • memcached/stats
  • mongodb/collstats
  • mongodb/dbstats
  • mongodb/status
  • mysql/status
  • nginx/stubstatus
  • php_fpm/pool
  • postgresql/activity
  • postgresql/bgwriter
  • postgresql/database
  • prometheus/collector
  • prometheus/stats
  • rabbitmq/node
  • rabbitmq/queue
  • redis/info
  • redis/keyspace
  • system/core
  • system/cpu
  • system/diskio
  • system/filesystem
  • system/fsstat
  • system/load
  • system/memory
  • system/network
  • system/process
  • system/process_summary
  • system/raid
  • uwsgi/status
  • vsphere/datastore
  • vsphere/host
  • vsphere/virtualmachine
  • zookeeper/mntr

意外と使えるのね。意外なところでドキュメントに書かれてるsystem/uptimeが存在しないの。いやそれは使えるようにしようよ。

とりあえず、この記事ではSystemモジュールで出力できる設定を作成する。
なお、動作確認のためだけの単純な設定とする。

/usr/local/etc/metricbeat.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
metricbeat.config.modules:
  path: ${path.config}/beats/metric_*.yml     #ここが初期値と変わってるので注意
  reload.enabled: false

#output.elasticsearch:             #動作確認ではelasticsearchには出力しない
#  hosts: ["localhost:9200"]

output.logstash:
  hosts: ["localhost:5044"]

#output.console:                   #コンソールに出力
#  pretty: true

#logging.level: debug
logging.to_syslog: true
logging.to_files: false

# mkdir /usr/local/etc/beats
/usr/local/etc/beats/metric_system.yml (新規)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
- module: system
  metricsets: ["cpu"]
  cpu.metrics: [percentages, normalized_percentages, ticks]
  enabled: true
  period: 10s

- module: system
  metricsets: ["load"]
  enabled: true
  period: 10s

- module: system
  metricsets: ["filesystem"]
  filesystem.ignore_types: [nfs, smbfs, autofs]
  enabled: true
  period: 60s

- module: system
  metricsets: ["fsstat"]
  enabled: true
  period: 60s

- module: system
  metricsets: ["memory"]
  enabled: true
  period: 10s

- module: system
  metricsets: ["network"]
  interfaces: [em0]    #ネットワークIFとしてem0(だけ)を指定
  enabled: true
  period: 10s

- module: system
  metricsets: ["process"]
  processes: ['.*']    #全プロセス
  enabled: true
  period: 10s
  processors:
  - drop_fields:                          #processで出力しないフィールドの設定例↓
      fields: ["system.process.cmdline"]  #system.process.cmdlineフィールドを除外
    #↑ここは字下げ必要(drop_fields:と並べない)

上の様に設定ファイルを分けずに全部/usr/local/etc/metricbeat.ymlに書くのでも良い。(上の/usr/local/etc/metricbeat.ymlファイルのpath: ${path.config}/beats/metric_*.yml行と置き換える)
また監視項目別の個別設定が不要なら下のような書き方でも。(elastic社のドキュメントより)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
metricbeat.modules:
- module: system
  metricsets:
    - cpu
    - load
    #- core
    #- diskio
    - filesystem
    - fsstat
    - memory
    - network
    - process
    # Sockets (linux only)
    #- socket
  enabled: true
  period: 10s
Metricbeatを起動
# service metricbeat start

データ受信側にLogstashを使うが、テスト用のLogstash設定ファイル(本番稼働用のLogstash設定ファイルとは別)を作成する。

/usr/local/etc/logstash/test.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
input {
        beats {
                port => 5044
        }
}
output {
        stdout {
                codec => rubydebug
        }
}

Beat(s)からデータを受けて標準出力に出すという内容。
既に本番稼働しているBeatsがあってそれがポート5044を使っているなら別のポート番号を指定する。テスト用のMetricbeatの設定ファイルのポート番号もそれに合わせる。とにかく本番稼働で使用しているのとは別のポートを使うこと。

Logstashを起動してテスト
# /usr/local/logstash/bin/logstash --path.data /tmp -f /usr/local/etc/logstash/test.conf

Logstash起動コマンド実行からMetricbeatのデータが流れるまで暫く待たされる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
   "@timestamp" => 2018-03-05T04:22:37.536Z,
          "beat" => {
            "name" => "hoge.example.com",
        "hostname" => "hoge.example.com",
         "version" => "6.2.2"
    },
      "@version" => "1",
          "host" => "hoge.example.com",
     "metricset" => {
          "name" => "memory",
           "rtt" => 40,
        "module" => "system"
    },
         "error" => {
        "message" => "memory: open /compat/linux/proc/meminfo: no such file or directory"
    },
          "tags" => [
        [0] "beats_input_raw_event"
    ]
}

上の出力例の15行目にエラーメッセージがある。
/compat/linux/proc/hogeが無いということはLinux互換モードが必要。う〜ん、Linuxに寄りすぎだわね。
仕方がないのでFreeBSDをLinux互換モードにして/compat/linux/proc/hogeを使えるようにしてやる。

/etc/rc.conf (追記1行)
linux_enable="YES"

これでOSを再起動するとカーネルにlinux.ko, linux_common.ko, linux64.ko おそらくこの3つあたりが読み込まれている筈。
惜しいことにこれだけではlinprocfs.koを読んでくれてない。

/boot/loader.conf (追記1行)
linprocfs_load="YES"

これで次回OS起動から自動でlinprocfs.koを読んでくれる。

OS起動後に手動でカーネルモジュールを読み込ませたいならkldload hoge、読み込んでいるカーネルモジュールをリスト表示したいならkldstat

# kldload linprocfs   #モジュール読み込みが正常なら何も返事してこない
# kldstat
Id Refs Address            Size     Name
 1   31 0xffffffff80200000 1f67a88  kernel
 2    1 0xffffffff82169000 1620     accf_data.ko
 3    1 0xffffffff8216b000 2678     accf_http.ko
 4    1 0xffffffff8216e000 4d18     coretemp.ko
 5    1 0xffffffff82173000 39d8     cc_htcp.ko
 6    1 0xffffffff82511000 5936     fdescfs.ko
 7    1 0xffffffff82517000 34d3c    pf.ko
 8    1 0xffffffff8254c000 42864    linux.ko
 9    3 0xffffffff8258f000 7b0f     linux_common.ko
10    1 0xffffffff82597000 3c93f    linux64.ko
11    1 0xffffffff825d4000 a877     linprocfs.ko
ディレクトリ作成
# mkdir -p /compat/linux/proc
linprocfsを手動マウントする。
# mount -t procfs proc /proc
# mount -t linprocfs /dev/null /compat/linux/proc
Logstashで結果を確認
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
    "@timestamp" => 2018-03-05T05:07:39.461Z,
        "system" => {
        "memory" => {
            "actual" => {
                "free" => 8512475136,
                "used" => {
                      "pct" => 2182392106.3244,
                    "bytes" => 18446744073649610752
                }
            },
             "total" => 8452534272,
              "used" => {
                  "pct" => 0.0762,
                "bytes" => 644132864
            },
              "free" => 7808401408,
              "swap" => {
                "total" => 0,
                 "used" => {
                      "pct" => 0,
                    "bytes" => 0
                },
                 "free" => 0
            }
        }
    },
          "beat" => {
            "name" => "hoge.example.com",
        "hostname" => "hoge.example.com",
         "version" => "6.2.2"
    },
      "@version" => "1",
          "host" => "hoge.example.com",
     "metricset" => {
          "name" => "memory",
           "rtt" => 216,
        "module" => "system"
    },
          "tags" => [
        [0] "beats_input_raw_event"
    ]
}

正常に値を取れていることが確認できたのでlinprocfsの自動マウント指定を/etc/fstabに書き込む。
linprocfsが正常に使えないのに/etc/fstabに書き込んだら次回にOSが正常に起動できなくてシングルユーザーモードで停まってしまう。 シングルユーザーモードの操作が解らないと途方に暮れることになるので注意。 mount -u / を実行して/etc/fstabを修正してumount -aをしてrebootだけのことだけど。

/etc/fstab (追記2行)
1
2
proc    /proc               procfs     rw  0   0
linproc /compat/linux/proc  linprocfs  rw  0   0

初稿ではlinprocfsだけ追加にしていたが、FreeBSD標準設定でprocfsが入っていないので追加した。

Metricbeatの出力データはおそらく加工無しにelasticsearchに読み込ませて良いかと思われるのでLogstashを介する必要は無いはず。テストが終わったらMetricbeatの出力先をLogstashからelasticsearchに変更する。

/usr/local/etc/metricbeat.yml (変更箇所)
1
2
3
4
5
output.elasticsearch:
    hosts: ["localhost:9200"]

#output.logstash:
#  hosts: ["localhost:5044"]
Metricbeatの再起動
# service metricbeat restart

そのうちportsに手が入ってLinux互換モード無しでMetricbeatが使えるようになるのかしら?

関連記事:
Up