Providers Overview¶
OmniSignal uses a provider pattern to support multiple signal sources through a unified interface.
Provider Types¶
Thick Providers¶
Thick providers use official SDKs from the signal source vendor. They offer:
- Full API coverage
- Automatic authentication handling
- Built-in pagination
- Type-safe request/response handling
Examples: PagerDuty, Jira, New Relic
Thin Providers¶
Thin providers use native HTTP without external SDK dependencies. They offer:
- Minimal dependencies
- Smaller binary size
- Direct control over API calls
Examples: Analyst, Competitive
Built-in Providers¶
| Provider | Type | Import Path | Signal Types |
|---|---|---|---|
| PagerDuty | Alerting | omnisignal/provider/pagerduty |
alert, outage |
| Jira | Ticketing | omnisignal/provider/jira |
support_ticket, feedback |
| Analyst | Market Intelligence | omnisignal/provider/analyst |
analyst_finding |
| Competitive | Market Intelligence | omnisignal/provider/competitive |
competitive_gap, competitor_launch |
External Providers¶
| Provider | Type | Module | Signal Types |
|---|---|---|---|
| New Relic | Monitoring | omni-newrelic/omnisignal |
alert, metric_anomaly |
| Aha | Product Feedback | grokify/aha-studio/omnisignal |
enhancement_request |
Provider Registration¶
Providers register themselves automatically via init():
import (
"github.com/plexusone/omnisignal"
_ "github.com/plexusone/omnisignal/provider/pagerduty" // Registers "pagerduty"
_ "github.com/plexusone/omnisignal/provider/jira" // Registers "jira"
_ "github.com/plexusone/omnisignal/provider/analyst" // Registers "analyst"
_ "github.com/plexusone/omnisignal/provider/competitive" // Registers "competitive"
)
func main() {
// List registered providers
providers := omnisignal.List()
// ["analyst", "competitive", "jira", "pagerduty"]
// Check if a provider is registered
if omnisignal.IsRegistered("pagerduty") {
provider, err := omnisignal.New("pagerduty", cfg)
}
}
Priority System¶
When multiple implementations exist for the same provider, the one with higher priority wins:
| Priority | Constant | Description |
|---|---|---|
| 10 | PriorityThick |
SDK-based implementations |
| 0 | PriorityThin |
HTTP-based implementations |
This allows thick providers to automatically override thin providers when both are imported.
Creating Instances¶
Use omnisignal.New() to create provider instances:
// Create with explicit config
provider, err := omnisignal.New("pagerduty", omnisignal.Config{
APIKey: os.Getenv("PAGERDUTY_API_KEY"),
})
if err != nil {
log.Fatal(err)
}
defer provider.Close()
// Panic on error (use only in init)
provider := omnisignal.MustNew("pagerduty", cfg)
Common Errors¶
| Error | Cause |
|---|---|
ErrProviderNotFound |
Provider name not registered; check import |
ErrInvalidConfig |
Missing required configuration field |
ErrAuthentication |
API key or credentials invalid |
ErrRateLimited |
Too many requests; implement backoff |
ErrNotSupported |
Operation not available for this provider |