simonmittag/p0d

View on GitHub
README.md

Summary

Maintainability
Test Coverage
![](p0d_80.png)

p0d is a cli based speed and HTTP performance testing tool for Linux and Darwin operating systems. Features include support
for HTTP/1.1, HTTP/2, file attachments as multipart/form-data, and TLS. p0d provides realtime updates
on stdout, including errors within test runs. p0d is beta grade software under active development, `v0.4.0` was
released 12/04/23.

[![Circleci Builds](https://circleci.com/gh/simonmittag/p0d.svg?style=shield)](https://circleci.com/gh/simonmittag/p0d)
[![Github Issues](https://img.shields.io/github/issues/simonmittag/p0d)](https://github.com/simonmittag/p0d/issues)
[![Github Activity](https://img.shields.io/github/commit-activity/m/simonmittag/p0d)](https://img.shields.io/github/commit-activity/m/simonmittag/p0d)  
[![Go Report](https://goreportcard.com/badge/github.com/simonmittag/p0d)](https://goreportcard.com/report/github.com/simonmittag/p0d)
[![Codeclimate Maintainability](https://api.codeclimate.com/v1/badges/06a7484f009ea48a3832/maintainability)](https://codeclimate.com/github/simonmittag/p0d/maintainability)
[![Codeclimate Test Coverage](https://api.codeclimate.com/v1/badges/06a7484f009ea48a3832/test_coverage)](https://codeclimate.com/github/simonmittag/p0d/test_coverage)
[![Go Version](https://img.shields.io/github/go-mod/go-version/simonmittag/p0d)](https://img.shields.io/github/go-mod/go-version/simonmittag/p0d)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Version](https://img.shields.io/badge/version-0.4.0-orange)](https://github.com/simonmittag/p0d)

## Up and running

### Homebrew
```bash
brew tap simonmittag/cli && 
  brew install p0d
```

### Golang
```bash
git clone https://github.com/simonmittag/p0d && cd p0d &&
  go install github.com/simonmittag/p0d/cmd/p0d
```

## Usage Samples

Run for 30 seconds with 10 concurrent connections against local server
```
λ p0d -d 30 -c 10 http://localhost:8080/path
```

Run in http/2 mode against local server and save output to `log.json`
```
λ p0d -H 2 -O log.json http://localhost:8080/path
```

Run with config file
```
λ p0d -C config_get.yml
```

![](bash.gif)

### Cli args
```
λ p0d v0.3.9
 usage: p0d [-f flag] [URL]

 flags:
  -C string
        load configuration from yml file
  -H string
        http version to use. Values are 1.1 and 2 (which works only with TLS URLs). Defaults to 1.1 (default "1.1")
  -O string
        save detailed JSON output to file
  -c int
        maximum amount of concurrent TCP connections used (default 1)
  -d int
        time in seconds to run p0d (default 10)
  -h    
        print usage instructions
  -s 
        skip internet speed test, i.e. for local targets
  -v    
        print version
```

### Config file reference

```
---
exec:
  mode: binary
  durationSeconds: 10
  concurrency: 1
  logsampling: 1
  spacingMillis: 10
  skipInetTest: true
req:
  method: POST
  url: http://localhost:8080/path
  headers:
    - Accept-Encoding: "identity"
  body: '
   { "your": "body" }
  '
res:
  code: 200
```

#### exec.mode
`binary` or `decimal` for MiB or MB units in reporting

#### exec.durationsSeconds
run pod for `n` seconds. Defaults to `10`

#### exec.dialTimeoutSeconds
give up connecting to upstream resource after `n` seconds. Defaults to `3`

#### exec.concurrency
use a pool of maximum `n` concurrent TCP connections. Defaults to `1`. Make sure your OS supports
sufficient open file descriptors before settings this to a very high value. 

#### exec.spacingMillis
artificial spacing in milliseconds, introduced before sending each request. Defaults to `0`

#### exec.httpVersion
preferred http version. Allowable values are `1.1`. and `2`. Defaults to `1.1`. Please note that HTTP/2 is only
supported using TLS. Http version is negotiated, not absolute and HTTP/2 may fall back to HTTP/1.1

#### exec.logsampling
ratio between `0.0` and `1.0` of requests to keep when saving results to disk with `-O` Defaults to 0

#### exec.skipInetTest
skips the general internet speed test. Note this is not targetting your URL but the speedtest.net network.

#### req.method
http request method, usually one of `GET`, `PUT`, `POST`, or `DELETE`

#### req.url
upstream resource url. Must be supplied.

#### req.headers
list of headers to include in the request. use this to inject i.e. authentication

#### res.code
the expected http resonse code. if not matched, request counts as failed in test summary. Defaults to `200`

## Contributions

The p0d team welcomes all [contributors](https://github.com/simonmittag/p0d/blob/master/CONTRIBUTING.md). Everyone
interacting with the project's codebase, issue trackers, chat rooms and mailing lists is expected to follow
the [code of conduct](https://github.com/simonmittag/p0d/blob/master/CODE_OF_CONDUCT.md)