Merge branch 'main' into queries-improvments

queries-improvments
Andrey Dolgolev 2022-04-04 15:01:07 +03:00
commit 8ab80f147d
10 zmienionych plików z 163 dodań i 145 usunięć

Wyświetl plik

@ -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"`
}

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)
}

Wyświetl plik

@ -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")

Wyświetl plik

@ -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" "$@"

Wyświetl plik

@ -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"

Wyświetl plik

@ -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>
</>
);

Wyświetl plik

@ -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>"

Wyświetl plik

@ -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,
};
};

Wyświetl plik

@ -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`,
});
};