Skip to content

Commit 1a09d73

Browse files
Merge pull request #14 from networkandcode/strands-newrelic-demo
Strands newrelic demo
2 parents 5babbd0 + 1014fbc commit 1a09d73

File tree

10 files changed

+2116
-0
lines changed

10 files changed

+2116
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
AWS_ACCESS_KEY_ID=""
2+
AWS_SECRET_ACCESS_KEY=""
3+
AWS_DEFAULT_REGION=us-west-2
4+
OTEL_EXPORTER_OTLP_ENDPOINT="https://otlp.nr-data.net"
5+
OTEL_EXPORTER_OTLP_HEADERS=api-key=
6+
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.12

strands-examples/strands-newrelic-demo/README.md

Whitespace-only changes.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import re
2+
3+
from mcp import stdio_client, StdioServerParameters
4+
from strands import Agent
5+
from strands.tools.mcp import MCPClient
6+
import streamlit as st
7+
8+
from set_telemetry import set_telemetry
9+
import uuid
10+
11+
def remove_html_tags(text_with_html):
12+
text_with_out_html = re.sub(r"<[^>]+>", "", text_with_html)
13+
return text_with_out_html
14+
15+
async def stream_result(stream):
16+
result = ""
17+
placeholder = st.empty()
18+
async for chunk in stream:
19+
if 'data' in chunk:
20+
result += chunk['data']
21+
result = remove_html_tags(result)
22+
placeholder.write(result)
23+
24+
25+
class KubernetesMCPAgent:
26+
def __init__(self):
27+
set_telemetry()
28+
server_params = {
29+
"command": "npx",
30+
"args": [
31+
"-y",
32+
"kubernetes-mcp-server@latest"
33+
],
34+
"env": {
35+
"KUBECONFIG": "k3s.yaml"
36+
}
37+
}
38+
39+
self.stdio_mcp_client = MCPClient(lambda: stdio_client(
40+
StdioServerParameters(
41+
**server_params
42+
)
43+
))
44+
45+
with self.stdio_mcp_client:
46+
# Get the tools from the MCP server
47+
tools = self.stdio_mcp_client.list_tools_sync()
48+
49+
# Create an agent with these tools
50+
self.agent = Agent(
51+
callback_handler=None,
52+
model="us.amazon.nova-micro-v1:0",
53+
tools=tools,
54+
trace_attributes={
55+
"session.id": str(uuid.uuid4()),
56+
},
57+
)
58+
59+
60+
async def send_prompt(self, prompt):
61+
with self.stdio_mcp_client:
62+
stream = self.agent.stream_async(prompt)
63+
await stream_result(stream)
64+
65+
66+
kubernetes_mcp_agent = KubernetesMCPAgent()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import asyncio
2+
3+
import streamlit as st
4+
5+
from k8s_mcp_agent import kubernetes_mcp_agent
6+
7+
async def main():
8+
st.title("Kubernetes MCP App")
9+
10+
if prompt := st.chat_input("Chat with the Kubernetes API through MCP"):
11+
with st.chat_message("user"):
12+
st.write(prompt)
13+
with st.chat_message("assistant"):
14+
await kubernetes_mcp_agent.send_prompt(prompt)
15+
16+
asyncio.run(main())
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def main():
2+
print("Hello from strands-langfuse-demo!")
3+
4+
5+
if __name__ == "__main__":
6+
main()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[project]
2+
name = "strands-newrelic-demo"
3+
version = "0.1.0"
4+
description = "Add your description here"
5+
readme = "README.md"
6+
requires-python = ">=3.12"
7+
dependencies = [
8+
"strands-agents[otel]>=1.7.1",
9+
"streamlit>=1.49.1",
10+
]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from dotenv import load_dotenv
2+
from strands.telemetry import StrandsTelemetry
3+
4+
def set_telemetry():
5+
load_dotenv()
6+
strands_telemetry = StrandsTelemetry()
7+
strands_telemetry.setup_otlp_exporter()

0 commit comments

Comments
 (0)