Fortio (Φορτίο)

Logo

Fortio is a microservices (http, grpc) load testing library, command line tool, advanced echo server, and web UI in go (golang). Fortio allows to specify a set query-per-second load and record latency histograms and other useful stats.

Fortio

Awesome Go Go Report Card GoDoc codecov CircleCI

Welcome to fortio.org the website for Fortio!

Fortio (Φορτίο) started as, and is, Istio’s load testing tool and later (2018) graduated to be its own open-source project.

Fortio runs at a specified query per second (qps) and records an histogram of execution time and calculates percentiles (e.g. p99 ie the response time such as 99% of the requests take less than that number (in seconds, SI unit)). It can run for a set duration, for a fixed number of calls, or until interrupted (at a constant target QPS, or max speed/load per connection/thread).

The name fortio comes from greek φορτίο (Play) which means load/burden.

Fortio is a fast, small (4Mb docker image, minimal dependencies), reusable, embeddable go library as well as a command line tool and server process, the server includes a simple web UI and REST API to trigger run and see graphical representation of the results (both a single latency graph and a multiple results comparative min, max, avg, qps and percentiles graphs).

Fortio also includes a set of server side features (similar to httpbin) to help debugging and testing: request echo back including headers, adding latency or error codes with a probability distribution, tcp echoing, tcp proxying, http fan out/scatter and gather proxy server, GRPC echo/health in addition to http, etc…

Fortio is quite mature and very stable with no known major bugs (lots of possible improvements if you want to contribute though!), and when bugs are found they are fixed quickly, so after 1 year of development and 42 incremental releases, we reached 1.0 in June 2018.

Fortio components can be used a library even for unrelated projects, for instance the log, stats, or fhttp utilities both client and server. As well as the newly integrated Dynamic Flags support (greatly inspired/imported initially from https://github.com/mwitkow/go-flagz but recently reimplemented using Go generics). Even more recent is the new jrpc JSON Remote Procedure Calls library package (docs).

See github.com/fortio/fortio for more information about fortio, see examples of use and screenshots, download the latest release, file any issues or any other way to contribute to the open-source effort.

Demo

You can see also see Fortio live on demo.fortio.org and embeded on istio.io/v1.0/docs/concepts/performance-and-scalability/#synthetic-end-to-end-benchmarks

Log package

Logger package extracted/usable as standalone, now with optional JSON structured logging. Use logc to convert JSON back to human readable logs.

DFlag package

Dynamic Flag package extracted/usable as standalone.

Version package

Version extraction utility package extracted/usable as standalone.

CLI package

CLI abstracts the repetitive parts of a main() command line tool, flag parsing, usage, etc…

Server CLI package

SCLI extends cli for server main() to include dflag setup of a watched config directory and dynamic flag UI/api endpoint.

Sets package

sets type and operations in golang, using generics (go 1.18 and newer).

Struct2env package

struct2env allows you to convert from Go structures to environment variables (and back). For configuration interactions between shell and go objects.

DNS ping

Checks and gather statistic about DNS server responses with DNSping.

Fortio TLS proxy

Front and multiplex your services (like fortio servers, including gRPC) behind a single auto cert valid TLS ingress with Fortio proxy. It fronts the demo site above, it also includes an optional debug proxy which you can find at debug.fortio.org.

Fortio with Open Telemetry support (OTEL)

Fortiotel.

Multicurl Fetch the same URL from all the IPs of a site

See details at github.com/fortio/multicurl

Slack proxy

slack-proxy allows to multiplex and rate control your slack api calls.