Netdata: Difference between revisions

Add instructions how to take newer web UI into use
Sync changes from nixos.wiki and re-format to fit the MoS.
Line 1: Line 1:
__TOC__
<strong>[https://www.netdata.cloud/ Netdata]</strong> is a metrics tool, which comes with a lot of sane pre-configuration.
It contains various plugins, which may need specific steps to be enabled.


[https://www.netdata.cloud/ netdata] is a metrics tool, which comes with a lot of sane preconfiguration.
== Installation ==
It contains of various plugins, which need to be enabled sometimes with additional effort.


== Adding node ==
Add the following to your [[Overview_of_the_NixOS_Linux_distribution#Declarative_Configuration|NixOS configuration]] to setup and use Netdata:
*Install the netdata package and enable the service.
*When adding new node in the web interface you get a token, write that token to /var/lib/netdata/cloud.d/token
*As root run <code>nix-shell -p netdata --run "netdata-claim.sh"</code>


== Newer web UI ==
{{file|configuration.nix|nix|
Netdata comes with an old unmaintained web UI that is accesible at port <code>19999</code>. Netdata Inc. will not fix any bugs in the old UI and it may to become more and more broken as time goes on. There is, however, a newer maintained, but unfree proprietary web UI that can be optionally enabled to replace the old UI. To take it into use, override netdata's package:<syntaxhighlight lang="nix">
<nowiki>
services.netdata.package = pkgs.netdata.override {
{
  withCloudUi = true;
  services.netdata = {
};
    enable = true;
</syntaxhighlight>In addition, you need to allow unfree packages.
    config.global = {
      "memory mode" = "ram";
      "debug log" = "none";
      "access log" = "none";
      "error log" = "syslog";
    };
  };
  networking.firewall.allowedTCPPorts = [ 19999 ];
}
</nowiki>
}}
 
{{Evaluate}}


== Streaming node setup ==
Netdata's basic instance will then be available at <code>http://localhost:19999</code> on the local network.


Ensure you choose appropriate access control for your nodes.
== Configuration ==


=== Receiver node ===
You may wish to aggregate multiple machines' Netdata information, in which case, you can subscribe to the Netdata Cloud service, or you can self-host [[Prometheus]] and [[Grafana]] as a self-hosted solution.


<syntaxhighlight lang="nix">
==== Adding node ====
services.netdata.configDir."stream.conf" =
* Enable the Netdata service as described above.
  let
* When adding a new node in the web interface, you get a token; copy that token to <code>/var/lib/netdata/cloud.d/token</code>.
    mkChildNode = apiKey: allowFrom: ''
* As root, run the <code>netdata-claim.sh</code> script.
      [${apiKey}]
{{Commands|# nix-shell -p netdata --run "netdata-claim.sh"}}
        enabled = yes
 
        default history = <a value of your choice>
=== Streaming node setup ===
        default memory mode = dbengine # a good default
 
        health enabled by default = auto
{{Security Warning|Ensure you choose the appropriate access control for your nodes.}}
        allow from = ${allowFrom}
 
    '';
==== Receiver node ====
  in pkgs.writeText "stream.conf" ''
 
    [stream]
{{file|configuration.nix|nix|
       # This won't stream by itself, except if the receiver is a sender too, which is possible in netdata model.
<nowiki>
{
  services.netdata.configDir."stream.conf" =
    let
      mkChildNode = apiKey: allowFrom: ''
        [${apiKey}]
          enabled = yes
          default history = <A value of your choice>
          default memory mode = dbengine
          health enabled by default = auto
          allow from = ${allowFrom}
      '';
    in pkgs.writeText "stream.conf" ''
      [stream]
       # This won't stream by itself, except if the receiver is a sender too, which is possible in the netdata model.
       enabled = no
       enabled = no
       enable compression = yes
       enable compression = yes


    # An allowed sender node
      # An allowed sender node
    ${mkChildNode "an API key" "an allowed IP"}
      ${mkChildNode "<API key goes here>" "<Allowed IP goes here>"}
  '';
    '';
</syntaxhighlight>
}
</nowiki>
}}


=== Sender node ===
==== Sender node ====


<syntaxhighlight lang="nix">
{{file|configuration.nix|nix|
services.netdata.configDir."stream.conf" = pkgs.writeText "stream.conf" ''
<nowiki>
  [stream]
{
  services.netdata.configDir."stream.conf" = pkgs.writeText "stream.conf" ''
    [stream]
     enabled = yes
     enabled = yes
     destination = receiver-hostname-or-ip-address:19999
     destination = <Receiver hostname or IP address goes here>:19999
     api key = any string that is set also on the receiver side
     api key = <API key goes here>
'';
  '';
</syntaxhighlight>
}
</nowiki>
}}


If you don't need any web UI and want to consume minimal resources on the sender node, use:
If you don't need any web UI and want to consume minimal resources on the sender node, use:


<syntaxhighlight lang="nix">
{{file|configuration.nix|nix|
services.netdata = {
<nowiki>
  config = {
{
  services.netdata.config = {
     global = { "memory mode" = "none"; };
     global = { "memory mode" = "none"; };
     web = {
     web = {
Line 66: Line 96:
     };
     };
   };
   };
};
}
</syntaxhighlight>
</nowiki>
}}


This way, it won't spawn any web UI, neither store any metric locally.
This way, it will neither spawn a web UI, nor store any metric locally.


<span id="python-plugins"></span>
<span id="python-plugins"></span>
= Python Plugins =


== nvidia-smi ==
== Tips and Tricks ==


To enable the <code>nvidia-smi</code> plugin you have to make sure <code>nvidia-smi</code> can be called by <code>netdata</code>.
==== Modern Web UI ====


<syntaxhighlight lang="nix">
{{Unfree}}
systemd.services.enable = true;
systemd.services.netdata.path = [pkgs.linuxPackages.nvidia_x11];
services.netdata.configDir."python.d.conf" = pkgs.writeText "python.d.conf" ''
  nvidia_smi: yes
'';
</syntaxhighlight>


== samba ==
Netdata comes with an old, unmaintained but open source web UI that is accessible at port <code>19999</code>. Netdata Inc. will not fix any bugs in the old UI and it may to become more and more broken as time goes on. There is however, a newer, maintained but proprietary web UI that can be optionally enabled to replace the old UI. To use this new UI, override Netdata's package:


To enable <code>samba</code> plugin additional permissions and configurations will need to be set.
{{file|configuration.nix|nix|
<nowiki>
{
  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
    "netdata"
  ];
  services.netdata.package = pkgs.netdata.override {
    withCloudUi = true;
  };
}
</nowiki>
}}
 
=== Python Plugins ===
 
==== nvidia-smi ====
 
{{Unfree}}
 
To enable the <code>nvidia-smi</code> plugin, you have to ensure that <code>nvidia-smi</code> can be called by <code>netdata</code>:
 
{{file|configuration.nix|nix|
<nowiki>
{
  systemd.services.netdata.path = [ pkgs.linuxPackages.nvidia_x11 ];
  services.netdata.configDir."python.d.conf" = pkgs.writeText "python.d.conf" ''
    nvidia_smi: yes
  '';
}
</nowiki>
}}


<syntaxhighlight lang="nix">
==== samba ====
services.netdata.configDir."python.d.conf" = pkgs.writeText "python.d.conf" ''
  samba: yes
'';


# add samba and sudo to path of python plugin
To enable the <code>samba</code> plugin, additional permissions and configurations will need to be set:
systemd.services.netdata.path = [  pkgs.samba "/run/wrappers" ];


# permit to run sudo smbstatus -P
{{file|configuration.nix|nix|
security.sudo.extraConfig = ''
<nowiki>
  netdata ALL=(root) NOPASSWD: ${pkgs.samba}/bin/smbstatus
{
'';
  services = {
    netdata.configDir."python.d.conf" = pkgs.writeText "python.d.conf" ''
      samba: yes
    '';
    samba.extraConfig = ''
      smbd profiling level = on
    '';
  };


# as documented here : https://github.com/netdata/netdata/blob/master/system/netdata.service.in
  systemd.services.netdata = {
# review capabilityset above if other plugins are non functional
    path = [ pkgs.samba "/run/wrappers" ];
systemd.services.netdata.serviceConfig.CapabilityBoundingSet = ["CAP_SETGID"];
    serviceConfig.CapabilityBoundingSet = [ "CAP_SETGID" ];
  };


# enable profiling
  security.sudo.extraConfig = ''
services.samba.extraConfig = ''
    netdata ALL=(root) NOPASSWD: ${pkgs.samba}/bin/smbstatus
  smbd profiling level = on
  '';
'';
}
</syntaxhighlight>
</nowiki>
}}