Merge branch 'main' into customized-dashboard

pull/477/head
Andrey Dolgolev 2021-12-09 19:23:25 +02:00
commit 099426bd68
5 zmienionych plików z 206 dodań i 80 usunięć

Wyświetl plik

@ -8,7 +8,7 @@ import logging
import time import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
from enum import Enum from enum import Enum
from typing import Any, Callable, Dict, List from typing import Any, Callable, Dict, List, Union
from uuid import UUID from uuid import UUID
import boto3 # type: ignore import boto3 # type: ignore
@ -417,6 +417,46 @@ def get_unique_address(
) )
def get_blocks_state(
db_session: Session, blockchain_type: AvailableBlockchainType
) -> Dict[str, int]:
"""
Generate meta information about
"""
blocks_state = {
"latest_stored_block": 0,
"latest_labelled_block": 0,
"earliest_labelled_block": 0,
}
label_model = get_label_model(blockchain_type)
transactions_model = get_transaction_model(blockchain_type)
max_transactions_number = db_session.query(
func.max(transactions_model.block_number).label("block_number")
).scalar()
result = (
db_session.query(
func.min(label_model.block_number).label("earliest_labelled_block"),
func.max(label_model.block_number).label("latest_labelled_block"),
max_transactions_number,
).filter(label_model.label == CRAWLER_LABEL)
).one_or_none()
if result:
earliest_labelled_block, latest_labelled_block, latest_stored_block = result
blocks_state = {
"latest_stored_block": latest_stored_block,
"latest_labelled_block": latest_labelled_block,
"earliest_labelled_block": earliest_labelled_block,
}
return blocks_state
def generate_list_of_names( def generate_list_of_names(
type: str, subscription_filters: Dict[str, Any], read_abi: bool, abi_json: Any type: str, subscription_filters: Dict[str, Any], read_abi: bool, abi_json: Any
): ):
@ -583,7 +623,7 @@ def stats_generate_handler(args: argparse.Namespace):
continue continue
subscriptions_count += 1 subscriptions_count += 1
s3_data_object = {} s3_data_object: Dict[str, Any] = {}
extention_data = [] extention_data = []
@ -685,6 +725,10 @@ def stats_generate_handler(args: argparse.Namespace):
} }
) )
current_blocks_state = get_blocks_state(
db_session=db_session, blockchain_type=blockchain_type
)
for timescale in [timescale.value for timescale in TimeScale]: for timescale in [timescale.value for timescale in TimeScale]:
start_date = ( start_date = (
@ -693,6 +737,8 @@ def stats_generate_handler(args: argparse.Namespace):
print(f"Timescale: {timescale}") print(f"Timescale: {timescale}")
s3_data_object["blocks_state"] = current_blocks_state
s3_data_object["web3_metric"] = extention_data s3_data_object["web3_metric"] = extention_data
functions_calls_data = generate_data( functions_calls_data = generate_data(

Wyświetl plik

@ -1,11 +1,14 @@
import React from "react"; import React, { useContext } from "react";
import { useStatus } from "../../src/core/hooks"; import { useStatus } from "../../src/core/hooks";
import { Heading, Text, Flex, Spacer, chakra, Spinner } from "@chakra-ui/react"; import { Heading, Text, Flex, Spacer, chakra, Spinner } from "@chakra-ui/react";
import { getLayout, getLayoutProps } from "../../src/layouts/InfoPageLayout"; import { getLayout, getLayoutProps } from "../../src/layouts/InfoPageLayout";
import UserContext from "../../src/core/providers/UserProvider/context";
const Status = () => { const Status = () => {
const user = useContext(UserContext);
const healthyStatusText = "Available"; const healthyStatusText = "Available";
const downStatusText = "Unavailable"; const downStatusText = "Unavailable";
const unauthorizedText = "Please login";
const healthyStatusColor = "green.900"; const healthyStatusColor = "green.900";
const downStatusColor = "red.600"; const downStatusColor = "red.600";
@ -14,14 +17,43 @@ const Status = () => {
}; };
const { const {
apiServerStatusCache, serverListStatusCache,
ethereumClusterServerStatusCache,
gethStatusCache,
crawlersStatusCache, crawlersStatusCache,
dbServerStatusCache, dbServerStatusCache,
latestBlockDBStatusCache, latestBlockDBStatusCache,
} = useStatus(); } = useStatus();
const moonstreamapiStatus = serverListStatusCache?.data?.filter(
(i) => i.status.name === "moonstreamapi"
)[0];
const moonstreamCrawlersStatus = serverListStatusCache?.data?.filter(
(i) => i.status.name === "moonstream_crawlers"
)[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"
)[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"
)[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_geth"
)[0];
const nodePolygonBStatus = serverListStatusCache?.data?.filter(
(i) => i.status.name === "node_polygon_b"
)[0];
const nodePolygonBGeth = serverListStatusCache?.data?.filter(
(i) => i.status.name === "node_polygon_b_geth"
)[0];
const StatusRow = (props) => { const StatusRow = (props) => {
return ( return (
<Flex mb={3}> <Flex mb={3}>
@ -45,50 +77,44 @@ const Status = () => {
{`Status page`} {`Status page`}
</Heading> </Heading>
<chakra.span pl={2} px={12} py={2} width="400px"> <chakra.span pl={2} px={12} py={2} width="400px">
<StatusRow title="Backend server" cache={apiServerStatusCache}> <StatusRow title="Backend server" cache={serverListStatusCache}>
<Text <Text
color={ color={
apiServerStatusCache?.data?.status == "ok" moonstreamapiStatus?.status.body.status == "ok"
? healthyStatusColor ? healthyStatusColor
: downStatusColor : downStatusColor
} }
> >
{apiServerStatusCache?.data?.status == "ok" {moonstreamapiStatus?.status.body.status == "ok"
? healthyStatusText ? healthyStatusText
: downStatusText} : downStatusText}
</Text> </Text>
</StatusRow> </StatusRow>
<br /> <br />
<StatusRow
title="Crawlers server" <StatusRow title="Crawlers server" cache={crawlersStatusCache}>
cache={ethereumClusterServerStatusCache}
>
<Text <Text
color={ color={
ethereumClusterServerStatusCache?.data?.status == "ok" moonstreamCrawlersStatus?.status.body.status == "ok"
? healthyStatusColor ? healthyStatusColor
: downStatusColor : downStatusColor
} }
> >
{ethereumClusterServerStatusCache?.data {moonstreamCrawlersStatus?.status.body.status == "ok"
? healthyStatusText ? healthyStatusText
: downStatusText} : downStatusText}
</Text> </Text>
</StatusRow> </StatusRow>
<StatusRow title="Latest block in Geth" cache={gethStatusCache}>
<Text>
{gethStatusCache?.data?.current_block
? gethStatusCache.data.current_block
: 0}
</Text>
</StatusRow>
<StatusRow title="Txpool latest record ts" cache={crawlersStatusCache}> <StatusRow title="Txpool latest record ts" cache={crawlersStatusCache}>
<Text> <Text>
{crawlersStatusCache?.data?.ethereum_txpool_timestamp {!user
? shortTimestamp( ? crawlersStatusCache?.data?.ethereum_txpool_timestamp
crawlersStatusCache?.data?.ethereum_txpool_timestamp ? shortTimestamp(
) crawlersStatusCache?.data?.ethereum_txpool_timestamp
: downStatusText} )
: downStatusText
: unauthorizedText}
</Text> </Text>
</StatusRow> </StatusRow>
<StatusRow <StatusRow
@ -96,15 +122,104 @@ const Status = () => {
cache={crawlersStatusCache} cache={crawlersStatusCache}
> >
<Text> <Text>
{crawlersStatusCache?.data?.ethereum_trending_timestamp {!user
? shortTimestamp( ? crawlersStatusCache?.data?.ethereum_trending_timestamp
crawlersStatusCache?.data?.ethereum_trending_timestamp ? shortTimestamp(
) crawlersStatusCache?.data?.ethereum_trending_timestamp
: downStatusText} )
: downStatusText
: unauthorizedText}
</Text> </Text>
</StatusRow> </StatusRow>
<br /> <br />
<StatusRow title="Node Ethereum A" cache={serverListStatusCache}>
<Text
color={
nodeEthereumAStatus?.status.body.status == "ok"
? healthyStatusColor
: downStatusColor
}
>
{nodeEthereumAStatus?.status.body.status == "ok"
? healthyStatusText
: downStatusText}
</Text>
</StatusRow>
<StatusRow title="Current block" cache={serverListStatusCache}>
<Text>
{nodeEthereumAGeth?.status.body.current_block
? nodeEthereumAGeth.status.body.current_block
: 0}
</Text>
</StatusRow>
<br />
<StatusRow title="Node Ethereum B" cache={serverListStatusCache}>
<Text
color={
nodeEthereumBStatus?.status.body.status == "ok"
? healthyStatusColor
: downStatusColor
}
>
{nodeEthereumBStatus?.status.body.status == "ok"
? healthyStatusText
: downStatusText}
</Text>
</StatusRow>
<StatusRow title="Current block" cache={serverListStatusCache}>
<Text>
{nodeEthereumBGeth?.status.body.current_block
? nodeEthereumBGeth.status.body.current_block
: 0}
</Text>
</StatusRow>
<br />
<StatusRow title="Node Polygon A" cache={serverListStatusCache}>
<Text
color={
nodePolygonAStatus?.status.body.status == "ok"
? healthyStatusColor
: downStatusColor
}
>
{nodePolygonAStatus?.status.body.status == "ok"
? healthyStatusText
: downStatusText}
</Text>
</StatusRow>
<StatusRow title="Current block" cache={serverListStatusCache}>
<Text>
{nodePolygonAGeth?.status.body.current_block
? nodePolygonAGeth.status.body.current_block
: 0}
</Text>
</StatusRow>
<br />
<StatusRow title="Node Polygon B" cache={serverListStatusCache}>
<Text
color={
nodePolygonBStatus?.status.body.status == "ok"
? healthyStatusColor
: downStatusColor
}
>
{nodePolygonBStatus?.status.body.status == "ok"
? healthyStatusText
: downStatusText}
</Text>
</StatusRow>
<StatusRow title="Current block" cache={serverListStatusCache}>
<Text>
{nodePolygonBGeth?.status.body.current_block
? nodePolygonBGeth.status.body.current_block
: 0}
</Text>
</StatusRow>
<br />
<StatusRow title="Database server" cache={dbServerStatusCache}> <StatusRow title="Database server" cache={dbServerStatusCache}>
<Text <Text
color={ color={

Wyświetl plik

@ -1,10 +1,8 @@
export NEXT_PUBLIC_MIXPANEL_TOKEN="<YOUR MIXPANEL TOKEN HERE>" export NEXT_PUBLIC_MIXPANEL_TOKEN="<YOUR MIXPANEL TOKEN HERE>"
export NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="<stripe publishable key>" export NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="<stripe publishable key>"
export NEXT_PUBLIC_MOONSTREAM_API_URL="<moonstream_api_url>" export NEXT_PUBLIC_BUGOUT_STATUS_URL=https://status.moonstream.to
export NEXT_PUBLIC_MOONSTREAM_ETHEREUM_CLUSTER_URL="<moonstream_crawlers_url>" export NEXT_PUBLIC_MOONSTREAM_API_URL=https://api.moonstream.to
export NEXT_PUBLIC_MOONSTREAM_DB_URL="<moonstream_db_url>" export NEXT_PUBLIC_MOONSTREAM_DB_URL=https://pg.moonstream.to
export NEXT_PUBLIC_SIMIOTICS_AUTH_URL=https://auth.bugout.dev export NEXT_PUBLIC_SIMIOTICS_AUTH_URL=https://auth.bugout.dev
export NEXT_PUBLIC_SIMIOTICS_JOURNALS_URL=https://spire.bugout.dev export NEXT_PUBLIC_SIMIOTICS_JOURNALS_URL=https://spire.bugout.dev
export NEXT_PUBLIC_FRONTEND_VERSION="<frontend_version_number>"% export NEXT_PUBLIC_FRONTEND_VERSION="<frontend_version_number>"

Wyświetl plik

@ -3,16 +3,8 @@ import { queryCacheProps } from "./hookCommon";
import { StatusService } from "../../core/services"; import { StatusService } from "../../core/services";
const useStatus = () => { const useStatus = () => {
const getAPIServerStatus = async () => { const getServerListStatus = async () => {
const response = await StatusService.apiServerStatus(); const response = await StatusService.serverListStatus();
return response.data;
};
const getEthereumClusterServerStatus = async () => {
const response = await StatusService.ethereumClusterServerStatus();
return response.data;
};
const getGethStatus = async () => {
const response = await StatusService.gethStatus();
return response.data; return response.data;
}; };
const getCrawlersStatus = async () => { const getCrawlersStatus = async () => {
@ -28,22 +20,14 @@ const useStatus = () => {
return response.data; return response.data;
}; };
const apiServerStatusCache = useQuery("apiServer", getAPIServerStatus, { const serverListStatusCache = useQuery(
...queryCacheProps, "serverListStatus",
retry: 0, getServerListStatus,
});
const ethereumClusterServerStatusCache = useQuery(
"ethereumClusterServer",
getEthereumClusterServerStatus,
{ {
...queryCacheProps, ...queryCacheProps,
retry: 0, retry: 0,
} }
); );
const gethStatusCache = useQuery("geth", getGethStatus, {
...queryCacheProps,
retry: 0,
});
const crawlersStatusCache = useQuery("crawlers", getCrawlersStatus, { const crawlersStatusCache = useQuery("crawlers", getCrawlersStatus, {
...queryCacheProps, ...queryCacheProps,
retry: 0, retry: 0,
@ -62,9 +46,7 @@ const useStatus = () => {
); );
return { return {
apiServerStatusCache, serverListStatusCache,
ethereumClusterServerStatusCache,
gethStatusCache,
crawlersStatusCache, crawlersStatusCache,
dbServerStatusCache, dbServerStatusCache,
latestBlockDBStatusCache, latestBlockDBStatusCache,

Wyświetl plik

@ -1,28 +1,13 @@
import { http } from "../utils"; 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 API_URL = process.env.NEXT_PUBLIC_MOONSTREAM_API_URL;
const DB_URL = process.env.NEXT_PUBLIC_MOONSTREAM_DB_URL; const DB_URL = process.env.NEXT_PUBLIC_MOONSTREAM_DB_URL;
const ETHEREUM_CLUSTER_URL =
process.env.NEXT_PUBLIC_MOONSTREAM_ETHEREUM_CLUSTER_URL;
export const apiServerStatus = () => { export const serverListStatus = () => {
return http({ return http({
method: "GET", method: "GET",
url: `${API_URL}/ping`, url: `${BUGOUT_STATUS_URL}`,
});
};
export const ethereumClusterServerStatus = () => {
return http({
method: "GET",
url: `${ETHEREUM_CLUSTER_URL}/ping`,
});
};
export const gethStatus = () => {
return http({
method: "GET",
url: `${ETHEREUM_CLUSTER_URL}/status`,
}); });
}; };