diff --git a/README.md b/README.md
index 16560c60..435f9659 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,52 @@
-# gnatsd
+# NATS server
[![License][License-Image]][License-Url] [![ReportCard][ReportCard-Image]][ReportCard-Url] [![Build][Build-Status-Image]][Build-Status-Url] [![Release][Release-Image]][Release-Url] [![Coverage][Coverage-Image]][Coverage-Url]
A High Performance [NATS](https://nats.io) Server written in [Go.](http://golang.org)
-## Usage
+**Note**: The `master` branch may be in an *unstable or even in a broken state* during development. Please use [releases][github-release] instead of the `master` branch in order to get stable binaries.
+
+## Getting Started
+
+The best way to get the nats server is to use one of the pre-built release binaries which are available for OSX, Linux (x86-64/ARM), and Docker. Instructions for using these binaries are on the [GitHub releases page][github-release].
+You can also connect to a public server that is running at our demo site: [nats://demo.nats.io:4222](nats://demo.nats.io:4222), and a secure version at [nats://demo.nats.io:4443](nats://demo.nats.io:4443).
+
+Of course you can build the latest version of gnatsd from the `master` branch. The master branch will always build and pass tests, but may not work correctly in your environment.
+You will first need [*Go*](https://golang.org/) installed on your machine (version 1.4+ is required) to build gnatsd.
+
+### Running
+
+The nats server is lightweight and very performant. Starting one with no arguments will give you a server with sane default settings.
+
+```sh
+> gnatsd
+[35572] 2016/01/10 08:54:16.178798 [INF] Starting gnatsd version 0.7.3
+[35572] 2016/01/10 08:54:16.178940 [INF] Listening for client connections on 0.0.0.0:4222
+[35572] 2016/01/10 08:54:16.179115 [INF] gnatsd is ready
+```
+
+The server will be started and listening for client connections on port 4222 from all interfaces. The logs will be displayed to stdout
+as shown above. There are a large range of supported clients that can be found at [https://nats.io/clients](https://nats.io/download).
+The server uses a text based protocol, so interacting with it can be as simple as using telnet.
+
+```sh
+> telnet localhost 4222
+Trying ::1...
+Connected to localhost.
+Escape character is '^]'.
+INFO {"server_id":"3d13165236fe601c863b6714e819fc36","version":"0.7.3","go":"go1.5.2","host":"0.0.0.0","port":4222, ...}
+SUB foo 1
++OK
+PUB foo 11
+Hello World
++OK
+MSG foo 1 11
+Hello World
+```
+
+More information on the protocol can be found at [http://nats.io/documentation/internals/nats-protocol](http://nats.io/documentation/internals/nats-protocol/).
+
+## Configuring
gnatsd accepts command line arguments to control its behavior. An example configuration file is listed below. Note that
command line arguments will override those items in the configuration file.
@@ -48,7 +90,7 @@ Common Options:
-v, --version Show version
```
-## Sample Configuration
+## Sample Configuration File
```
@@ -251,9 +293,11 @@ Add into the server configuration file's authorization section.
## Monitoring
-If the monitoring port is enabled, the server will run a lightweight http server on that port that has several endpoints [/varz, /connz, /routez, /subscriptionsz]. All endpoints return a JSON object.
+If the monitoring port is enabled, the server will run a lightweight http server that has several endpoints defined, **[/varz, /connz, /routez, /subsz]**. All endpoints return a JSON object.
-To test, run '``go run gnatsd.go -m 8222``'
+To test, run '``gnatsd -m 8222``', then go to http://localhost:8222/
+
+### /varz
http://localhost:8222/varz reports various general statistics.
@@ -282,23 +326,33 @@ To test, run '``go run gnatsd.go -m 8222``'
"cores": 4,
"cpu": 0,
"connections": 39,
+ "total_connections": 122,
"routes": 0,
"remotes": 0,
"in_msgs": 100000,
"out_msgs": 100000,
"in_bytes": 1600000,
"out_bytes": 1600000,
- "slow_consumers": 0
+ "slow_consumers": 0,
+ "http_req_stats": {
+ "/": 8,
+ "/connz": 2,
+ "/routez": 0,
+ "/subsz": 0,
+ "/varz": 8
+ }
}
```
+### /connz
+
http://localhost:8222/connz reports more detailed information on current connections. It uses a paging mechanism which defaults to 1024 connections.
You can control these via url arguments (limit and offset), e.g. http://localhost:8222/connz?limit=1&offset=1.
You can also report detailed subscription information on a per connection basis using subs=1, e.g. http://localhost:8222/connz?limit=1&offset=1&subs=1.
```json
{
- "now": "2015-07-14T13:30:59.349179963-07:00",
+ "now": "2016-01-10T08:17:29.970134607-08:00",
"num_connections": 2,
"offset": 0,
"limit": 1024,
@@ -307,6 +361,8 @@ You can also report detailed subscription information on a per connection basis
"cid": 571,
"ip": "127.0.0.1",
"port": 61572,
+ "start": "2016-01-10T08:15:07.970134607-08:00",
+ "uptime": "2m22s",
"pending_bytes": 0,
"in_msgs": 0,
"out_msgs": 0,
@@ -323,6 +379,8 @@ You can also report detailed subscription information on a per connection basis
"cid": 574,
"ip": "127.0.0.1",
"port": 61577,
+ "start": "2016-01-10T08:17:09.970134607-08:00",
+ "uptime": "22m22s",
"pending_bytes": 0,
"in_msgs": 0,
"out_msgs": 0,
@@ -339,6 +397,7 @@ You can also report detailed subscription information on a per connection basis
}
```
+### /routez
http://localhost:8222/routez reports information on active routes for a cluster. Routes are expected to be low, so there is no paging mechanism currently with this endpoint. It does support the subs arg line /connz, e.g. http://localhost:8222/routez?subs=1
@@ -364,7 +423,9 @@ You can also report detailed subscription information on a per connection basis
}
```
-http://localhost:8222/subscriptionsz reports detailed information about the current subscriptions and the routing data structure.
+### /subsz
+
+http://localhost:8222/subsz reports detailed information about the current subscriptions and the routing data structure.
```json
{
@@ -420,24 +481,28 @@ presentations, references and more.
## Client libraries
-There are several client language bindings for NATS. For a complete and updated list, please visit .
+Here is a sample of client language bindings for NATS. For a complete and updated list, please visit .
+
- [Go](https://github.com/nats-io/nats)
-- [Java](https://github.com/tyagihas/java_nats)
-- [Java - Spring](https://github.com/mheath/jnats)
- [Node.js](https://github.com/nats-io/node-nats)
+- [Java](https://github.com/nats-io/jnats)
+- [Spring](https://github.com/cloudfoundry-community/java-nats)
+- [C/C++](https://github.com/nats-io/cnats)
+- [C#/.NET](https://github.com/nats-io/csnats)
- [Ruby](https://github.com/nats-io/ruby-nats)
- [Lua](https://github.com/DawnAngel/lua-nats)
- [PHP](https://github.com/repejota/phpnats)
- [Python](https://github.com/mcuadros/pynats)
-- [Scala](https://github.com/tyagihas/scala_nats/)
+- [Scala](https://github.com/tyagihas/scala_nats)
- [Haskell](https://github.com/ondrap/nats-queue)
-
+- [Rust](https://github.com/jedisct1/rust-nats)
+- [NGINX](https://github.com/nats-io/nginx-nats)
## License
(The MIT License)
-Copyright (c) 2012-2015 Apcera Inc.
+Copyright (c) 2012-2016 Apcera Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
@@ -467,3 +532,4 @@ IN THE SOFTWARE.
[Coverage-image]: https://img.shields.io/coveralls/nats-io/gnatsd.svg
[ReportCard-Url]: http://goreportcard.com/report/nats-io/gnatsd
[ReportCard-Image]: http://goreportcard.com/badge/nats-io/gnatsd
+[github-release]: https://github.com/nats-io/gnatsd/releases/
diff --git a/server/monitor.go b/server/monitor.go
index ce44644f..83d2ffa7 100644
--- a/server/monitor.go
+++ b/server/monitor.go
@@ -117,9 +117,6 @@ func (s *Server) HandleConnz(w http.ResponseWriter, r *http.Request) {
}
pairs = pairs[minoff:maxoff]
- // Use same now for all uptime calculations.
- now := time.Now()
-
for _, pair := range pairs {
client := pair.Val
client.mu.Lock()
@@ -127,7 +124,7 @@ func (s *Server) HandleConnz(w http.ResponseWriter, r *http.Request) {
ci := &ConnInfo{
Cid: client.cid,
Start: client.start,
- Uptime: myUptime(now.Sub(client.start)),
+ Uptime: myUptime(c.Now.Sub(client.start)),
InMsgs: client.inMsgs,
OutMsgs: client.outMsgs,
InBytes: client.inBytes,