1## This Source Code Form is subject to the terms of the Mozilla Public
2## License, v. 2.0. If a copy of the MPL was not distributed with this
3## file, You can obtain one at https://mozilla.org/MPL/2.0/.
4##
5## Copyright (c) 2007-2021 VMware, Inc. or its affiliates.  All rights reserved.
6
7defmodule RabbitMQ.CLI.Diagnostics.Commands.ObserverCommand do
8  @behaviour RabbitMQ.CLI.CommandBehaviour
9  use RabbitMQ.CLI.DefaultOutput
10
11  def switches(), do: [interval: :integer]
12  def aliases(), do: [i: :interval]
13
14  def merge_defaults(args, opts) do
15    {args, Map.merge(%{interval: 5}, opts)}
16  end
17
18
19  use RabbitMQ.CLI.Core.AcceptsNoPositionalArguments
20
21  def run([], %{node: node_name, interval: interval}) do
22    case :observer_cli.start(node_name, [{:interval, interval * 1000}]) do
23      # See zhongwencool/observer_cli#54
24      {:badrpc, _} = err   -> err
25      {:error, _} = err    -> err
26      {:error, _, _} = err -> err
27      :ok   -> {:ok, "Disconnected from #{node_name}."}
28      :quit -> {:ok, "Disconnected from #{node_name}."}
29      other -> other
30    end
31  end
32
33  def help_section(), do: :observability_and_health_checks
34
35  def description(), do: "Starts a CLI observer interface on the target node"
36
37  def usage, do: "observer [--interval <seconds>]"
38
39  def usage_additional() do
40    [
41      ["--interval <seconds>", "Update interval to use, in seconds"]
42    ]
43  end
44
45  def banner(_, %{node: node_name}) do
46    "Starting a CLI observer interface on node #{node_name}..."
47  end
48end
49