kopia lustrzana https://github.com/bugout-dev/moonstream
commit
0594b63521
|
@ -4,6 +4,7 @@ type PingResponse struct {
|
|||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
type BlockNumberResponse struct {
|
||||
BlockNumber uint64 `json:"block_number"`
|
||||
type BlockLatestResponse struct {
|
||||
EthereumBlockLatest uint64 `json:"ethereum_block_latest"`
|
||||
PolygonBlockLatest uint64 `json:"polygon_block_latest"`
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
)
|
||||
|
||||
func InitDB() *sql.DB {
|
||||
db, err := sql.Open("postgres", settings.MOONSTREAM_DB_URI)
|
||||
db, err := sql.Open("postgres", settings.MOONSTREAM_DB_URI_READ_ONLY)
|
||||
if err != nil {
|
||||
// DSN parse error or another initialization error
|
||||
log.Fatal(err)
|
||||
|
|
|
@ -17,18 +17,37 @@ func pingRoute(w http.ResponseWriter, req *http.Request) {
|
|||
func (es *extendedServer) blocksLatestRoute(w http.ResponseWriter, req *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
var latestBlock BlockNumberResponse
|
||||
row := es.db.QueryRow("SELECT block_number FROM ethereum_blocks ORDER BY block_number DESC LIMIT 1")
|
||||
err := row.Scan(&latestBlock.BlockNumber)
|
||||
var blockNumbers []uint64
|
||||
var blockLatest BlockLatestResponse
|
||||
rows, err := es.db.Query(`(SELECT block_number FROM ethereum_blocks ORDER BY block_number DESC LIMIT 1)
|
||||
UNION
|
||||
(SELECT block_number FROM polygon_blocks ORDER BY block_number DESC LIMIT 1)`)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
http.Error(w, "Row not found", http.StatusNotFound)
|
||||
} else {
|
||||
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
||||
}
|
||||
log.Printf("An error occurred during sql operation: %s", err)
|
||||
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
json.NewEncoder(w).Encode(latestBlock)
|
||||
for rows.Next() {
|
||||
var bn uint64
|
||||
err := rows.Scan(&bn)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
http.Error(w, "Row not found", http.StatusNotFound)
|
||||
} else {
|
||||
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
||||
}
|
||||
log.Printf("An error occurred during scan sql response: %s", err)
|
||||
return
|
||||
}
|
||||
blockNumbers = append(blockNumbers, bn)
|
||||
}
|
||||
|
||||
blockLatest = BlockLatestResponse{
|
||||
EthereumBlockLatest: blockNumbers[0],
|
||||
PolygonBlockLatest: blockNumbers[1],
|
||||
}
|
||||
|
||||
json.NewEncoder(w).Encode(blockLatest)
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
// Database configs
|
||||
var MOONSTREAM_DB_MAX_IDLE_CONNS int = 30
|
||||
var MOONSTREAM_DB_CONN_MAX_LIFETIME = 30 * time.Minute
|
||||
var MOONSTREAM_DB_URI = os.Getenv("MOONSTREAM_DB_URI")
|
||||
var MOONSTREAM_DB_URI_READ_ONLY = os.Getenv("MOONSTREAM_DB_URI_READ_ONLY")
|
||||
|
||||
// CORS
|
||||
var MOONSTREAM_CORS_ALLOWED_ORIGINS = os.Getenv("MOONSTREAM_CORS_ALLOWED_ORIGINS")
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
# Expects access to Python environment with the requirements for this project installed.
|
||||
# Compile application and run with provided arguments
|
||||
set -e
|
||||
|
||||
MOONSTREAM_DB_SERVER_HOST="${MOONSTREAM_DB_SERVER_HOST:-0.0.0.0}"
|
||||
MOONSTREAM_DB_SERVER_PORT="${MOONSTREAM_DB_SERVER_PORT:-8080}"
|
||||
PROGRAM_NAME="moonstreamdb"
|
||||
|
||||
go run main.go -host "${MOONSTREAM_DB_SERVER_HOST}" -port "${MOONSTREAM_DB_SERVER_PORT}"
|
||||
go build -o "$PROGRAM_NAME" .
|
||||
|
||||
./"$PROGRAM_NAME" "$@"
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export MOONSTREAM_DB_URI="postgresql://<username>:<password>@<db_host>:<db_port>/<db_name>"
|
||||
export MOONSTREAM_DB_URI_READ_ONLY="postgresql://<username>:<password>@<db_host>:<db_port>/<db_name>"
|
||||
export MOONSTREAM_CORS_ALLOWED_ORIGINS="http://localhost:3000,https://moonstream.to,https://www.moonstream.to,https://alpha.moonstream.to"
|
||||
|
|
|
@ -18,40 +18,39 @@ const Status = () => {
|
|||
|
||||
const {
|
||||
serverListStatusCache,
|
||||
crawlersStatusCache,
|
||||
dbServerStatusCache,
|
||||
latestBlockDBStatusCache,
|
||||
} = useStatus();
|
||||
|
||||
console.log(serverListStatusCache?.data);
|
||||
|
||||
const moonstreamapiStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "moonstreamapi"
|
||||
(i) => i.name === "moonstream_api"
|
||||
)[0];
|
||||
const moonstreamCrawlersStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "moonstream_crawlers"
|
||||
(i) => i.name === "moonstream_crawlers"
|
||||
)[0];
|
||||
const nodeBalacerStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.name === "moonstream_node_balancer"
|
||||
)[0];
|
||||
const nodeEthereumAStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_ethereum_a"
|
||||
)[0];
|
||||
const nodeEthereumAGeth = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_ethereum_a_geth"
|
||||
(i) => i.name === "node_ethereum_a"
|
||||
)[0];
|
||||
const nodeEthereumBStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_ethereum_b"
|
||||
)[0];
|
||||
const nodeEthereumBGeth = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_ethereum_b_geth"
|
||||
(i) => i.name === "node_ethereum_b"
|
||||
)[0];
|
||||
const nodePolygonAStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_polygon_a"
|
||||
)[0];
|
||||
const nodePolygonAGeth = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_polygon_a_bor"
|
||||
(i) => i.name === "node_polygon_a"
|
||||
)[0];
|
||||
const nodePolygonBStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_polygon_b"
|
||||
(i) => i.name === "node_polygon_b"
|
||||
)[0];
|
||||
const nodePolygonBGeth = serverListStatusCache?.data?.filter(
|
||||
(i) => i.status.name === "node_polygon_b_bor"
|
||||
const dbServerStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.name === "moonstream_database"
|
||||
)[0];
|
||||
const dbReplicaServerStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.name === "moonstream_database_replica"
|
||||
)[0];
|
||||
const unimLeaderboardStatus = serverListStatusCache?.data?.filter(
|
||||
(i) => i.name === "unim_leaderboard"
|
||||
)[0];
|
||||
|
||||
const StatusRow = (props) => {
|
||||
|
@ -80,12 +79,12 @@ const Status = () => {
|
|||
<StatusRow title="Backend server" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
moonstreamapiStatus?.status.body.status == "ok"
|
||||
moonstreamapiStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{moonstreamapiStatus?.status.body.status == "ok"
|
||||
{moonstreamapiStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
|
@ -93,42 +92,33 @@ const Status = () => {
|
|||
|
||||
<br />
|
||||
|
||||
<StatusRow title="Crawlers server" cache={crawlersStatusCache}>
|
||||
<StatusRow title="Crawlers server" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
moonstreamCrawlersStatus?.status.body.status == "ok"
|
||||
moonstreamCrawlersStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{moonstreamCrawlersStatus?.status.body.status == "ok"
|
||||
{moonstreamCrawlersStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow title="Txpool latest record ts" cache={crawlersStatusCache}>
|
||||
<Text>
|
||||
{!user
|
||||
? crawlersStatusCache?.data?.ethereum_txpool_timestamp
|
||||
? shortTimestamp(
|
||||
crawlersStatusCache?.data?.ethereum_txpool_timestamp
|
||||
)
|
||||
: downStatusText
|
||||
: unauthorizedText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow
|
||||
title="Trending latest record ts"
|
||||
cache={crawlersStatusCache}
|
||||
>
|
||||
<Text>
|
||||
{!user
|
||||
? crawlersStatusCache?.data?.ethereum_trending_timestamp
|
||||
? shortTimestamp(
|
||||
crawlersStatusCache?.data?.ethereum_trending_timestamp
|
||||
)
|
||||
: downStatusText
|
||||
: unauthorizedText}
|
||||
|
||||
<br />
|
||||
|
||||
<StatusRow title="Node balancer server" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
nodeBalacerStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{nodeBalacerStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
||||
|
@ -137,20 +127,20 @@ const Status = () => {
|
|||
<StatusRow title="Node Ethereum A" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
nodeEthereumAStatus?.status.body.status == "ok"
|
||||
nodeEthereumAStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{nodeEthereumAStatus?.status.body.status == "ok"
|
||||
{nodeEthereumAStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow title="Current block" cache={serverListStatusCache}>
|
||||
<Text>
|
||||
{nodeEthereumAGeth?.status.body.current_block
|
||||
? nodeEthereumAGeth.status.body.current_block
|
||||
{nodeEthereumAStatus?.response?.current_block
|
||||
? nodeEthereumAStatus.response.current_block
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
@ -158,20 +148,20 @@ const Status = () => {
|
|||
<StatusRow title="Node Ethereum B" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
nodeEthereumBStatus?.status.body.status == "ok"
|
||||
nodeEthereumBStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{nodeEthereumBStatus?.status.body.status == "ok"
|
||||
{nodeEthereumBStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow title="Current block" cache={serverListStatusCache}>
|
||||
<Text>
|
||||
{nodeEthereumBGeth?.status.body.current_block
|
||||
? nodeEthereumBGeth.status.body.current_block
|
||||
{nodeEthereumBStatus?.response?.current_block
|
||||
? nodeEthereumBStatus.response.current_block
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
@ -179,20 +169,20 @@ const Status = () => {
|
|||
<StatusRow title="Node Polygon A" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
nodePolygonAStatus?.status.body.status == "ok"
|
||||
nodePolygonAStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{nodePolygonAStatus?.status.body.status == "ok"
|
||||
{nodePolygonAStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow title="Current block" cache={serverListStatusCache}>
|
||||
<Text>
|
||||
{nodePolygonAGeth?.status.body.current_block
|
||||
? nodePolygonAGeth.status.body.current_block
|
||||
{nodePolygonAStatus?.response?.current_block
|
||||
? nodePolygonAStatus.response.current_block
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
@ -200,49 +190,111 @@ const Status = () => {
|
|||
<StatusRow title="Node Polygon B" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
nodePolygonBStatus?.status.body.status == "ok"
|
||||
nodePolygonBStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{nodePolygonBStatus?.status.body.status == "ok"
|
||||
{nodePolygonBStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow title="Current block" cache={serverListStatusCache}>
|
||||
<Text>
|
||||
{nodePolygonBGeth?.status.body.current_block
|
||||
? nodePolygonBGeth.status.body.current_block
|
||||
{nodePolygonBStatus?.response?.current_block
|
||||
? nodePolygonBStatus.response.current_block
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
||||
<br />
|
||||
|
||||
<StatusRow title="Database server" cache={dbServerStatusCache}>
|
||||
<StatusRow title="Database server" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
dbServerStatusCache?.data?.status == "ok"
|
||||
dbServerStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{dbServerStatusCache?.data?.status == "ok"
|
||||
{dbServerStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow
|
||||
title="Latest block in Database"
|
||||
cache={latestBlockDBStatusCache}
|
||||
title="Ethereum latest block"
|
||||
cache={serverListStatusCache}
|
||||
>
|
||||
<Text>
|
||||
{latestBlockDBStatusCache?.data?.block_number
|
||||
? latestBlockDBStatusCache.data.block_number
|
||||
{dbServerStatus?.response?.ethereum_block_latest
|
||||
? dbServerStatus.response.ethereum_block_latest
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow
|
||||
title="Polygon latest block"
|
||||
cache={serverListStatusCache}
|
||||
>
|
||||
<Text>
|
||||
{dbServerStatus?.response?.polygon_block_latest
|
||||
? dbServerStatus.response.polygon_block_latest
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
||||
<br />
|
||||
|
||||
<StatusRow title="Database replica server" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
dbReplicaServerStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{dbReplicaServerStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow
|
||||
title="Ethereum latest block"
|
||||
cache={serverListStatusCache}
|
||||
>
|
||||
<Text>
|
||||
{dbReplicaServerStatus?.response?.ethereum_block_latest
|
||||
? dbReplicaServerStatus.response.ethereum_block_latest
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
<StatusRow
|
||||
title="Polygon latest block"
|
||||
cache={serverListStatusCache}
|
||||
>
|
||||
<Text>
|
||||
{dbReplicaServerStatus?.response?.polygon_block_latest
|
||||
? dbReplicaServerStatus.response.polygon_block_latest
|
||||
: 0}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
|
||||
<br />
|
||||
|
||||
<StatusRow title="Unim Leaderboard server" cache={serverListStatusCache}>
|
||||
<Text
|
||||
color={
|
||||
unimLeaderboardStatus?.status_code == 200
|
||||
? healthyStatusColor
|
||||
: downStatusColor
|
||||
}
|
||||
>
|
||||
{unimLeaderboardStatus?.status_code == 200
|
||||
? healthyStatusText
|
||||
: downStatusText}
|
||||
</Text>
|
||||
</StatusRow>
|
||||
</chakra.span>
|
||||
</>
|
||||
);
|
||||
|
|
|
@ -2,7 +2,6 @@ export NEXT_PUBLIC_MIXPANEL_TOKEN="<YOUR MIXPANEL TOKEN HERE>"
|
|||
export NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="<stripe publishable key>"
|
||||
export NEXT_PUBLIC_BUGOUT_STATUS_URL=https://status.moonstream.to
|
||||
export NEXT_PUBLIC_MOONSTREAM_API_URL=https://api.moonstream.to
|
||||
export NEXT_PUBLIC_MOONSTREAM_DB_URL=https://pg.moonstream.to
|
||||
export NEXT_PUBLIC_SIMIOTICS_AUTH_URL=https://auth.bugout.dev
|
||||
export NEXT_PUBLIC_SIMIOTICS_JOURNALS_URL=https://spire.bugout.dev
|
||||
export NEXT_PUBLIC_FRONTEND_VERSION="<frontend_version_number>"
|
||||
|
|
|
@ -7,18 +7,6 @@ const useStatus = () => {
|
|||
const response = await StatusService.serverListStatus();
|
||||
return response.data;
|
||||
};
|
||||
const getCrawlersStatus = async () => {
|
||||
const response = await StatusService.crawlersStatus();
|
||||
return response.data;
|
||||
};
|
||||
const getDBServerStatus = async () => {
|
||||
const response = await StatusService.dbServerStatus();
|
||||
return response.data;
|
||||
};
|
||||
const getLatestBlockDBStatus = async () => {
|
||||
const response = await StatusService.latestBlockDBStatus();
|
||||
return response.data;
|
||||
};
|
||||
|
||||
const serverListStatusCache = useQuery(
|
||||
"serverListStatus",
|
||||
|
@ -28,28 +16,9 @@ const useStatus = () => {
|
|||
retry: 0,
|
||||
}
|
||||
);
|
||||
const crawlersStatusCache = useQuery("crawlers", getCrawlersStatus, {
|
||||
...queryCacheProps,
|
||||
retry: 0,
|
||||
});
|
||||
const dbServerStatusCache = useQuery("dbServer", getDBServerStatus, {
|
||||
...queryCacheProps,
|
||||
retry: 0,
|
||||
});
|
||||
const latestBlockDBStatusCache = useQuery(
|
||||
"latestBlockDB",
|
||||
getLatestBlockDBStatus,
|
||||
{
|
||||
...queryCacheProps,
|
||||
retry: 0,
|
||||
}
|
||||
);
|
||||
|
||||
return {
|
||||
serverListStatusCache,
|
||||
crawlersStatusCache,
|
||||
dbServerStatusCache,
|
||||
latestBlockDBStatusCache,
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -1,33 +1,10 @@
|
|||
import { http } from "../utils";
|
||||
|
||||
const BUGOUT_STATUS_URL = process.env.NEXT_PUBLIC_BUGOUT_STATUS_URL;
|
||||
const API_URL = process.env.NEXT_PUBLIC_MOONSTREAM_API_URL;
|
||||
const DB_URL = process.env.NEXT_PUBLIC_MOONSTREAM_DB_URL;
|
||||
|
||||
export const serverListStatus = () => {
|
||||
return http({
|
||||
method: "GET",
|
||||
url: `${BUGOUT_STATUS_URL}`,
|
||||
});
|
||||
};
|
||||
|
||||
export const crawlersStatus = () => {
|
||||
return http({
|
||||
method: "GET",
|
||||
url: `${API_URL}/status`,
|
||||
});
|
||||
};
|
||||
|
||||
export const dbServerStatus = () => {
|
||||
return http({
|
||||
method: "GET",
|
||||
url: `${DB_URL}/ping`,
|
||||
});
|
||||
};
|
||||
|
||||
export const latestBlockDBStatus = () => {
|
||||
return http({
|
||||
method: "GET",
|
||||
url: `${DB_URL}/block/latest`,
|
||||
url: `${BUGOUT_STATUS_URL}/status`,
|
||||
});
|
||||
};
|
||||
|
|
Ładowanie…
Reference in New Issue