https://github.com/containeroo/taco
Simple Go application that checks if a specified TCP target is available
https://github.com/containeroo/taco
Last synced: 6 months ago
JSON representation
Simple Go application that checks if a specified TCP target is available
- Host: GitHub
- URL: https://github.com/containeroo/taco
- Owner: containeroo
- Created: 2024-06-29T09:23:40.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-08-26T13:40:58.000Z (almost 2 years ago)
- Last Synced: 2024-08-26T16:05:01.389Z (almost 2 years ago)
- Language: Go
- Homepage:
- Size: 130 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# DEPRECATION WARNING
`TACO` is deprecated and will be removed in the future.
Please use the fully compatible [containeroo/portpatrol](https://github.com/containeroo/portpatrol) instead.
# TACO (TCP Availability Connection Observer)
This is a simple Go application with zero external dependencies that checks if a specified TCP target is available. It continuously attempts to connect to the specified target at regular intervals until the target becomes available or the program is terminated.
## Environment Variables
TACO accepts the following environment variables:
- `TARGET_ADDRESS`: The address of the target in the format `host:port` (required).
- `TARGET_NAME`: The name of the target to check (optional, default: inferred from `TARGET_ADDRESS`)\*.
- `INTERVAL`: The interval between connection attempts (optional, default: `2s`).
- `DIAL_TIMEOUT`: The timeout for each connection attempt (optional, default: `1s`).
- `LOG_EXTRA_FIELDS`: Log additional fields (optional, default: `false`).
**\*** If `TARGET_NAME` is not set, the name will be inferred from the host part of the target address as follows: `postgres.default.svc.cluster.local:5432` will be inferred as `postgres`.
## Behavior Flowchart
```mermaid
graph TD;
A[Start] --> B[Attempt to connect to TARGET_ADDRESS];
B -->|Connection successful| C[Target is ready];
B -->|Connection failed| D[Wait for retry INTERVAL];
D --> B;
C --> E[End];
F[Program terminated or canceled] --> E;
```
## Logging
With the `LOG_EXTRA_FIELDS` environment variable set to `true` additional fields will be logged.
### With additional fields
```text
ts=2024-07-05T13:08:20+02:00 level=INFO msg="Waiting for PostgreSQL to become ready..." dial_timeout="1s" interval="2s" target_address="postgres.default.svc.cluster.local:5432" target_name="PostgreSQL" version="0.0.22"
ts=2024-07-05T13:08:21+02:00 level=WARN msg="PostgreSQL is not ready ✗" dial_timeout="1s" error="dial tcp: lookup postgres.default.svc.cluster.local: i/o timeout" interval="2s" target_address="postgres.default.svc.cluster.local:5432" target_name="PostgreSQL" version="0.0.22"
ts=2024-07-05T13:08:24+02:00 level=WARN msg="PostgreSQL is not ready ✗" dial_timeout="1s" error="dial tcp: lookup postgres.default.svc.cluster.local: i/o timeout" interval="2s" target_address="postgres.default.svc.cluster.local:5432" target_name="PostgreSQL" version="0.0.22"
ts=2024-07-05T13:08:27+02:00 level=WARN msg="PostgreSQL is not ready ✗" dial_timeout="1s" error="dial tcp: lookup postgres.default.svc.cluster.local: i/o timeout" interval="2s" target_address="postgres.default.svc.cluster.local:5432" target_name="PostgreSQL" version="0.0.22"
ts=2024-07-05T13:08:27+02:00 level=INFO msg="PostgreSQL is ready ✓" dial_timeout="1s" error="dial tcp: lookup postgres.default.svc.cluster.local: i/o timeout" interval="2s" target_address="postgres.default.svc.cluster.local:5432" target_name="PostgreSQL" version="0.0.22"
```
### Without additional fields
```text
time=2024-07-12T12:44:41.494Z level=INFO msg="Waiting for PostgreSQL to become ready..."
time=2024-07-12T12:44:41.512Z level=WARN msg="PostgreSQL is not ready ✗"
time=2024-07-12T12:44:43.532Z level=WARN msg="PostgreSQL is not ready ✗"
time=2024-07-12T12:44:45.552Z level=INFO msg="PostgreSQL is ready ✓"
```
## Kubernetes initContainer Configuration
Configure your Kubernetes deployment to use this init container:
```yaml
initContainers:
- name: wait-for-valkey
image: ghcr.io/containeroo/taco:latest
env:
- name: TARGET_ADDRESS
value: valkey.default.svc.cluster.local:6379
# TARGET_NAME inferred from the target address "valkey.default.svc.cluster.local" which is okay for this use case
# INTERVAL defaults to 2 seconds which is okay for this use case
# DIAL_TIMEOUT defaults to 1 seconds which is okay for this use case
- name: LOG_EXTRA_FIELDS
value: "true"
- name: wait-for-postgres
image: ghcr.io/containeroo/taco:latest
env:
- name: TARGET_NAME
value: PostgreSQL # Use a better name for the target
- name: TARGET_ADDRESS
value: postgres.default.svc.cluster.local:5432
- name: INTERVAL
value: "4s" # Increase the interval duration, e.g., 4 seconds
- name: DIAL_TIMEOUT
value: "2s" # Increase the dial timeout duration, e.g., 2 seconds
```