File size: 2,588 Bytes
808e55f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
Dapr utility functions for cloud-ready applications.
Provides graceful fallback when Dapr sidecar is not available.
"""
import os
import logging
import requests
import json

logger = logging.getLogger(__name__)

def dapr_http_fallback(endpoint: str, method: str = "POST", data=None, headers=None):
    """
    Generic Dapr HTTP fallback function.
    Tries to use Dapr sidecar, falls back gracefully if not available.

    Args:
        endpoint: Dapr endpoint (e.g., "/v1.0/publish/pubsub_name/topic_name")
        method: HTTP method (GET, POST, PUT, DELETE)
        data: Data to send in request body
        headers: Additional headers to send

    Returns:
        Response from Dapr or fallback, or None if both fail
    """
    dapr_port = os.getenv("DAPR_HTTP_PORT", "3500")
    dapr_url = f"http://localhost:{dapr_port}{endpoint}"

    # Check if Dapr sidecar is available
    try:
        dapr_health_url = f"http://localhost:{dapr_port}/v1.0/healthz"
        health_response = requests.get(dapr_health_url, timeout=2)

        if health_response.status_code == 200:
            # Dapr sidecar is available, use it
            req_headers = headers or {}
            req_headers["Content-Type"] = "application/json"

            if method.upper() == "POST":
                response = requests.post(dapr_url, json=data, headers=req_headers, timeout=10)
            elif method.upper() == "GET":
                response = requests.get(dapr_url, headers=req_headers, timeout=10)
            elif method.upper() == "PUT":
                response = requests.put(dapr_url, json=data, headers=req_headers, timeout=10)
            elif method.upper() == "DELETE":
                response = requests.delete(dapr_url, headers=req_headers, timeout=10)
            else:
                logger.error(f"Unsupported HTTP method: {method}")
                return None

            if response.status_code in [200, 204]:
                logger.debug(f"Dapr call successful: {method} {endpoint}")
                return response
            else:
                logger.warning(f"Dapr call failed with status {response.status_code}, endpoint: {endpoint}")
                return None
        else:
            logger.warning(f"Dapr sidecar not available, skipping Dapr call to {endpoint}")
            return None
    except requests.exceptions.RequestException:
        logger.warning(f"Dapr sidecar not available, skipping Dapr call to {endpoint}")
        return None
    except Exception as e:
        logger.warning(f"Dapr unavailable for {endpoint}: {str(e)}")
        return None