GithubHelp home page GithubHelp logo

hon95 / prometheus-nut-exporter Goto Github PK

View Code? Open in Web Editor NEW
86.0 86.0 16.0 115 KB

A Prometheus exporter for Network UPS Tools (NUT)

License: GNU General Public License v3.0

Dockerfile 3.16% Shell 4.90% Rust 80.15% Python 11.79%
network-ups-tools prometheus-exporter

prometheus-nut-exporter's People

Contributors

hon95 avatar nsapa avatar nvtkaszpir avatar uncleborsch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

prometheus-nut-exporter's Issues

Add "BOOST" to UPS status metrics

Hey,
I just wanted to ask if it's possible for you to add the "BOOST" status to the metrics. The "BOOST" status is activated, when the input voltage is too low (in my area <215 Volts) and the UPS needs to "boost" the Voltage to match the expected output (in my area 220-240 Volts). As I quite often get an "undervoltage" here and the UPS's need to boost, I'd like to add it to my monitoring, so I can provide the data to my electricity provider, so maybe they can fix it. Would it be possible for you to add that to the metrics?
Thanks in advance!
Screenshot 2022-08-02 163928

How can I setup a unauthenticated user?

Hi,

Just came across this awesome exporter.
Im pretty new to Nut and couldn't find out how its possible to create a nut server without authentication?
Currently I got 3 machines 2 slaves with user authentication and one single for the nut server itself.

Thank you for your time in advance!

metrics for Eaton 5PX 3000

Thank you for making this exporter, it's very useful! Would be possible to add more metrics or to generate them somehow dynamically? Below dump is from webnut and it would be handy if you could add at least outlet*, ups.test.result, metrics.

battery.capacity | Battery capacity (Ah) | 9.00
-- | -- | --
battery.charge | Battery charge (percent of full) | 100
battery.charge.low | Remaining battery level when UPS switches to LB (percent) | 20
battery.charge.restart | Minimum battery level for restart after power off (percent) | 0
battery.charger.status | Battery charger status | floating
battery.energysave | Switch off when running on battery and no/low load | no
battery.protection | Prevent deep discharge of battery | yes
battery.runtime | Battery runtime (seconds) | 6234
battery.type | Battery chemistry | PbAc
device.mfr | Description unavailable | EATON
device.model | Description unavailable | Eaton 5PX 3000
device.serial | Description unavailable | xxxxx
device.type | Description unavailable | ups
driver.name | Driver name | usbhid-ups
driver.parameter.pollfreq | Description unavailable | 30
driver.parameter.pollinterval | Description unavailable | 2
driver.parameter.port | Description unavailable | auto
driver.parameter.serial | Description unavailable | xxxxx
driver.parameter.synchronous | Description unavailable | auto
driver.version | Driver version - NUT release | 2.8.0
driver.version.data | Description unavailable | MGE HID 1.46
driver.version.internal | Internal driver version | 0.47
driver.version.usb | USB library version | libusb-1.0.26 (API: 0x1000109)
input.current | Input current (A) | 0.90
input.frequency | Input line frequency (Hz) | 50.0
input.frequency.extended | Extended input frequency range | yes
input.frequency.nominal | Nominal input line frequency (Hz) | 50
input.sensitivity | Input power sensitivity | low
input.transfer.boost.low | Low voltage boosting transfer point (V) | 184
input.transfer.high | High voltage transfer point (V) | 294
input.transfer.low | Low voltage transfer point (V) | 160
input.transfer.trim.high | High voltage trimming transfer point (V) | 265
input.voltage | Input voltage (V) | 237.1
input.voltage.extended | Extended input voltage range | no
input.voltage.nominal | Nominal input voltage (V) | 230
outlet.1.autoswitch.charge.low | Remaining battery level to power off this outlet (percent) | 0
outlet.1.current | Description unavailable | 0.60
outlet.1.delay.shutdown | Interval to wait before shutting down this outlet (seconds) | 65535
outlet.1.delay.start | Interval to wait before restarting this outlet (seconds) | 3
outlet.1.desc | Outlet description | PowerShare Outlet 1
outlet.1.id | Outlet system identifier | 1
outlet.1.power | Description unavailable | 142
outlet.1.powerfactor | Description unavailable | 38.00
outlet.1.realpower | Description unavailable | 54
outlet.1.status | Outlet switch status | on
outlet.1.switchable | Outlet switch ability | yes
outlet.2.autoswitch.charge.low | Remaining battery level to power off this outlet (percent) | 0
outlet.2.current | Description unavailable | 0.50
outlet.2.delay.shutdown | Interval to wait before shutting down this outlet (seconds) | 65535
outlet.2.delay.start | Interval to wait before restarting this outlet (seconds) | 6
outlet.2.desc | Outlet description | PowerShare Outlet 2
outlet.2.id | Outlet system identifier | 2
outlet.2.power | Description unavailable | 119
outlet.2.powerfactor | Description unavailable | 57.00
outlet.2.realpower | Description unavailable | 68
outlet.2.status | Outlet switch status | on
outlet.2.switchable | Outlet switch ability | yes
outlet.current | Description unavailable | 0.00
outlet.desc | Outlet description | Main Outlet
outlet.id | Outlet system identifier | 0
outlet.power | Description unavailable | 0
outlet.powerfactor | Description unavailable | 0.00
outlet.realpower | Description unavailable | 0
outlet.switchable | Outlet switch ability | no
output.current | Output current (A) | 1.10
output.frequency | Output frequency (Hz) | 50.0
output.frequency.nominal | Nominal output frequency (Hz) | 50
output.powerfactor | Description unavailable | 0.51
output.voltage | Output voltage (V) | 237.1
output.voltage.nominal | Nominal output voltage (V) | 230
ups.beeper.status | UPS beeper status | enabled
ups.delay.shutdown | Interval to wait after shutdown with delay command (seconds) | 20
ups.delay.start | Interval to wait before (re)starting the load (seconds) | 30
ups.efficiency | Efficiency of the UPS | 84
ups.firmware | UPS firmware | 14
ups.load | Load on UPS (percent of full) | 8
ups.load.high | Load when UPS switches to overload condition (percent) | 105
ups.mfr | UPS manufacturer | EATON
ups.model | UPS model | Eaton 5PX 3000
ups.power | Current value of apparent power (VA) | 261
ups.power.nominal | UPS power rating (VA) | 3000
ups.productid | Product ID for USB devices | ffff
ups.realpower | Current value of real power (W) | 135
ups.realpower.nominal | UPS real power rating (W) | 2700
ups.serial | UPS serial number | xxxxx
ups.shutdown | Description unavailable | enabled
ups.start.auto | UPS starts when mains is (re)applied | yes
ups.start.battery | Allow to start UPS from battery | yes
ups.start.reboot | UPS reboots when power returns during shutdown delay | yes
ups.status | UPS status | OL CHRG
ups.test.interval | Interval between self tests (seconds) | 2592000
ups.test.result | Results of last self test | Done and passed
ups.timer.shutdown | Time before the load will be shutdown (seconds) | -1
ups.timer.start | Time before the load will be started (seconds) | -1
ups.type | UPS type | offline / line interactive
ups.vendorid | Vendor ID for USB devices | 0463

Add power value

Hello,
Can you add this field :
ups.power
ups.power.nominal
ups.model
input.frequency
input.voltage.nominal
output.frequency
output.frequency.nominal

Does not work when on battery

The exporter does not provide values when the UPS is on battery. (Prometheus does work between power loss and shutdown, I can see the values from the other sources.)

I'm not sure how the information is parsed (sorry, no Rust experience), but maybe the problem is that my UPS (at least when using upsc) reports "OB DISCHRG" instead of simply "OB" when on battery. I only found "OB" in the code and no "startsWith".

arm64 image?

Hey,

Would it be possible to publish arm64 images to Dockerhub? The current Dockerfile build just fine on arm64 with a minor tweak -- I'd be happy to submit it as a PR if you'd like:

diff --git a/Dockerfile b/Dockerfile
index cde5e3b..db751fb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -38,7 +38,7 @@ WORKDIR /app

 # Add tini to properly handle signals
 ARG TINI_VERSION
-ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
+ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-arm64 /tini
 RUN chmod +x /tini

 # Add non-root user

I'm not particularly familiar with building multi-arch Docker images, but a hacky workaround could be done in shell to get the correct Tini filename with something like this:

case "$(uname -m)" in
    aarch64)
        TINI_NAME='tini-arm64'
        ;;
    *)
        TINI_NAME='tini'
        ;;
esac

Thanks!

Can't connect to NUT server running on synology

I apologize if the issue ends up not being in this repo.

I have a NUT server running on my synology. I think I can telnet to it correctly:

[hamish@hamish-desktop home-infra]$ telnet nut.nicholson.systems 3493                                                                                                                  
Trying 10.0.0.11...                                                                                                                                                                           
Connected to nut.nicholson.systems.                                                                                                                                                           
Escape character is '^]'.                                                                                                                                                                     
LIST UPS                                                                                                                                                                                      
BEGIN LIST UPS                                                                                                                                                                                
UPS ups "Description unavailable"                                                                                                                                                             
END LIST UPS                                                                                                                                                                                  
^C^]                                                                                                                                                                                          
telnet> exit                                                                                                                                                                                  
?Invalid command                                                                                                                                                                              
telnet> quit                                                                                                                                                                                  
Connection closed.

My ups name is creatively ups. When I go to http://<ip of exporter>:9995/nut?target=nut.nicholson.systems:3493 I get:

Failed to communicate with target.

Failed get NUT version from NUT query.

The wiki post linked on a very similar issue a few months ago no longer works. Do you have any suggested debugging steps?

Address family not supported by protocol

Hello, sometimes, I got the error :

2023-08-01T10:26:49.276091265Z [2023-08-01T10:26:49Z INFO  prometheus_nut_exporter::http_server] Binding to endpoint: http://[::]:9995
2023-08-01T10:26:49.279367645Z [2023-08-01T10:26:49Z ERROR prometheus_nut_exporter::http_server] Server failed to bind to endpoint: error creating server listener: Address family not supported by protocol (os error 97)

and the server doesn't answer to calls

but, it's hard to debug, because it doesn't appear each times .

So, for the moment I add an healthcheck : wget http://127.0.0.1:9995 -O /dev/null -q . Not the best solution, but it will force the container to automatically reboot if stuck on "failed to bind"

How to get the exporter running on a Raspberry Pi?

Hey,

i have just installed my nut-server and everything seems to work fine. I can connect to telnet and so on.

So i wanted to try the nut-exporter. I created a docker-compose file and added the new job to the prometheus.yml.

But i get how you start the exporter to scrape the data, because so far i haven´t added any ip address for my nut-server.

It would be nice if you could give me an example on how to run the exporter.

Thanks in Advance :-)

Unable to parse more than one UPS

Looks like the code returns error when trying to process more than one UPS from nut-server.
I believe this can be reproduced with dummy-ups https://networkupstools.org/docs/man/dummy-ups.html (see below)

Example config on the nut server:
ups.conf

[bagien]
    driver = apcsmart
    port = /dev/ttyS0
    desc = "Directly attached to Bagno"

[apcups01]
    driver = snmp-ups
    port = 192.168.1.9
    pollfreq = 10
    community = public
    snmp_version = v2c
    desc = "APC UPS 1K under the desk"

running query to prometheus-nut-exporter results in error such as (HTTP 503):

Example error:
```text
Failed to communicate with target.

Malformed list for NUT query "LIST VAR bagien

".

and when hitting refresh the word bagien will be replaced also with another ups name (in that case apcups01).
Also notice that the LIST VAR <ups> command actually contains extra newlines, this is weird.

Things tested:

  • commenting out any part of the code to leave only one UPS - then it works
  • testing from another host with single ups - works,
  • test with dummy-ups (just add new section as below and restart nut-server), and thus this is very easily reproducible
[dummy]
        driver = dummy-ups
        port = evolution500.dev
        desc = "dummy-ups in dummy mode"
  • executed some commands via telnet to investigate, see below (notcie that word MASKED was used to hide sensitive data):
VER
Network UPS Tools upsd 2.7.4 - http://www.networkupstools.org/

LIST UPS
BEGIN LIST UPS
UPS bagien "Directly attached to Bagno"
UPS apcups01 "APC UPS 1K under the desk"
END LIST UPS
LIST VAR bagien
BEGIN LIST VAR bagien
VAR bagien battery.alarm.threshold "0"
VAR bagien battery.charge "100.0"
VAR bagien battery.charge.restart "00"
VAR bagien battery.date "01/09/15"
VAR bagien battery.runtime "3300"
VAR bagien battery.runtime.low "120"
VAR bagien battery.voltage "13.85"
VAR bagien battery.voltage.nominal "012"
VAR bagien device.mfr "APC"
VAR bagien device.model "Smart-UPS 620   "
VAR bagien device.serial "MASKED"
VAR bagien device.type "ups"
VAR bagien driver.name "apcsmart"
VAR bagien driver.parameter.pollinterval "2"
VAR bagien driver.parameter.port "/dev/ttyS0"
VAR bagien driver.parameter.synchronous "no"
VAR bagien driver.version "2.7.4"
VAR bagien driver.version.internal "3.1"
VAR bagien input.frequency "50.00"
VAR bagien input.quality "FF"
VAR bagien input.sensitivity "H"
VAR bagien input.transfer.high "253"
VAR bagien input.transfer.low "208"
VAR bagien input.transfer.reason "unacceptable utility voltage rate of change"
VAR bagien input.voltage "230.4"
VAR bagien input.voltage.maximum "230.4"
VAR bagien input.voltage.minimum "228.9"
VAR bagien output.voltage "230.4"
VAR bagien output.voltage.nominal "230"
VAR bagien ups.delay.shutdown "020"
VAR bagien ups.delay.start "000"
VAR bagien ups.firmware "22.6.I"
VAR bagien ups.id "BAGIEN  "
VAR bagien ups.load "014.9"
VAR bagien ups.mfr "APC"
VAR bagien ups.mfr.date "09/20/01"
VAR bagien ups.model "Smart-UPS 620   "
VAR bagien ups.serial "MASKED"
VAR bagien ups.status "OL"
VAR bagien ups.test.interval "1209600"
VAR bagien ups.test.result "NO"
END LIST VAR bagien
LIST VAR apcups01
BEGIN LIST VAR apcups01
VAR apcups01 ambient.1.humidity.alarm.high "60.00"
VAR apcups01 ambient.1.humidity.alarm.low "30.00"
VAR apcups01 ambient.1.temperature.alarm.high "40.00"
VAR apcups01 ambient.1.temperature.alarm.low "10.00"
VAR apcups01 battery.charge "100.00"
VAR apcups01 battery.charge.restart "15"
VAR apcups01 battery.current "0.00"
VAR apcups01 battery.date "10/06/15"
VAR apcups01 battery.packs "0.00"
VAR apcups01 battery.packs.bad "0.00"
VAR apcups01 battery.runtime "9180.00"
VAR apcups01 battery.runtime.low "120"
VAR apcups01 battery.voltage "27.50"
VAR apcups01 battery.voltage.nominal "0.00"
VAR apcups01 device.mfr "APC"
VAR apcups01 device.model "Smart-UPS 1000"
VAR apcups01 device.serial "MASKED"
VAR apcups01 device.type "ups"
VAR apcups01 driver.name "snmp-ups"
VAR apcups01 driver.parameter.pollfreq "10"
VAR apcups01 driver.parameter.pollinterval "2"
VAR apcups01 driver.parameter.port "192.168.1.9"
VAR apcups01 driver.parameter.snmp_version "v2c"
VAR apcups01 driver.parameter.synchronous "no"
VAR apcups01 driver.version "2.7.4"
VAR apcups01 driver.version.data "apcc MIB 1.2"
VAR apcups01 driver.version.internal "0.97"
VAR apcups01 input.frequency "50.00"
VAR apcups01 input.sensitivity "medium"
VAR apcups01 input.transfer.high "253"
VAR apcups01 input.transfer.low "208"
VAR apcups01 input.transfer.reason "selfTest"
VAR apcups01 input.voltage "234.70"
VAR apcups01 input.voltage.maximum "236.10"
VAR apcups01 input.voltage.minimum "233.20"
VAR apcups01 output.current "0.00"
VAR apcups01 output.frequency "50.00"
VAR apcups01 output.voltage "234.70"
VAR apcups01 output.voltage.nominal "220"
VAR apcups01 ups.delay.shutdown "90"
VAR apcups01 ups.delay.start "0"
VAR apcups01 ups.firmware "600.3.I"
VAR apcups01 ups.id "UPS_1K"
VAR apcups01 ups.load "5.80"
VAR apcups01 ups.mfr "APC"
VAR apcups01 ups.mfr.date "04/23/05"
VAR apcups01 ups.model "Smart-UPS 1000"
VAR apcups01 ups.serial "MASKED"
VAR apcups01 ups.status "OL"
VAR apcups01 ups.temperature "28.80"
VAR apcups01 ups.test.date "03/11/2021"
VAR apcups01 ups.test.result "Ok"
END LIST VAR apcups01

Wouldn't run unless I uncommented the settings under "Defaults"

I wasn't able to get this working until I uncommented the "Default" settings, which isn't stated anywhere. Just thought it might be worth updating so others don't spend several hours like me trying to get this to work!

This is what worked for me:

nut-exporter:
# Stable v1
image: hon95/prometheus-nut-exporter:1
container_name: nut-exporter
environment:
- TZ=$TZ
- HTTP_PATH=/metrics
# Defaults
- RUST_LOG=info
- HTTP_PORT=9995
- HTTP_PATH=/nut
- LOG_REQUESTS_CONSOLE=false
- PRINT_METRICS_AND_EXIT=false

Can’t connect to nut server

Hi,

I’m trying to get this exporter going, but I think I’m doing something wrong in the target. When I just put in the IP and port the exporter can’t connect 😞 I am trying to connect to an instance of https://hub.docker.com/r/instantlinux/nut-upsd/.

Maybe it’s something in those settings, But they seem pretty vanilla. Maybe you have an example on how to set up a proper NUT server?

Thanks in advance!

Can't get all supported metrics

Only These

# HELP nut_battery_voltage_nominal_volts Battery voltage (nominal). ("battery.voltage.nominal")
# TYPE nut_battery_voltage_nominal_volts gauge
# UNIT nut_battery_voltage_nominal_volts V
nut_battery_voltage_nominal_volts{ups="ups2"} 12
# HELP nut_battery_charge Battery level. (0-1) ("battery.charge")
# TYPE nut_battery_charge gauge
# UNIT nut_battery_charge 
nut_battery_charge{ups="ups2"} 1
# HELP nut_battery_voltage_volts Battery voltage. ("battery.voltage")
# TYPE nut_battery_voltage_volts gauge
# UNIT nut_battery_voltage_volts V
nut_battery_voltage_volts{ups="ups2"} 13.7
# HELP nut_real_power_nominal_watts Real power (nominal). ("ups.realpower.nominal")
# TYPE nut_real_power_nominal_watts gauge
# UNIT nut_real_power_nominal_watts W
nut_real_power_nominal_watts{ups="ups2"} 390
# HELP nut_input_transfer_low_volts Input lower transfer threshold. ("input.transfer.low")
# TYPE nut_input_transfer_low_volts gauge
# UNIT nut_input_transfer_low_volts V
nut_input_transfer_low_volts{ups="ups2"} 160
# HELP nut_info Metadata about the NUT server.
# TYPE nut_info gauge
# UNIT nut_info 
nut_info{version="2.7.4"} 1
# HELP nut_input_voltage_volts Input voltage. ("input.voltage")
# TYPE nut_input_voltage_volts gauge
# UNIT nut_input_voltage_volts V
nut_input_voltage_volts{ups="ups2"} 220
# HELP nut_exporter_info Metadata about the exporter.
# TYPE nut_exporter_info gauge
# UNIT nut_exporter_info 
nut_exporter_info{version="0.0.0-SNAPSHOT+2021-05-06T23:16:38Z"} 1
# HELP nut_input_volts Input voltage. (Compatibility metric, use nut_input_voltage_volts instead.) ("input.voltage")
# TYPE nut_input_volts gauge
# UNIT nut_input_volts V
nut_input_volts{ups="ups2"} 220
# HELP nut_battery_runtime_seconds Battery runtime. ("battery.runtime")
# TYPE nut_battery_runtime_seconds gauge
# UNIT nut_battery_runtime_seconds s
nut_battery_runtime_seconds{ups="ups2"} 1183
# HELP nut_status UPS status. Unknown (0), on line (1, "OL"), on battery (2, "OB"), or low battery (3, "LB"). ("ups.status")
# TYPE nut_status gauge
# UNIT nut_status 
nut_status{ups="ups2"} 1
# HELP nut_battery_volts Battery voltage. (Compatibility metric, use nut_battery_voltage_volts instead.) ("battery.voltage")
# TYPE nut_battery_volts gauge
# UNIT nut_battery_volts V
nut_battery_volts{ups="ups2"} 13.7
# HELP nut_ups_info Metadata about the UPS (e.g. model, battery type, location).
# TYPE nut_ups_info gauge
# UNIT nut_ups_info 
nut_ups_info{location="",battery_type="PbAc",manufacturer="",driver="usbhid-ups",description="APC BK650M2-CH",description2="",model="BK650M2-CH",type="ups",ups="ups2"} 1
# HELP nut_load Load. (0-1) ("ups.load")
# TYPE nut_load gauge
# UNIT nut_load 
nut_load{ups="ups2"} 0.23
# HELP nut_input_transfer_high_volts Input upper transfer threshold. ("input.transfer.high")
# TYPE nut_input_transfer_high_volts gauge
# UNIT nut_input_transfer_high_volts V
nut_input_transfer_high_volts{ups="ups2"} 278
# HELP nut_beeper_status If the beeper is enabled. Unknown (0), enabled (1), disabled (2) or muted (3). ("ups.beeper.status")
# TYPE nut_beeper_status gauge
# UNIT nut_beeper_status 
nut_beeper_status{ups="ups2"} 1
# HELP nut_battery_runtime_low_seconds Battery runtime threshold for state low. ("battery.runtime.low")
# TYPE nut_battery_runtime_low_seconds gauge
# UNIT nut_battery_runtime_low_seconds s
nut_battery_runtime_low_seconds{ups="ups2"} 120
# HELP nut_input_voltage_nominal_volts Input voltage (nominal). ("input.voltage.nominal")
# TYPE nut_input_voltage_nominal_volts gauge
# UNIT nut_input_voltage_nominal_volts V
nut_input_voltage_nominal_volts{ups="ups2"} 220
# HELP nut_battery_charge_low Battery level threshold for low state. (0-1) ("battery.charge.low")
# TYPE nut_battery_charge_low gauge
# UNIT nut_battery_charge_low 
nut_battery_charge_low{ups="ups2"} 0.95

Does not work with QNAP Nut implementation

Setup as described on Docker host (192.168.90.3).
Telnet check works.

$ telnet 192.168.90.3 9995
Trying 192.168.90.3...
Connected to 192.168.90.3.
Escape character is '^]'.

But when checked with QNAP NAS address (192.168.90.6):

$ lynx http://192.168.90.3:9995/metrics?target=192.168.90.6:3493

Failed to communicate with target: Connection reset by peer (os error 104)

when checked from PC web browser

Failed to communicate with target: Malformed list for query "LIST UPS".

  • I remember using "UPS Name" parameter, with value "qnapups" when setting WinNUT and that was mandatory. Just a thought...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.