Event tracking, heartbeat monitoring, and real-time status updates for your apps β powered by Secploy.
Secploy is a modern security monitoring and observability platform that helps you track events, uptime, and live statuses in real time.
The Secploy SDK can be configured in multiple ways, providing flexibility for different environments and use cases.
-
Direct initialization parameters
client = SecployClient() config = SecployConfig( api_key="your-project-key", environment_key="your-key" organization_id="your-organization-id", environment="production", log_level=LogLevel.INFO, batch_size=100 ) client = SecployClient(config=config)
-
Configuration file (.secploy or project-name.secploy)
api_key: your-project-api-key
environment_key: key
organization_id: "your-organization-id",
environment: production
debug: true
- Environment variables
export SECPLOY_API_KEY=your-api-key export SECPLOY_ORGANIZATION_ID=your-organization-id export SECPLOY_ENVIRONMENT=production export SECPLOY_DEBUG=true
Option | Type | Default | Description |
---|---|---|---|
api_key |
str |
Required | Your Secploy project API key |
environment_key |
str |
Required | Your Secploy environment API key |
environment |
str |
"development" |
Environment name (e.g., production, staging) |
ingest_url |
str |
"https://api.secploy.com" |
Secploy API endpoint |
heartbeat_interval |
int |
30 |
Seconds between heartbeat signals |
max_retry |
int |
3 |
Maximum retry attempts for failed requests |
debug |
bool |
false |
Enable debug logging |
sampling_rate |
float |
1.0 |
Event sampling rate (0.0 to 1.0) |
log_level |
LogLevel /str |
"INFO" |
Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
batch_size |
int |
100 |
Maximum events per batch |
max_queue_size |
int |
10000 |
Maximum events in queue before dropping |
flush_interval |
int |
60 |
Maximum seconds between event batch flushes |
retry_attempts |
int |
3 |
Number of retry attempts for failed events |
ignore_errors |
bool |
false |
Continue on non-critical errors |
source_root |
str |
None |
Root directory for source file paths |
Create a .secploy
file in your project root:
# Required settings
api_key: your-api-key
environment_key: key
environment: production
# Event batching
batch_size: 100
flush_interval: 30
max_queue_size: 5000
# Performance
sampling_rate: 0.1 # Sample 10% of events
max_retry: 3
retry_attempts: 2
# Debugging
debug: false
log_level: INFO
ignore_errors: false
# Advanced
source_root: /app
heartbeat_interval: 60
ingest_url: https://api.secploy.com
All configuration options can be set via environment variables with the SECPLOY_
prefix:
# Required settings
SECPLOY_API_KEY=your-api-key
SECPLOY_ENVIRONMENT_KEY=key
SECPLOY_ENVIRONMENT=production
# Event batching
SECPLOY_BATCH_SIZE=100
SECPLOY_FLUSH_INTERVAL=30
SECPLOY_MAX_QUEUE_SIZE=5000
# Performance
SECPLOY_SAMPLING_RATE=0.1
SECPLOY_MAX_RETRY=3
SECPLOY_RETRY_ATTEMPTS=2
# Debugging
SECPLOY_DEBUG=false
SECPLOY_LOG_LEVEL=INFO
SECPLOY_IGNORE_ERRORS=false
# Advanced
SECPLOY_SOURCE_ROOT=/app
SECPLOY_HEARTBEAT_INTERVAL=60
SECPLOY_INGEST_URL=https://api.secploy.com
With the Secploy Python SDK, you can:
- β Send events from your Python applications or microservices.
- π Monitor uptime & availability using heartbeats.
- π Attach environment and project metadata automatically.
- π‘ Receive live project statuses in your Secploy dashboard (
Running
,Idle
,Shutdown
).
Install directly from PyPI:
pip install secploy
Or from source:
git clone https://github.com/your-org/secploy-python-sdk.git
cd secploy-python-sdk
pip install .
from secploy import SecployClient
client = SecployClient(
api_key="your_project_api_key",
environment="production"
)
client.track_event(
name="user_signup",
properties={
"user_id": 101,
"plan": "pro",
"referral": "campaign_2025"
}
)
incident = client.create_incident(
title="High Error Rate",
description="API error rate exceeded 5% in the EU region.",
severity="critical"
)
print("Incident ID:", incident.id)
(Ideal for background jobs, services, or scheduled tasks)
import time
while True:
client.heartbeat()
time.sleep(60) # every minute
(Requires WebSocket + Django Channels backend)
for status in client.listen_status():
print(f"[STATUS UPDATE] Project is now {status}")
Possible statuses:
running
idle
shutdown
When you create a project in Secploy, multiple environments are automatically created:
Environment | Purpose |
---|---|
production |
Live, customer-facing |
staging |
Pre-production testing |
development |
Local development |
Each environment has its own API key β use the matching key for the environment youβre sending data from.
Method | Description |
---|---|
track_event(name, properties) |
Send a structured event |
create_incident(title, description, severity) |
Create a new incident |
heartbeat() |
Send a heartbeat signal |
listen_status() |
Stream live project status |
set_environment(env_code) |
Switch environment dynamically |
capture_logs(loggers, level) |
Start capturing logs |
stop_capturing_logs(loggers) |
Stop capturing specific logs |
Secploy provides powerful structured logging capabilities that automatically format and send your logs with rich context.
import logging
from secploy import SecployClient
# Initialize client
client = SecployClient()
client.start()
# Start capturing logs
client.capture_logs(['your_app'], level=logging.INFO)
# Your regular logging calls will now be captured
logger = logging.getLogger('your_app')
logger.info("User logged in", extra={
'user_id': 'user123',
'login_method': 'oauth'
})
All captured logs are automatically structured in a consistent format:
{
"timestamp": "2025-09-13T16:45:00Z",
"type": "error",
"message": "Unhandled exception in payment processor",
"context": {
"user_id": "usr_12345",
"session_id": "sess_abcd",
"http_method": "POST",
"http_url": "/api/payments/charge",
"http_status": 500,
"stacktrace": [
"File \"payment_service.py\", line 42, in process_charge",
"File \"stripe_gateway.py\", line 87, in create_charge",
"Exception: Card declined"
],
"tags": {
"environment": "production",
"service": "payments",
"region": "us-east-1"
}
}
}
import logging
from flask import Flask, request
from secploy import SecployClient
# Set up logging
logger = logging.getLogger(__name__)
# Initialize Flask and Secploy
app = Flask(__name__)
client = SecployClient()
client.start()
# Capture logs from all components
client.capture_logs([
'flask.app', # Flask framework logs
__name__, # Main application logs
'payment_processor' # Component-specific logs
], level=logging.INFO)
@app.route('/api/payment', methods=['POST'])
def process_payment():
try:
data = request.json
logger.info("Processing payment", extra={
'user_id': data.get('user_id'),
'http_method': request.method,
'http_url': request.path,
'amount': data.get('amount')
})
# Process payment...
return {"status": "success"}, 200
except Exception as e:
logger.error(
"Payment failed",
exc_info=True, # This captures the stack trace
extra={
'user_id': data.get('user_id'),
'http_method': request.method,
'http_url': request.path,
'http_status': 500
}
)
return {"error": str(e)}, 500
if __name__ == '__main__':
try:
app.run()
finally:
client.stop()
- Add Context: Always include relevant context using the
extra
parameter - Use Proper Log Levels: Choose appropriate levels (DEBUG, INFO, WARNING, ERROR)
- Include Stack Traces: Use
exc_info=True
when logging exceptions - Capture All Components: Include all relevant loggers in your capture list
- Start Early, Stop Late: Initialize logging before your app starts and stop it in a finally block
- Python 3.8+
requests
websocket-client
-
Fork the repo
-
Create your feature branch:
git checkout -b feature/my-feature
-
Commit your changes:
git commit -m "Add my feature"
-
Push to the branch and open a Pull Request
MIT License β See LICENSE for details.